คำสั่ง Linux และทักษะเชลล์
grep: การค้นหา Linux อย่างมืออาชีพ
grep รอดพ้นจากการรีเฟรช toolchain ทุกครั้งเพราะงานไม่เคยเปลี่ยนแปลง: ค้นหาบรรทัดที่สำคัญภายในข้อความที่ขยายเร็วกว่าใครก็ตามที่จะล้างข้อมูล พลังที่แท้จริงของมันคือคำศัพท์แฟล็กที่เปลี่ยนการค้นหาให้เป็นคำตอบ: บริบทโดยรอบ รายการชื่อไฟล์ การจับคู่แบบกลับด้าน และโค้ดทางออกที่เชลล์สคริปต์สามารถแยกย่อยได้ เมื่อเซิร์ฟเวอร์ทำงานผิดปกติ การสอบสวนจะเริ่มต้นด้วย grep และบ่อยเกินกว่าใครจะยอมรับ การสืบสวนก็จะจบลงตรงนั้นเช่นกัน
ประเด็นสำคัญ
- ค้นหาซ้ำโดยมีวัตถุประสงค์: grep -rni 'fail2ban' /var/log --include='*.log' ข้ามไบนารีและไฟล์บีบอัดที่บีบอัดด้วยตัวเอง grep -r over เปล่า /var/log สอนบทเรียนนั้นอย่างช้าๆ
- บริบททำให้การแข่งขันสามารถอ่านได้: -A 3 แสดงบรรทัดหลัง, -B 3 ก่อน, -C 5 ทั้งคู่; -l แสดงรายการเฉพาะชื่อไฟล์ -c นับรายการที่ตรงกันต่อไฟล์ และ -L กลับรายการเป็นสิ่งที่ขาดหายไป
- รหัสทางออกเป็นส่วนหนึ่งของสัญญา: 0 หมายถึงตรงกัน 1 หมายถึงไม่ตรงกัน 2 หมายถึงข้อผิดพลาด สคริปต์ที่รัน grep -q และไม่สนใจว่าความแตกต่างนั้นถือว่าความสำเร็จและความเงียบเหมือนกัน
- ไฟล์ลูกโซ่แสดงรายการ null อย่างปลอดภัย: grep -rlZ 'ssl_protocols' /etc/nginx --include='*.conf' | xargs -0 -r ls -l; วางการจับคู่ Z และ -0 และชื่อไฟล์แรกที่มีช่องว่างจะทำให้ไปป์ไลน์แตก
- ใช้ -E เป็นระดับ regex เริ่มต้นสำหรับการสลับที่อ่านได้ และเข้าถึง -P (lookarounds, \d คลาส) เฉพาะเมื่อคุณยอมรับว่าเป็นส่วนขยาย GNU grep BSD จะไม่ดำเนินการ
- -F ถือว่ารูปแบบเป็นข้อความตามตัวอักษร: เร็วขึ้น และมีภูมิคุ้มกันต่อเมตาคาแรคเตอร์ regex ที่แอบเข้ามาจากตัวแปรที่วางตรงจากตั๋ว
- --exclude-dir=.git และ --exclude-dir=node_modules เก็บการค้นหาแบบเรียกซ้ำออกจากไดเร็กทอรีที่มีอยู่เพียงเพื่อทำให้การค้นหาช้าลง สะกดชื่ออย่างชัดเจนในสคริปต์เนื่องจากการขยายวงเล็บปีกกาเป็นความสะดวกสบายของ bash ไม่ใช่คุณสมบัติ grep
- แยกนิสัยออกจากกัน: --color=auto เพื่อความสะดวกในการโต้ตอบ ไม่มีสีในสคริปต์ (หลีกเลี่ยงลำดับบันทึกที่เสียหาย) และ -n (หมายเลขบรรทัด) เพื่อให้บุคคลถัดไปสามารถค้นหาจุดที่คุณวางได้
บันทึกจากหน้างาน
ครั้งหนึ่งฉันเคยวิ่ง grep -r เปล่าๆ ไปทั่วฟาร์มไม้ของลูกค้าตอนตี 2 และได้ความเงียบเป็นเวลาสี่สิบนาทีสำหรับปัญหาของฉัน การเพิ่ม --include='*.log' และ -l สิ้นสุดตั๋วทันที ตอนนี้นิสัยของโค้ดรวมและออกจะเข้ามาก่อนที่รูปแบบจะเกิดขึ้น
คำถามที่พบบ่อย
เหตุใดบางครั้ง grep จึงพิมพ์ 'ไฟล์ไบนารีที่ตรงกัน' แทนที่จะเป็นบรรทัดของฉัน
ไบต์ NUL ใกล้กับการจับคู่ทำให้ GNU grep ถือว่าไฟล์เป็นไบนารี่ เพิ่ม -a เพื่อบังคับโหมดข้อความ หรือ -I เพื่อข้ามไบนารีทั้งหมด ซึ่งเป็นค่าเริ่มต้นที่ถูกต้องในไดเร็กทอรีบันทึกแบบผสม
ฉันควรใช้ ripgrep แทนหรือไม่
ripgrep เร็วกว่าและข้ามไฟล์ไบนารี่และไฟล์ที่ซ่อนอยู่ตามค่าเริ่มต้น แต่ grep นั้นมีอยู่ในทุกกล่องที่คุณจะใช้ SSH รวมถึงอิมเมจช่วยเหลือด้วย เรียนรู้ grep ก่อน เข้าถึง rg ที่จะติดตั้ง
ฉันจะค้นหาบันทึกที่หมุนเวียนและบีบอัดได้อย่างไร
zgrep ค้นหาไฟล์ .gz อย่างโปร่งใสและ zstdgrep ครอบคลุมการหมุนของคอมเพรสเซอร์รุ่นใหม่ที่เปลี่ยนไป เข็มของเมื่อวานมักจะอยู่ในเข็มเหล่านั้น ดังนั้นเครื่องมือจึงถือเป็นสุขอนามัยขั้นพื้นฐาน
ฉันจะจับคู่คำแต่ไม่มีคำที่ยาวกว่านั้นได้อย่างไร
ใช้ -w สำหรับการจับคู่ทั้งคำ และ -x สำหรับการจับคู่แบบเต็มบรรทัด เมื่อรูปแบบต้องการส่วนของคำ คลาสอักขระเช่น [Ss]erver จะให้การควบคุมที่แม่นยำโดยไม่ทำให้ตัวพิมพ์แบนราบในทุกที่
Kinetikatech ช่วยเรื่อง คำสั่ง linux และทักษะเชลล์ ได้อย่างไร
เราเคยรับเรื่องแบบนี้มาเป็นร้อยครั้ง: คำสั่งและพฤติกรรมการเขียนสคริปต์ที่ตัดสินใจว่าผู้ดูแลระบบจะใช้งานเซิร์ฟเวอร์หรือต่อสู้กับเซิร์ฟเวอร์: ค้นหา แปลง ถ่ายโอน และดูแลข้อความและกระบวนการด้วยเครื่องมือที่อยู่ในทุกการติดตั้งฐาน กับ ความปลอดภัยเซิร์ฟเวอร์ Linuxและการจัดการเซิร์ฟเวอร์ คุณได้วงจรครบ ตั้งแต่เราประเมิน ลงมือทำ เฝ้าดูตลอดเวลา และรับเรื่องภายใน 30 นาทีเมื่อจำเป็น