พฤติกรรมแปลก ๆ ของ“ ls -a | grep ^ \.”


10

ฉันต้องการแสดงเนื้อหาของ pwd และแสดงเฉพาะไฟล์ที่ขึ้นต้นด้วย dot ฉันพยายามls -a | grep ^\.แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมสัญญาณออกจึงมีไฟล์ที่ไม่ได้ขึ้นต้นด้วย dot ตัวอย่างเช่น:

Pictures
.pip
.pki
.profile
projects
Public

ฉันรู้ว่าฉันสามารถบรรลุสิ่งที่ฉันต้องการด้วยls -ld .*ฉันแค่อยากรู้เกี่ยวกับพฤติกรรมของ grep ซึ่งฉันไม่สามารถอธิบายได้



ทำไมไม่เพียงls -d .*ที่จะแสดงรายการไฟล์ทั้งหมดที่เริ่มต้นด้วย.?
Barmar

คำเตือน: อย่าวางท่อเอาต์พุตของ ls ลงในคำสั่งอื่น ใช้ค้นหาแทน ls มีความน่าเชื่อถือเกินกว่าที่จะเชื่อได้ ดู: Pitfall 1 ที่mywiki.wooledge.org/BashPitfalls - มันสร้าง # 1! ส่วนที่เหลือของเว็บไซต์ก็ยอดเยี่ยมเช่นกัน
โจ

คำตอบ:


20

พูดโต้แย้งไปgrepจึงls -a | grep '^\.'

เหตุผลในการนี้คือเชลล์จัดการ\.และเปลี่ยนกลับเป็นธรรมดา.ซึ่งgrepถือว่าเป็นอักขระตัวแทนเดียว หากมีข้อสงสัยให้อ้างอิงสตริงที่มี (หรืออาจมี) อักขระที่พิเศษสำหรับเชลล์


ทำไมเชลล์ถึงเพิกเฉย \
ps-aux

\ คือลำดับการหลบหลีกซึ่งทำให้เชลล์ปฏิบัติต่ออักขระต่อไปนี้ตามตัวอักษร ในสิ่งนี้grep ^\\.\\ ได้รับการปฏิบัติโดยเชลล์ในฐานะแบ็กสแลชเดี่ยวและอีกครั้งที่ grep ใช้แบ็กสแลชเดี่ยวตามด้วยจุดเป็นจุดสัญพจน์
Avinash Raj

11

คุณต้องใส่ grep regex ลงในเครื่องหมายคำพูด

ls -a | grep '^\.'

หมายเหตุ: อย่าแยกผลลัพธ์ของlsคำสั่ง


ทำไมการแยกวิเคราะห์ผลลัพธ์ของ ls จึงไม่ดี
ps-aux

จากลิงก์: ในโหมดเริ่มต้นหากเอาต์พุตมาตรฐานไม่ใช่เทอร์มินัล ls จะแยกชื่อไฟล์ด้วยการขึ้นบรรทัดใหม่ สิ่งนี้ใช้ได้จนกว่าคุณจะมีไฟล์ที่มีบรรทัดใหม่ในชื่อ
Michael Durrant

@Michael Durrant: ฉันขอแนะนำให้การขึ้นบรรทัดใหม่ในชื่อไฟล์เป็นข้อบกพร่องของระบบที่สำคัญ
jamesqf

@jamesqf - ดูบรรทัดใหม่ในชื่อไฟล์ (โดยเฉพาะคำตอบของsml )
don_crissti

0

หากคุณดำเนินการ cmd ls -a | grep ^ \. ดังนั้น grep จึงไม่ถือว่า "\" เป็นอักขระพิเศษและความหมายของ "." อย่าหลบหนี

เมื่อเราใช้ cmd ls -a | grep "^ \." จากนั้น grep จะพิจารณาว่า "\" เป็นอักขระพิเศษและความหมายของ "." ได้รับการหลบหนี มันจะให้ผลลัพธ์ตามที่คาดหวัง

หากคุณต้องการใช้ grep cmd โดยไม่มีเครื่องหมายอัญประกาศคุณก็ควรหลีกเลี่ยงอักขระ "\" เช่นกัน คุณสามารถรับผลที่คาดหวังได้โดยไม่ต้องใส่เครื่องหมายคำพูดคู่ ls -a | grep ^ \\.

สำหรับรายละเอียดเกี่ยวกับความหมายของอักขระพิเศษใน Regex อ้างอิงลิงค์ต่อไปนี้ http://www.regular-expressions.info/quickstart.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.