awk + print line เฉพาะเมื่อฟิลด์แรกเริ่มต้นด้วยสตริงเป็น Linux1


16

วิธีพิมพ์บรรทัดในกรณีที่ฟิลด์แรกเริ่มต้นด้วย Linux1

ตัวอย่างเช่น:

  echo Linux1_ver2  12542 kernel-update  |   awk '{if ($1 ~ Linux1 ) print $0;}'

เป้าหมายคือการพิมพ์บรรทัดขณะที่ฟิลด์แรกเริ่มต้นด้วย Linux1

ตัวอย่างของเส้น:

Linux1-new  36352 Version:true
Linux1-1625543  9847
Linux1:16254 8467563 

หมายเหตุ - ช่องว่างหรือ TAB อาจอยู่ก่อนการยื่นครั้งแรก

คำตอบ:


15

ทางเดียว:

echo "Linux1_ver2  12542 kernel-update"  |  awk '$1 ~ /^ *Linux1/'

$ 1 และ ^ ซ้ำซ้อน ข้อเสนอของคุณไม่ครอบคลุมแท็บ
Hauke ​​Laging

@HuakeLaging เหตุใดคุณคิดว่า $ 1 และ ^ เป็นข้อมูลซ้ำซ้อน ฉันค่อนข้างแน่ใจว่าทั้งสองจำเป็นต้องใช้เพื่อให้คำแรกถูกจับคู่กับเท่านั้นและเพื่อให้จับคู่ที่จุดเริ่มต้น (เช่น "mLinux" สามารถจับคู่โดย / Linux1 / แต่ไม่ใช่โดย / ^ Linux /)
Nick Bull

19

awk ละเว้นช่องว่างนำหน้าเมื่อกำหนดฟิลด์ คำสั่งเริ่มต้นคือการพิมพ์

awk '$1 ~ /^Linux1/'

คือสิ่งที่คุณต้องการ

คำอธิบายโดยละเอียด:

  • $ 1 บอกให้ awk ดูที่ "คอลัมน์แรก"
  • ~ บอกให้ awk ทำการจับคู่ Regular Expression /..../ เป็นนิพจน์ทั่วไป
  • ภายใน RE คือสตริง Linux และอักขระพิเศษ ^
  • ^ ทำให้ RE จับคู่ตั้งแต่เริ่มต้น (ตรงข้ามกับการจับคู่ที่ใดก็ได้ในบรรทัด)

ดำเนินการร่วมกัน: Awk จะจับคู่นิพจน์ปกติกับ "Linux" ที่จุดเริ่มต้นของคอลัมน์แรก


2

ซึ่งควรใช้กับกรณีนี้โดยเฉพาะ

awk '/^[[:blank:]]*Linux1/ {print}'

แต่ถ้าพื้นที่ว่างก่อน Linux1 มันจะไม่ตรงกัน
yael

@yael ฉันแก้ไขเพื่อแก้ไข
Hauke ​​Laging

+1 สำหรับทุกคนที่สงสัยว่าไวยากรณ์นี้กำลังทำอะไร: มันกำลังพูดว่า "ทำสิ่งต่าง ๆ ภายในวงเล็บปีกกาเฉพาะเมื่อ regex ตรงกับบรรทัดนั้น"
user541686
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.