การใช้ grep (และ egrep) กับ Regular Expressions

Using Grep With Regular Expressions



บทแนะนำนี้จะอธิบายวิธีใช้ทั้งสองอย่าง กริป (และ อีเกรป) t o ค้นหาข้อความในไฟล์ ในรูปแบบที่เรียบง่าย และเมื่อรวมกับนิพจน์ทั่วไป มันมีหลายอย่าง ตัวอย่าง และ การออกกำลังกาย , มากกว่า โซลูชั่น , เพื่อให้ผู้ดูสมบูรณ์

ชื่อ กริป มาจากคำสั่ง 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

  1. ก่อนอื่นให้นับว่ามีกี่บรรทัดในไฟล์ /etc/passwd.
คำแนะนำ: ใช้ห้องน้ำ -NS /ฯลฯ/รหัสผ่าน
  1. ตอนนี้ค้นหาข้อความทั้งหมดที่เกิดขึ้น ที่ไหน ในไฟล์ /etc/passwd .
  2. ค้นหาจำนวนบรรทัดในไฟล์ที่มีข้อความ
  3. ค้นหาว่าไม่มีข้อความกี่บรรทัด ที่ไหน .
  4. ค้นหารายการสำหรับการเข้าสู่ระบบของคุณใน /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 คำสั่งอาจเขียนทับได้หลายบรรทัด อย่างไรก็ตาม สามารถทำได้โดยใช้อักขระพิเศษเหล่านี้:

| สลับกันอย่างใดอย่างหนึ่ง
(…) การจัดกลุ่มตรรกะของส่วนหนึ่งของนิพจน์
$egrep '(^root|^uucp|^mail)' /ฯลฯ/รหัสผ่าน

สิ่งนี้จะแยกบรรทัดที่ขึ้นต้นด้วย 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

  1. แสดงไฟล์ ผู้คน และตรวจสอบเนื้อหา
  2. ค้นหาทุกบรรทัดที่มีสตริง สมิธ ในไฟล์ people.Hint: ใช้คำสั่ง grep แต่จำไว้ว่าโดยดีฟอลต์ จะเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
  3. สร้างไฟล์ใหม่ npeople ซึ่งมีบรรทัดทั้งหมดที่ขึ้นต้นด้วย string ส่วนตัว ในไฟล์ people คำแนะนำ: ใช้คำสั่ง grep with >.
  4. ยืนยันเนื้อหาของไฟล์ npeople โดยแสดงรายการไฟล์
  5. ต่อท้ายทุกบรรทัดที่ข้อความลงท้ายด้วยสตริง 500 ในไฟล์ people ไปยังไฟล์ npeople.Hint: ใช้คำสั่ง grep with >>.
  6. อีกครั้ง ให้ยืนยันเนื้อหาของไฟล์ npeople โดยแสดงรายการไฟล์
  7. ค้นหาที่อยู่ IP ของเซิร์ฟเวอร์ที่เก็บไว้ในไฟล์ /etc/hosts .คำแนะนำ: ใช้คำสั่ง grep กับ $(ชื่อโฮสต์)
  8. ใช้ 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

  1. ค้นหาบรรทัดทั้งหมดที่มีชื่อ อีแวนส์ หรือ จิตรกร ในไฟล์คน.
  2. ค้นหาบรรทัดทั้งหมดที่มีชื่อ สมิธ, สมิธ หรือ Smythe ในไฟล์คน.
  3. ค้นหาบรรทัดทั้งหมดที่มีชื่อ บราวน์, บราวน์ หรือ แหล่งที่มา ในไฟล์ people.If you have time:
  4. ค้นหาบรรทัดที่มีสตริง (ผู้ดูแลระบบ) รวมถึงวงเล็บในไฟล์คน
  5. ค้นหาบรรทัดที่มีอักขระ * ในไฟล์ people
  6. รวม 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 '(แอดมิน)'ผู้คน

ค้นหาบรรทัดที่มีอักขระ * ในไฟล์คน.
$ egrep '*' people
รวม 5 และ 6 ด้านบนเพื่อค้นหาทั้งสองนิพจน์

$egrep '(แอดมิน)|*'ผู้คน