วิธีใช้ grep เมื่อไฟล์ไม่มีสตริง


26

ในสคริปต์ทุบตีของฉันฉันกำลังพยายามพิมพ์บรรทัดหากสตริงที่แน่นอนไม่มีอยู่ในไฟล์

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

นี่คือวิธีที่ฉันเขียนถ้าฉันต้องการให้สตริงมีอยู่ในไฟล์ แต่ฉันจะเปลี่ยนได้อย่างไรเพื่อให้พิมพ์ "ผู้ใช้ไม่มีอยู่" หากผู้ใช้ไม่พบในไฟล์ / etc / passwd?

คำตอบ:


49

grepจะกลับสู่ความสำเร็จหากพบอย่างน้อยหนึ่งอินสแตนซ์ของรูปแบบและความล้มเหลวหากไม่พบ ดังนั้นคุณสามารถเพิ่มส่วนelseคำสั่งได้ถ้าคุณต้องการทั้ง "ทำ" และ "ไม่" พิมพ์หรือคุณสามารถลบifเงื่อนไขเพื่อให้ได้รับความล้มเหลว ตัวอย่างของแต่ละคน:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi

2

grepทางเลือกคือการมองหาออกจากสถานะของ ตัวอย่างเช่น:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

หากgrepไม่พบการแข่งขันมันจะออก1เพื่อจะเป็น$? จะกลับมาเสมอหากประสบความสำเร็จ ดังนั้นจึงมีความปลอดภัยในการใช้มากกว่า1grep0$? != 0$? == 1


นี่เป็นวิธีที่ยาวกว่าในการบอกว่า Eric พูดอะไร
Jeff Schaller

สำหรับฉันแล้วif ! grep ...คำสั่งเชิงลบไม่ทำงาน ดังนั้นนี่คือทางเลือก
ssanch

1

ฉันแก้มันด้วยซับง่าย:

for f in *.txt; do grep "tasks:" $f || echo $f; done

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


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