หยิบเนื้อหาบางอย่างของไฟล์


9

ดังนั้นฉันรู้ว่าเครื่องมือมีอยู่สำหรับปัญหานี้เพราะฉันเคยได้ยินเกี่ยวกับพวกเขา แต่ฉันไม่รู้ว่าพวกเขาคืออะไร

ฉันต้องการทำอะไรบางอย่างเช่นกรองข้อมูลทั้งหมดยกเว้นชื่อผู้ใช้ใน / etc / passwd

ตัวอย่างเช่นฉันต้องการคว้า user1, user2 และ user3 จากไฟล์ต่อไปนี้ ในกรณีนี้ตรรกะอาจเป็น "หยิบข้อความถึง ':' แรกในแต่ละบรรทัดของไฟล์"

user1:x:1:4
user2:x:2:5
user3:x:3:6

ผลลัพธ์จะเป็น:

user1
user2
user3

คำตอบ:


19

cutมีอยู่เพื่อวัตถุประสงค์นี้ -dธงระบุตัวคั่นและ-fระบุเขตข้อมูลการส่งออก:

cut -d: -f1 /etc/passwd

อาร์กิวเมนต์ที่-fสามารถเป็นสิ่งที่ต้องการ1,3แสดงเขตข้อมูลแรกและเขตที่สามหรือ1-3เพื่อแสดงเขตข้อมูลแรก นอกจากนี้ยังมี-bและตั้ง-cค่าสถานะให้อ่านไบต์และอักขระแทนฟิลด์ หากคุณต้องการบางสิ่งที่ยืดหยุ่นกว่าปกติโดยทั่วไปแล้วawkจะทำเคล็ดลับ (ดูคำตอบของ Matthew )


13

เวลาที่คุณต้องการดึงข้อมูลจากการป้อนข้อมูลแบบตารางทุกท่านควรพิจารณาawk มันมีอยู่ในแทบทุกระบบ Unix ดังนั้นจึงเป็นนิสัยที่ดีที่จะ:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': กำหนด ":" เป็นตัวคั่นคอลัมน์
  • '{}': รันคำสั่งนี้สำหรับแต่ละบรรทัด
  • print $1: พิมพ์คอลัมน์แรกไปที่หน้าจอ

3
หมายเหตุสุ่ม: awkใช้ชื่อไฟล์ดังนั้นคุณสามารถข้ามไปป์และทำawk -F: '{print $1}' /etc/passwd
Michael Mrozek

ฉันมักจะลืมว่า awk ใช้ชื่อไฟล์ฉันมักจะใช้มันในท่อ ... บางสิ่งบางอย่างเช่น sed | awk ฯลฯ ...
Matthew Brannigan

เกือบทุกอย่างที่ทำงานกับไฟล์จะใช้ชื่อไฟล์ ( trและatเป็นตัวอย่างเล็ก ๆ น้อย ๆ ของสิ่งที่ไม่ได้)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป


1

ภายใต้ Perl และ awk มีเครื่องมือที่สามสำหรับงานดังกล่าวซึ่งเป็น sed:

sed 's/:.*//' FILE 

นี่คือคำสั่งทดแทน: แทนที่จากโคลอน: ตามด้วยจุดซึ่งเป็นตัวโจ๊กเกอร์สำหรับตัวละครทุกชนิดทุกตัวนับ (*) โดยไม่มีอะไร

มันคือ 's (ubstitute) / FROM / TO /' ด้วยการว่างเปล่าซึ่งหมายถึง 'ลบทุกอย่างตั้งแต่แรก (เนื่องจาก sed เป็นโลภเริ่มต้น) โคลอน (จนถึงท้ายบรรทัดเนื่องจากทำงานได้ดีกับทั้งบรรทัด)

แน่นอนว่าcutเป็นคำสั่งที่ดีเช่นกัน แต่ฉันจะพูดจากครอบครัวอื่น


1

ในตัวอย่างของคุณชื่อทั้ง 3 ชื่อมีความยาวเท่ากัน ในกรณีดังกล่าว - ซึ่งอาจเกิดขึ้น แต่ไม่น่าจะมี / etc / passwd - คุณอาจใช้ colrm ด้วย:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

หรือแน่นอน

cat FILE | colrm 6 

(กรณีที่ไม่ค่อยเกิดขึ้นซึ่งuseless use of catไม่ได้ใช้เพราะคุณไม่สามารถส่งไฟล์ไปยังพารามิเตอร์เพื่อดำเนินการในฐานะพารามิเตอร์)


catcolrm 6 < FILEยังคงไร้ประโยชน์มี:
จัดการ

ดีใช่ cat foo | grep barแต่ไม่ใช่ว่าไร้ประโยชน์เช่นเดียวกับในการเรียก
ผู้ใช้ที่ไม่รู้จัก

1

เพื่อความสมบูรณ์ไม่มีความจำเป็นสำหรับคำสั่งภายนอกเชลล์ (เชลล์เป้าหมายหรือคอมแพทช์ที่ใช้ร่วมกันได้) สามารถจัดการมันได้อย่างเดียว:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

แน่นอนว่านี่อาจเป็นวิธีที่ช้าที่สุดของวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมดดังนั้นสำหรับไฟล์ขนาดใหญ่ก็เลือกวิธีอื่น

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