Score:0

วิธีพิมพ์คำเฉพาะจากไฟล์

ธง za

ฉันมีไฟล์ที่เป็นเช่นนี้

ผู้ใช้:[dgalanos] กำจัด:[0xa35]
ผู้ใช้:[roleary] กำจัด:[0xa36]
ผู้ใช้:[smorgan] กำจัด:[0xa37]

ฉันจะพิมพ์เฉพาะชื่อผู้ใช้เช่นนี้ได้อย่างไร

เดกาลาโนส
สวมบทบาท
สมอร์แกน

ฉันเหนื่อย

cat users.txt | awk -F ':' '{พิมพ์ $2 > "users3.out"}'

แต่มันไม่ได้ให้ผลลัพธ์ที่ถูกต้องตามที่คาดไว้

αғsнιη avatar
cn flag
อย่าใช้ [awk redirection](https://www.gnu.org/software/gawk/manual/html_node/Redirection.html) ใน `awk '{print $2 > "users3.out"}' input` เมื่อคุณ ไม่จำเป็น และคุณต้องการเชลล์เปลี่ยนเส้นทาง `awk '{print $2}' input > users3.out `
Score:1
ธง in

หากคุณตั้งค่าเครื่องหมายทวิภาคเป็นตัวคั่นฟิลด์ บรรทัด

ผู้ใช้:[dgalanos] กำจัด:[0xa35]

จะแบ่งเป็น

ผู้ใช้
[dgalanos] กำจัด
[0xa35]

ฉันเดาว่าคุณต้องการแยกที่โคลอนอันใดอันหนึ่ง หรือ เว้นวรรค แล้วถอดวงเล็บออก:

อีกด้วย, อึดอัด ค่าเริ่มต้นในการอ่านจากไฟล์ ไม่จำเป็นต้องมี แมว:

awk -F '[: ]' '{gsub(/[][]/,"",$2); พิมพ์ $2}' users.txt > users3.out

หรือคุณใช้วงเล็บเป็นตัวคั่นฟิลด์:

awk -F '[][]' '{พิมพ์ $2}' users.txt > users3.out

อย่างไรก็ตาม สำหรับงานดังกล่าว ฉันต้องการมากกว่า เกรป:

grep -Po 'user:\[\K[^]]*' users.txt > users3.out
Score:0
ธง gr

วิธีที่ง่ายที่สุดคือแก้ไขคำสั่งของคุณดังนี้:

awk -F '[' '{print $2}' users.txt | awk -F ']' '{พิมพ์ $1}' > users3.out

  • ฉันใช้สองท่อ อึดอัด จับก่อนอะไรหลัง [ แล้วหลังจากนั้นจะเป็นอย่างไร ]. ตัวคั่นที่คุณสนใจไม่ใช่เครื่องหมายอัฒภาค แต่เป็นวงเล็บเหลี่ยม
  • ท่อ | หมายความว่าเอาต์พุตของคำสั่งแรกใช้เป็นอินพุตของคำสั่งที่สอง ที่สอง อึดอัด ใช้งานไม่ได้ถ้าคุณใช้คนเดียว แต่จะเข้าใจได้ก็ต่อเมื่อคุณไพพ์ไปที่คำสั่งแรก
  • เมื่อวางท่อ คุณไม่จำเป็นต้องทำซ้ำไฟล์อินพุต: ด้วยเหตุผลนี้ในครั้งที่สอง อึดอัด ไม่มีการซ้ำซ้อนของไฟล์อินพุต user.txt. หากคุณสงสัยที่จะใช้ตัวที่สอง อึดอัด คนเดียว เขียน: awk -F ']' '{พิมพ์ $1}' users.txt
  • คุณไม่จำเป็นต้องเปลี่ยนเส้นทาง แมว ส่งออกไปที่ อึดอัด เพราะ อึดอัด สามารถรับไฟล์เป็นอินพุต
  • การเปลี่ยนเส้นทางของคุณไปยังไฟล์เอาต์พุตต้องไม่อยู่ภายในไฟล์ อึดอัด คำสั่ง แต่เมื่อสิ้นสุดคำสั่งเต็ม

หากคุณต้องการดูผลลัพธ์ในเทอร์มินัลแต่ไม่ต้องการดูในไฟล์ คุณสามารถลบส่วนนั้นออกได้ >

มี วิธีที่สง่างามมากขึ้น เพื่อรับข้อมูลโดยไม่ต้องไปป์สอง อึดอัด คำสั่ง แต่กำหนดวงเล็บสองตัวเป็นตัวคั่น:

awk -F '[][]' '{พิมพ์ $2}' users.txt > users3.out

tcprks avatar
za flag
คำสั่งให้ผลลัพธ์ที่ต้องการ อย่างไรก็ตาม คุณสามารถอธิบายได้ว่าทำไมคำสั่งพิมพ์ที่สองถึงไม่พิมพ์อะไรเลย awk -F '[' '{print $2}' users.txt | awk -F ']' '{print $1}' . มันเป็นสิ่งที่ต้องการ AND คำสั่ง มันจะพิมพ์ก็ต่อเมื่อทั้งสองเงื่อนไขก่อน/หลังไปป์พอใจ
Lorenz Keel avatar
gr flag
ตรวจสอบคำตอบที่แก้ไขของฉัน มันควรจะเคลียร์ข้อสงสัยของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา