ชื่อ กริป มาจากคำสั่ง ed (และ vim) g/re/p ซึ่งหมายถึงค้นหาทั่วโลกสำหรับนิพจน์ทั่วไปที่กำหนดและพิมพ์ (แสดง) เอาต์พุต
ปกติ นิพจน์
ยูทิลิตีอนุญาตให้ผู้ใช้ค้นหาไฟล์ข้อความสำหรับบรรทัดที่ตรงกับนิพจน์ทั่วไป ( regexp ). นิพจน์ทั่วไปคือสตริงการค้นหาที่ประกอบด้วยข้อความและอักขระพิเศษ 11 ตัวขึ้นไป ตัวอย่างง่ายๆ คือการจับคู่จุดเริ่มต้นของบรรทัด
ไฟล์ตัวอย่าง
รูปแบบพื้นฐานของ กริป อาจใช้เพื่อค้นหาข้อความธรรมดาภายในไฟล์หรือไฟล์ใดไฟล์หนึ่ง ในการลองใช้ตัวอย่าง ขั้นแรกให้สร้างไฟล์ตัวอย่าง
ใช้โปรแกรมแก้ไข เช่น nano หรือ vim เพื่อคัดลอกข้อความด้านล่างลงในไฟล์ชื่อ myfile .
xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
xz
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz
แม้ว่าคุณอาจคัดลอกและวางตัวอย่างในข้อความ (โปรดทราบว่าเครื่องหมายคำพูดคู่อาจคัดลอกไม่ถูกต้อง) จำเป็นต้องพิมพ์คำสั่งเพื่อเรียนรู้อย่างถูกต้อง
ก่อนลองใช้ตัวอย่าง ดูไฟล์ตัวอย่าง:
$แมวmyfile
ค้นหาง่าย
หากต้องการค้นหาข้อความ 'xyz' ภายในไฟล์ ให้ทำดังนี้:
$กริปxyz myfileการใช้สี
หากต้องการแสดงสี ให้ใช้ –color (ยัติภังค์คู่) หรือเพียงแค่สร้างนามแฝง ตัวอย่างเช่น:
$กริป --สีxyz myfileหรือ
$นามแฝง กริป= 'กริป--สี'$กริปxyz myfile
ตัวเลือก
ตัวเลือกทั่วไปที่ใช้กับ กริป คำสั่งรวมถึง:
- -ฉันหาทุกบรรทัด โดยไม่คำนึงถึง ของคดี
- -ค นับ มีข้อความกี่บรรทัด
- -n สายแสดงผล ตัวเลข ของเส้นที่ตรงกัน
- -l แสดงเท่านั้น ไฟล์ ชื่อ ที่ตรงกัน
- -NS เรียกซ้ำ ค้นหาไดเรกทอรีย่อย
- -v ค้นหาทุกบรรทัด ไม่ ที่มีข้อความ
ตัวอย่างเช่น:
$กริป -ผมxyz myfile# ค้นหาข้อความโดยไม่คำนึงถึงกรณี$กริป -เข้าใจแล้วxyz myfile# นับบรรทัดด้วยข้อความ
$กริป -ในxyz myfile#แสดงหมายเลขบรรทัด
สร้างหลายไฟล์
ก่อนพยายามค้นหาหลายไฟล์ ให้สร้างไฟล์ใหม่หลายไฟล์ก่อน:
$โยนออกxyz>myfile1$โยนออก -และxyz xzz XYZ>myfile2
$โยนออก -และxxx yyy>myfile3
$แมวmyfile1
$แมวmyfile2
$แมวmyfile3
ค้นหาหลายไฟล์
หากต้องการค้นหาหลายไฟล์โดยใช้ชื่อไฟล์หรือไวด์การ์ด ให้ป้อน:
$กริป -เข้าใจแล้วxyz myfile myfile1 myfile2 myfile3 ไฟล์$กริป -ในxyz ของฉัน*
# จับคู่ชื่อไฟล์ที่ขึ้นต้นด้วย 'my'
การออกกำลังกาย I
- ก่อนอื่นให้นับว่ามีกี่บรรทัดในไฟล์ /etc/passwd.
- ตอนนี้ค้นหาข้อความทั้งหมดที่เกิดขึ้น ที่ไหน ในไฟล์ /etc/passwd .
- ค้นหาจำนวนบรรทัดในไฟล์ที่มีข้อความ
- ค้นหาว่าไม่มีข้อความกี่บรรทัด ที่ไหน .
- ค้นหารายการสำหรับการเข้าสู่ระบบของคุณใน /etc/passwd
วิธีแก้ปัญหาการออกกำลังกายสามารถพบได้ที่ส่วนท้ายของบทความนี้
การใช้นิพจน์ทั่วไป
คำสั่ง กริป อาจใช้กับนิพจน์ทั่วไปโดยใช้อักขระหรือสัญลักษณ์พิเศษตั้งแต่หนึ่งตัวขึ้นไปจากสิบเอ็ดตัวเพื่อปรับแต่งการค้นหา นิพจน์ทั่วไปคือสตริงอักขระที่มีอักขระพิเศษเพื่อให้สามารถจับคู่รูปแบบภายในโปรแกรมอรรถประโยชน์ เช่น กริป , ฉันมา และ sed . โปรดทราบว่าสตริงอาจต้องอยู่ในเครื่องหมายคำพูด
อักขระพิเศษที่มีอยู่ ได้แก่ :
^ | ขึ้นต้นสาย |
$ | สิ้นสุดบรรทัด |
. | อักขระใดก็ได้ (ยกเว้น ขึ้นบรรทัดใหม่) |
* | 0 หรือมากกว่าของนิพจน์ก่อนหน้า |
นำหน้าสัญลักษณ์ทำให้เป็นตัวอักษร |
โปรดทราบว่า * ซึ่งอาจใช้ที่บรรทัดคำสั่งเพื่อให้ตรงกับอักขระจำนวนเท่าใดก็ได้ รวมทั้งไม่มี is ไม่ ใช้ในลักษณะเดียวกันที่นี่
สังเกตการใช้เครื่องหมายคำพูดในตัวอย่างต่อไปนี้ด้วย
ตัวอย่าง
หากต้องการค้นหาบรรทัดทั้งหมดที่ขึ้นต้นด้วยข้อความโดยใช้อักขระ ^ ให้ทำดังนี้
$กริป'^xyz' myfileหากต้องการค้นหาบรรทัดทั้งหมดที่ลงท้ายด้วยข้อความโดยใช้อักขระ $:
$กริป'xyz$' myfileหากต้องการค้นหาบรรทัดที่มีสตริงโดยใช้อักขระทั้ง ^ และ $ ให้ทำดังนี้
$กริป'^xyz$' myfileในการหาเส้นโดยใช้เครื่องหมาย . เพื่อให้ตรงกับอักขระใด ๆ :
$กริป'^x.z' myfileหากต้องการค้นหาบรรทัดโดยใช้ * เพื่อจับคู่ 0 หรือมากกว่าของนิพจน์ก่อนหน้า:
$กริป'^xy*z 'myfileหากต้องการค้นหาบรรทัดโดยใช้ .* เพื่อจับคู่อักขระใดๆ 0 ตัวขึ้นไป:
$กริป'^ X.*z 'myfileในการหาเส้นโดยใช้เครื่องหมาย เพื่อหลีกหนีจากอักขระ *:
$กริป'^ X *z 'myfileในการค้นหาอักขระ ใช้:
$กริป'\' myfileนิพจน์ grep – egrep
NS กริป คำสั่งรองรับเฉพาะชุดย่อยของนิพจน์ทั่วไปที่มีอยู่ อย่างไรก็ตาม คำสั่ง อีเกรป:
- อนุญาตให้ใช้นิพจน์ทั่วไปทั้งหมดได้อย่างเต็มที่
- อาจค้นหามากกว่าหนึ่งนิพจน์พร้อมกัน
โปรดทราบว่านิพจน์ต้องอยู่ภายในเครื่องหมายคำพูด
ในการใช้สี ให้ใช้ –color หรือสร้างนามแฝงอีกครั้ง:
$นามแฝง egrep='อีเกรป -- สี'เพื่อค้นหามากกว่าหนึ่ง regex NS egrep คำสั่งอาจเขียนทับได้หลายบรรทัด อย่างไรก็ตาม สามารถทำได้โดยใช้อักขระพิเศษเหล่านี้:
| | สลับกันอย่างใดอย่างหนึ่ง |
(…) | การจัดกลุ่มตรรกะของส่วนหนึ่งของนิพจน์ |
สิ่งนี้จะแยกบรรทัดที่ขึ้นต้นด้วย root, uucp หรือ mail จากไฟล์ | สัญลักษณ์หมายถึงตัวเลือกใดตัวเลือกหนึ่ง
คำสั่งต่อไปนี้ will ไม่ ทำงานแม้ว่าจะไม่มีข้อความปรากฏขึ้นเนื่องจากพื้นฐาน กริป คำสั่งไม่สนับสนุนนิพจน์ทั่วไปทั้งหมด:
$กริป '(^root|^uucp|^mail)' /ฯลฯ/รหัสผ่านอย่างไรก็ตาม บนระบบ Linux ส่วนใหญ่ คำสั่ง grep -E ก็เหมือนกับการใช้ egrep :
$กริป -และ '(^root|^uucp|^mail)' /ฯลฯ/รหัสผ่านการใช้ตัวกรอง
ท่อ เป็นกระบวนการส่งเอาต์พุตของคำสั่งหนึ่งเป็นอินพุตไปยังคำสั่งอื่น และเป็นหนึ่งในเครื่องมือ Linux ที่ทรงพลังที่สุดที่มีอยู่
คำสั่งที่ปรากฏในไปป์ไลน์มักถูกเรียกว่าตัวกรอง เนื่องจากในหลายกรณี คำสั่งเหล่านี้ลอดผ่านหรือแก้ไขอินพุตที่ส่งผ่านไปยังคำสั่งเหล่านั้นก่อนที่จะส่งสตรีมที่แก้ไขไปยังเอาต์พุตมาตรฐาน
ในตัวอย่างต่อไปนี้ เอาต์พุตมาตรฐานจาก ลส -ล ถูกส่งผ่านเป็นอินพุตมาตรฐานไปยัง กริป สั่งการ. ผลลัพธ์จาก กริป คำสั่งจะถูกส่งต่อเป็นอินพุตไปยัง มากกว่า สั่งการ.
นี่จะแสดงเฉพาะไดเร็กทอรีใน /ฯลฯ :
$ลส -NS /ฯลฯ|กริป'^d'|มากกว่าคำสั่งต่อไปนี้เป็นตัวอย่างของการใช้ตัวกรอง:
$ปล -ef|กริปcron $ใคร|กริปkdmไฟล์ตัวอย่าง
ในการทดลองทบทวน ขั้นแรกให้สร้างไฟล์ตัวอย่างต่อไปนี้
ใช้โปรแกรมแก้ไข เช่น nano หรือ vim เพื่อคัดลอกข้อความด้านล่างลงในไฟล์ชื่อ ผู้คน:
ส่วนตัว เจ.สมิธ 25000ส่วนตัว E.Smith 25400
เทรน A.Brown 27500
การฝึกอบรม C.Browen 23400
(แอดมิน) ร.บรอน 30500
Goodsout T.Smyth 30000
ส่วนตัว F.Jones 25000
การฝึกอบรม * ส. อีแวนส์ 25500
Goodsout W.Pope 30400
ชั้นล่าง T.Smythe 30500
พนักงาน เจ.มาเลอร์ 33000
แบบฝึกหัด II
- แสดงไฟล์ ผู้คน และตรวจสอบเนื้อหา
- ค้นหาทุกบรรทัดที่มีสตริง สมิธ ในไฟล์ people.Hint: ใช้คำสั่ง grep แต่จำไว้ว่าโดยดีฟอลต์ จะเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
- สร้างไฟล์ใหม่ npeople ซึ่งมีบรรทัดทั้งหมดที่ขึ้นต้นด้วย string ส่วนตัว ในไฟล์ people คำแนะนำ: ใช้คำสั่ง grep with >.
- ยืนยันเนื้อหาของไฟล์ npeople โดยแสดงรายการไฟล์
- ต่อท้ายทุกบรรทัดที่ข้อความลงท้ายด้วยสตริง 500 ในไฟล์ people ไปยังไฟล์ npeople.Hint: ใช้คำสั่ง grep with >>.
- อีกครั้ง ให้ยืนยันเนื้อหาของไฟล์ npeople โดยแสดงรายการไฟล์
- ค้นหาที่อยู่ IP ของเซิร์ฟเวอร์ที่เก็บไว้ในไฟล์ /etc/hosts .คำแนะนำ: ใช้คำสั่ง grep กับ $(ชื่อโฮสต์)
- ใช้ egrep เพื่อสกัดจาก /etc/passwd ไฟล์บัญชีบรรทัดที่มี lp หรือของคุณเอง รหัสผู้ใช้ .
วิธีแก้ปัญหาการออกกำลังกายสามารถพบได้ที่ส่วนท้ายของบทความนี้
นิพจน์ทั่วไปเพิ่มเติม
นิพจน์ทั่วไปถือได้ว่าเป็นสัญลักษณ์แทนบนสเตียรอยด์
มีอักขระ 11 ตัวที่มีความหมายพิเศษ: วงเล็บเหลี่ยมเปิดและปิด [ ], แบ็กสแลช , คาเร็ต ^, เครื่องหมายดอลลาร์ $, จุดหรือจุด ., แถบแนวตั้งหรือสัญลักษณ์ไปป์ |, เครื่องหมายคำถาม ?, เครื่องหมายดอกจันหรือดาว * เครื่องหมายบวก + และวงเล็บเหลี่ยมเปิดและปิด { } อักขระพิเศษเหล่านี้มักเรียกว่าอักขระเมตา
นี่คือชุดอักขระพิเศษทั้งหมด:
^ | ขึ้นต้นสาย |
$ | สิ้นสุดบรรทัด |
. | อักขระใดก็ได้ (ยกเว้น ขึ้นบรรทัดใหม่) |
* | 0 หรือมากกว่าของนิพจน์ก่อนหน้า |
| | สลับกันอย่างใดอย่างหนึ่ง |
[…] | ชุดอักขระที่ชัดเจนที่จะจับคู่ |
+ | นิพจน์ก่อนหน้า 1 ตัวขึ้นไป |
? | 0 หรือ 1 ของนิพจน์ก่อนหน้า |
นำหน้าสัญลักษณ์ทำให้เป็นตัวอักษร | |
{…} | สัญกรณ์ปริมาณที่ชัดเจน |
(…) | การจัดกลุ่มตรรกะของส่วนหนึ่งของนิพจน์ |
เวอร์ชันเริ่มต้นของ กริป มีการรองรับนิพจน์ทั่วไปที่จำกัดเท่านั้น เพื่อให้ตัวอย่างต่อไปนี้ทำงาน ให้ใช้ egrep แทนหรือ grep -E .
ในการหาเส้นโดยใช้เครื่องหมาย | เพื่อให้ตรงกับนิพจน์ใดนิพจน์:
$egrep'xxxz|xzz' myfileในการหาเส้นโดยใช้ | เพื่อจับคู่นิพจน์ภายในสตริงยังใช้ ( ):
$egrep'^ X(Yz|yz)' myfileวิธีค้นหาบรรทัดโดยใช้ [ ] เพื่อจับคู่อักขระใดๆ:
$egrep'^ X[ปปปป]z 'myfileหากต้องการค้นหาบรรทัดโดยใช้ [ ] เพื่อไม่ให้ตรงกับอักขระใดๆ ให้ทำดังนี้
$egrep'^ X[^ เย้]z 'myfileหากต้องการค้นหาบรรทัดโดยใช้ * เพื่อจับคู่ 0 หรือมากกว่าของนิพจน์ก่อนหน้า:
$egrep'^xy*z 'myfileหากต้องการค้นหาบรรทัดโดยใช้ + เพื่อจับคู่นิพจน์ก่อนหน้าตั้งแต่ 1 รายการขึ้นไป:
$egrep'^xy+z' myfileเพื่อค้นหาบรรทัดโดยใช้ ? เพื่อจับคู่ 0 หรือ 1 ของนิพจน์ก่อนหน้า:
$egrep'^xy?z' myfileแบบฝึกหัด III
- ค้นหาบรรทัดทั้งหมดที่มีชื่อ อีแวนส์ หรือ จิตรกร ในไฟล์คน.
- ค้นหาบรรทัดทั้งหมดที่มีชื่อ สมิธ, สมิธ หรือ Smythe ในไฟล์คน.
- ค้นหาบรรทัดทั้งหมดที่มีชื่อ บราวน์, บราวน์ หรือ แหล่งที่มา ในไฟล์ people.If you have time:
- ค้นหาบรรทัดที่มีสตริง (ผู้ดูแลระบบ) รวมถึงวงเล็บในไฟล์คน
- ค้นหาบรรทัดที่มีอักขระ * ในไฟล์ people
- รวม 5 และ 6 ด้านบนเพื่อค้นหาทั้งสองนิพจน์
ตัวอย่างเพิ่มเติม
ในการหาเส้นโดยใช้ . และ * เพื่อจับคู่ชุดอักขระใดๆ:
$egrep'^xy.*z 'myfileวิธีค้นหาบรรทัดโดยใช้ { } เพื่อจับคู่ N จำนวนอักขระ:
$egrep'^xy{3}z 'myfile$egrep'^xy .'{4}z 'myfile
วิธีค้นหาบรรทัดโดยใช้ { } เพื่อจับคู่ N ครั้งขึ้นไป:
$egrep'^xy .'{3,}z 'myfileวิธีค้นหาบรรทัดโดยใช้ { } เพื่อจับคู่ N ครั้งแต่ไม่เกิน M ครั้ง:
$egrep'^xy{2,3}z 'myfileบทสรุป
ในบทช่วยสอนนี้ อันดับแรกเราดูที่การใช้ กริป ในรูปแบบง่ายๆ ในการค้นหาข้อความในไฟล์หรือหลายไฟล์ จากนั้นเรารวมข้อความที่จะค้นหาด้วยนิพจน์ทั่วไปอย่างง่าย แล้วจึงรวมข้อความที่ซับซ้อนยิ่งขึ้นโดยใช้ egrep .
ขั้นตอนถัดไป
ฉันหวังว่าคุณจะนำความรู้ที่ได้รับที่นี่ไปใช้ให้เกิดประโยชน์ ลองดู กริป คำสั่งเกี่ยวกับข้อมูลของคุณเองและจำไว้ว่านิพจน์ทั่วไปตามที่อธิบายไว้ในที่นี้สามารถใช้ในรูปแบบเดียวกันใน เรา , sed และ awk !
โซลูชั่นการออกกำลังกาย
การออกกำลังกาย I
ก่อนอื่นให้นับว่ามีกี่บรรทัดในไฟล์ /etc/passwd .
$ wc -l /etc/passwd
ตอนนี้ค้นหาข้อความทั้งหมดที่เกิดขึ้น ที่ไหน ในไฟล์ /etc/passwd.
$ grep var /etc/passwd
ค้นหาว่าไฟล์มีข้อความกี่บรรทัด ที่ไหน
ค้นหาว่าไม่มีข้อความกี่บรรทัด ที่ไหน .
กริป -ประวัติย่อที่ไหน/ฯลฯ/รหัสผ่านค้นหารายการสำหรับการเข้าสู่ระบบของคุณใน /etc/passwd ไฟล์
grep kdm /etc/passwd
แบบฝึกหัด II
แสดงไฟล์ ผู้คน และตรวจสอบเนื้อหา
$ cat people
ค้นหาทุกบรรทัดที่มีสตริง สมิธ ในไฟล์ ผู้คน .
$ grep 'Smith' people
สร้างไฟล์ใหม่ ผู้คน ซึ่งประกอบด้วยบรรทัดทั้งหมดที่ขึ้นต้นด้วย string ส่วนตัว ใน ผู้คน ไฟล์
$ grep '^Personal' people> npeople
ยืนยันเนื้อหาของไฟล์ ผู้คน โดยแสดงรายการไฟล์.
$ cat npeople
ต่อท้ายทุกบรรทัดที่ข้อความลงท้ายด้วยสตริง 500 ในไฟล์ ผู้คน ไปที่ไฟล์ ผู้คน .
$ grep '500$' people>>npeople
ยืนยันเนื้อหาของไฟล์อีกครั้ง ผู้คน โดยแสดงรายการไฟล์.
$ cat npeople
ค้นหาที่อยู่ IP ของเซิร์ฟเวอร์ที่เก็บไว้ในไฟล์ /etc/hosts .
$ grep $(hostname) /etc/hosts
ใช้ egrep เพื่อสกัดจาก /etc/passwd ไฟล์บัญชีบรรทัดที่มี lp หรือรหัสผู้ใช้ของคุณเอง
$ egrep '(lp|kdm:)' /etc/passwd
แบบฝึกหัด III
ค้นหาบรรทัดทั้งหมดที่มีชื่อ อีแวนส์ หรือ จิตรกร ในไฟล์ ผู้คน .
$ egrep 'Evans|Maler' people
ค้นหาบรรทัดทั้งหมดที่มีชื่อ สมิธ , สมิท หรือ Smythe ในไฟล์ ผู้คน .
$ egrep 'Sm(i|y)the?' people
ค้นหาบรรทัดทั้งหมดที่มีชื่อ สีน้ำตาล , บราวนี่ หรือ แหล่งที่มา ในไฟล์คน.
$ egrep 'Brow?e?n' people
ค้นหาบรรทัดที่มีสตริง (ผู้ดูแลระบบ) รวมทั้งวงเล็บในไฟล์ ผู้คน .
ค้นหาบรรทัดที่มีอักขระ * ในไฟล์คน.
$ egrep '*' people
รวม 5 และ 6 ด้านบนเพื่อค้นหาทั้งสองนิพจน์