ฉันมีรายชื่อโดเมนจำนวนมากที่ฉันต้องลบออกจาก / etc / remotedomains พวกมันอาจจะไม่เรียงตามลำดับใด ๆ ในไฟล์ แต่ละโดเมนอยู่บนบรรทัดเดียว
ฉันจะวนซ้ำในรายการและค้นหาบรรทัดนั้นในโดเมนระยะไกลและลบออกได้อย่างไร
ฉันมีรายชื่อโดเมนจำนวนมากที่ฉันต้องลบออกจาก / etc / remotedomains พวกมันอาจจะไม่เรียงตามลำดับใด ๆ ในไฟล์ แต่ละโดเมนอยู่บนบรรทัดเดียว
ฉันจะวนซ้ำในรายการและค้นหาบรรทัดนั้นในโดเมนระยะไกลและลบออกได้อย่างไร
คำตอบ:
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains
-v
บอก grep สายสัญญาณออกเท่านั้นที่ไม่ตรงกับรูปแบบ
-f list
บอก grep list
การอ่านรูปแบบจากแฟ้ม
-F
บอก grep จะตีความรูปแบบเป็นสตริงธรรมดาไม่แสดงออกปกติ (ดังนั้นคุณจะไม่ได้ทำงานเป็นปัญหากับเมตาอักขระ regex)
-x
บอก grep เพื่อให้ตรงกับสายทั้งเช่นถ้ามีรูปแบบfoo
ที่ควรถอดสายfoo
ไม่สายหรือfoobar
barfoo
-F
ใช้สำหรับการจับคู่สตริงคงที่ (“ การจับคู่แบบตรงทั้งหมด”) แต่ไม่บังคับให้รูปแบบจับคู่ทั้งบรรทัด POSIX ระบุการ-x
ตั้งค่าสถานะเพื่อ จำกัด การจับคู่กับอินสแตนซ์ที่รูปแบบตรงกับทั้งบรรทัด
ใช้ comm!
comm -23 /etc/remotedomains remove
จากหน้าคน:
เปรียบเทียบไฟล์ที่เรียงลำดับ FILE1 และ FILE2 ทีละบรรทัด
หากไม่มีตัวเลือกให้สร้างเอาต์พุตสามคอลัมน์ คอลัมน์หนึ่งมีบรรทัดที่ไม่ซ้ำกับ FILE1 คอลัมน์ที่สองมีบรรทัดที่ไม่ซ้ำกับ FILE2 และคอลัมน์ที่สามมีบรรทัดที่ใช้ร่วมกันกับทั้งสองไฟล์
ตัวเลือก -1, -2 และ -3 ปิดใช้งานคอลัมน์ที่เกี่ยวข้อง
อย่างไรก็ตามมันต้องการไฟล์ที่จะถูกจัดเรียง
sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt
หากรายการโดเมนที่จะลบอยู่ในไฟล์ให้ทำดังนี้:
sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt
หมายเหตุ:
ใช้ -i.bak เพื่อสร้างข้อมูลสำรองของ domainlist.txt
ถ้า removeelist.txt มีหลายพันรายการมันอาจล้นความยาวบรรทัดคำสั่งสูงสุดได้ นี่ไม่ใช่สถานการณ์ที่มีโอกาสมาก แต่เป็นสิ่งที่คุณควรระวัง
เมื่อพิจารณาเพิ่มเติมความเสี่ยงนั้นสามารถขจัดได้ด้วย:
for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
/etc/localdomains
และ/etc/remotedomains
ทำสิ่งนี้ก่อน