ฉันมีไฟล์บันทึกการทำงานและฉันต้องการค้นหาสตริงและเฉพาะเมื่อสตริงนั้นพบไฟล์ใหม่ที่จะสร้าง ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไรดูเหมือนว่าจะเหมาะสมในกรณีนี้
ฉันมีไฟล์บันทึกการทำงานและฉันต้องการค้นหาสตริงและเฉพาะเมื่อสตริงนั้นพบไฟล์ใหม่ที่จะสร้าง ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไรดูเหมือนว่าจะเหมาะสมในกรณีนี้
คำตอบ:
ประเมินการลัดวงจรหลังจากgrep:
grep -q 'search_pattern' /file && : >/newfile
grep -qไม่สร้างเอาต์พุตบน STDOUT เพียงออกจากสถานะการออก0หากพบรูปแบบในไฟล์
หากรูปแบบที่พบ ( &&) สร้างไฟล์โดย/newfile: >/newfile
คุณสามารถใช้touch /newfileวิธีปกติหรือbashเปลี่ยนเส้นทางเปล่าก็ได้>/newfileเช่นกัน
เพิ่งทราบว่าถ้าไฟล์ที่มีอยู่แล้วก็touchจะเปลี่ยนเวลาที่เกี่ยวข้องโดยไม่ต้องตัดทอนไฟล์ และการเปลี่ยนเส้นทางที่ว่างเปล่า>/newfileไม่ได้รับการสนับสนุนบนเชลล์ทั้งหมดในระหว่างการเดินทาง (เช่นในzsh) ที่คุณต้องส่ง EOF ด้วยตนเอง
:ทำอย่างไร
:นั้นย่อมาจากtrueมันเป็นคำสั่ง no-op ที่มักจะออกด้วยสถานะออก 0
แค่เล่น ๆ:
python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"
โดยที่'string'ถูกแทนที่ด้วยสตริง (เงื่อนไข) 'logfile'ถูกแทนที่ด้วยพา ธ ไปยังล็อกไฟล์'newfile'จะถูกแทนที่ด้วยพา ธ ที่แท้จริงไปยังไฟล์ที่จะสร้างทั้งหมดในเครื่องหมายคำพูดเดี่ยวเหมือนในตัวอย่าง
คุณสามารถใช้ awk ด้วยsystem()คำสั่งของมัน หาก/pattern/พบรหัสบล็อค{}จะถูกดำเนินการในกรณีนี้เราเรียกtouch /tmp/my_file.txtผ่านsystem()คำสั่ง
/etc/passwdตัวอย่างด้านล่างแสดงให้เห็นว่าการสร้างแฟ้มชั่วคราวหากมีผู้ใช้ของฉันในปัจจุบัน
$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd
$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月 25 07:58 /tmp/my_file.txt
หรืออีกวิธีหนึ่งเราสามารถใช้การเปลี่ยนเส้นทางไปยังไฟล์:
awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd
คุณไม่ได้บอกว่าคุณต้องการไฟล์ว่างเปล่าใหม่หรือต้องการการประมวลผลที่ซับซ้อนมากขึ้นเพื่อสร้างไฟล์
หากอดีตการตอบกลับโดย @heemayl เป็นจุดที่
มิฉะนั้นให้ใช้คำสั่ง if:
if grep -q 'search_pattern' /file
then
# Create your file here
fi
grepเพื่อค้นหา-qตัวเลือกที่จะระงับการส่งออกทั้งหมดและกลับมาแข่งขัน / nonmatch ผ่านgrepรหัสทางออก 's ซึ่งเป็นทดสอบได้อย่างง่ายดาย