วิธีเพิ่มการค้นหาหลายรายการในคำสั่ง AWK


10

ฉันพยายามค้นหาไฟล์ที่สร้างในเดือนมิถุนายนกรกฎาคมและสิงหาคม ฉันใช้วิธีนี้

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

แต่มันไม่ทำงาน


1
สำหรับเร็กคอร์ด[...]โครงสร้างตรงกับอักขระเดี่ยวซึ่งสามารถเป็นหนึ่งในอักขระระหว่างวงเล็บ ดังนั้นนิพจน์ของคุณจึงตรงกับJJA หรือJug( Jจาก[Jun], uจาก[Jul]และgจาก[Aug]) แต่ไม่ใช่ตัวย่อของเดือนที่คุณต้องการจับคู่
tripleee

คำตอบ:


12

คุณสามารถจับคู่ในหลายรูปแบบดังนี้:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

สิ่งนี้จะส่งคืนการแข่งขันทั้งหมดสำหรับ Jun, July หรือ Aug. คุณไม่จำเป็นต้องมีprintคำสั่งเนื่องจากเป็นการawkกระทำเริ่มต้นของ


1
awk เข้าใจ regexps ขยายเพื่อให้รูปแบบง่ายเหมือนที่คุณสามารถเขียนเป็นawk '/Jun|Jul|Aug/'หรือawk '/Ju[nl]|Aug/'
cas

5

ตามกฎทั่วไปมันเป็นความคิดที่ดีมากที่จะแยกการส่งออกของคำสั่ง ls วิธีที่ดีกว่าในการทำสิ่งที่คุณต้องการคือ

stat -c "%n %y" * | grep 2013-0[678]

หรือมิฉะนั้นให้ตรวจสอบเฉพาะฟิลด์สุดท้ายเพื่อป้องกันกรณีที่ไม่น่าเป็นไปได้ที่ชื่อไฟล์เป็นวันที่:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

จากman stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name

มันก็เป็นตัวอย่างที่ดี ฉันไม่เคยตรวจสอบสถานะมาก่อน ขอบคุณสำหรับข้อมูลที่ดี
OmiPenguin

อาจเปลี่ยนเป็น ... | awk '$NF ~ /2013-0[678]/'เพื่อตรวจสอบเฉพาะฟิลด์เอาต์พุตล่าสุดใน (ไม่แน่?) แม้ว่าชื่อไฟล์จะตรงกับ regex แม้ว่าวันที่จะไม่
tripleee

3

lsเป็นคำสั่งเพื่อแสดงข้อมูลเกี่ยวกับไฟล์ในมนุษย์ที่สามารถอ่านได้ ไม่ได้ใช้มันในสคริปต์

findคำสั่งในการค้นหาไฟล์ในการจับคู่ต้นไม้ไดเรกทอรีเกณฑ์ที่แน่นอนคือ หากคุณมี GNU find (เช่น Linux หรือ Cygwin ที่ไม่ใช่แบบฝัง) หรือ FreeBSD find (เช่น FreeBSD หรือ OSX) คุณสามารถใช้-newermtเพื่อจับคู่ไฟล์ที่ถูกแก้ไขครั้งล่าสุดหลังจากวันที่กำหนด

find . -newermt '1 June' ! -newermt '1 September' -print

เพิ่มปีถ้าคุณต้องการจับคู่ไฟล์ในปีที่เฉพาะเจาะจงมากกว่าปีปฏิทินเมื่อสคริปต์ทำงาน

หากการดำเนินการค้นหาของคุณไม่มี-newermtคุณจะต้องทำด้วย-newerซึ่งจะเปรียบเทียบวันที่ของไฟล์ที่findพบกับไฟล์คงที่ ใช้touchเพื่อสร้างไฟล์ชั่วคราวพร้อมวันที่ที่คุณต้องการใช้เป็นขอบเขต

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.