sed - smazání řádku

beer

  • *****
  • 729
    • Zobrazit profil
sed - smazání řádku
« kdy: 15. 02. 2015, 22:01:07 »
Ahoj, mám 2 soubory, první obsahuje ip adresy a jméno serverů a druhý obsahuje jméno serveru.


Jak napsat pomocí sedu příkaz, který by smazal z prvního souboru všechny řádky, které jsou v druhém souboru?


guest

Re:sed - smazání řádku
« Odpověď #1 kdy: 15. 02. 2015, 22:43:40 »
for patern in $(cat subor2); do sed -i "/$patern/d" subor1; done

guest

Re:sed - smazání řádku
« Odpověď #2 kdy: 15. 02. 2015, 22:47:23 »
ale ten sedovy postup je dost destruktivny :) radsej by som pouzil nieco ako grep -ivwf subor2 subor1 > subor3

beer

  • *****
  • 729
    • Zobrazit profil
Re:sed - smazání řádku
« Odpověď #3 kdy: 15. 02. 2015, 23:05:01 »
Díky, super. Jak to myslíš destruktivní, jako že to ten soubor třeba fragmentuje? To je celkem fuk, protože ten soubor, který takto vznikne, se bude kopírovat na cílové místo a pak se smaže. Takže fragmenty nevadí. Otestováno, ten sed funguje ok, ten grepový příkaz takto nefunguje - soubor 3 byl v případě toho grepu úplně prázdný.




guest

Re:sed - smazání řádku
« Odpověď #4 kdy: 15. 02. 2015, 23:17:46 »
ten sed by som upravil na sed -i "/\b$i\b/d" subor2, aby si predisiel zmazaniu host10, ak sa v premennej pattrern nachadza host1 :)


guest

Re:sed - smazání řádku
« Odpověď #5 kdy: 15. 02. 2015, 23:19:36 »
ten sed by som upravil na sed -i "/\b$i\b/d" subor2, aby si predisiel zmazaniu host10, ak sa v premennej pattrern nachadza host1 :)

samozrejme som myslel sed -i "/\b$i\b/d" subor1

beer

  • *****
  • 729
    • Zobrazit profil
Re:sed - smazání řádku
« Odpověď #6 kdy: 15. 02. 2015, 23:57:12 »


Na mne musíš polopatě, myslíš
Kód: [Vybrat]
for patern in $(cat soubor2); do sed -i "/\b$i\b/d" subor1; done?


Tak to mi udělá prázdný soubor 1, smaže to z něj všechno.


Můžeš se mi prosím mrknout přímo na soubor, kde to chci implementovat? Nějak mi tam nefunguje ani ta první sedová varianta, nevím na čem to vyhoří.


https://raw.githubusercontent.com/jiri001meitner/edithosts/master/gethosts.sh


Kód: [Vybrat]
#!/bin/bash
echo "edithosts:Checking Internet connectivity..."
if [ "`ping -c 1 raw.githubusercontent.com`" ]
then


  echo "edithosts:Internet connectivity OK..."


temphosts1a=$(mktemp)
temphosts1b=$(mktemp)
temphosts2a=$(mktemp)
temphosts2b=$(mktemp)
temphosts3=$(mktemp)
whitelists=$(mktemp)




wget -nv -O - "https://raw.githubusercontent.com/jiri001meitner/edithosts/master/edithosts-blocklist.txt" >> "$temphosts1a"
wget -nv -O - "http://winhelp2002.mvps.org/hosts.txt" >> "$temphosts1a"
wget -nv -O - "http://hosts-file.net/ad_servers.asp" >> "$temphosts1b"
wget -nv -O - "http://someonewhocares.org/hosts/hosts" >> "$temphosts1b"
wget -nv -O - "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext" >> "$temphosts1b"


sed -e 's/\r//' -e '/^0.0.0.0/!d' -e '/localhost/d' -e 's/127\.0\.0\.1/0.0.0.0/' -e 's/ \+/\t/' -e 's/#.*$//' -e 's/[ \t]*$//' < "$temphosts1a" | sort -u > "$temphosts2a"


sed -e 's/\r//' -e '/^127\.0\.0\.1/!d' -e '/localhost/d' -e 's/127\.0\.0\.1/0.0.0.0/' -e 's/ \+/\t/' -e 's/#.*$//' -e 's/[ \t]*$//' < "$temphosts1b" | sort -u > "$temphosts2b"


cat "$temphosts2a" "$temphosts2b" | sort -u > "$temphosts3"


wget -nv -O - https://raw.githubusercontent.com/jiri001meitner/edithosts/master/whitelist.txt >> "$whitelists"


for patern in $(cat $whitelist); do sed -i "/$patern/d" $temphosts3; done




echo -e "\n# Edithost updated this file at $(date)" | cat /etc/hosts.d/hosts.conf - "$temphosts3" > /etc/hosts.d/hosts-block
echo -e "\n# Blocked $(cat /etc/hosts.d/hosts-block | grep 0.0.0.0 | wc -w) domains" >> /etc/hosts.d/hosts-block
rm "$temphosts1a" "$temphosts1b" "$temphosts2a" "$temphosts2b" "$temphosts3" "$whitelists"
cp /etc/hosts.d/hosts-block /etc/hosts


echo "edithosts:Filters are up to date now."


else
  echo "edithosts:Internet connectivity is not OK, exit."
fi


exit 0


Skript se mi neukončí, chcípne to zřejmě po stažení toho whitelist.txt.
Kód: [Vybrat]
edithosts:Checking Internet connectivity...
edithosts:Internet connectivity OK...
2015-02-15 23:30:50 URL:https://raw.githubusercontent.com/jiri001meitner/edithosts/master/edithosts-blocklist.txt [96/96] -> "-" [1]
2015-02-15 23:30:52 URL:http://winhelp2002.mvps.org/hosts.txt [517675/517675] -> "-" [1]
2015-02-15 23:30:55 URL:http://hosts-file.net/.%5Cad_servers.txt [864253/864253] -> "-" [1]
2015-02-15 23:30:57 URL:http://someonewhocares.org/hosts/hosts [334463] -> "-" [1]
2015-02-15 23:31:03 URL:http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext [65325] -> "-" [1]
2015-02-15 23:31:04 URL:https://raw.githubusercontent.com/jiri001meitner/edithosts/master/whitelist.txt [13/13] -> "-" [1]



guest

Re:sed - smazání řádku
« Odpověď #7 kdy: 16. 02. 2015, 00:16:47 »
pomylil som si nazvy premennych :P lebo som nemal cely thread na ociach, jedine co som svojim editom povedat je, ze premennu $patern je dobre zabalit escape sekvenciou pre wordmatch, aby sa ti nestalo aby match pre host1 bol zaroven match pre host10. cize finalna verzia pre tvoj script:

for patern in $(cat $whitelist); do sed -i "/\b$patern\b/Id" $temphosts3; done

\b \b je regex pre wordmatch
/I (velke I) je pre case insensitive match, pouzi uz podla vlastneho zvazenia.

beer

  • *****
  • 729
    • Zobrazit profil
Re:sed - smazání řádku
« Odpověď #8 kdy: 16. 02. 2015, 01:03:43 »
Díky, funguje.

Re:sed - smazání řádku
« Odpověď #9 kdy: 05. 03. 2015, 14:35:53 »
more soubor |grep -A100 "Fráze v řádku, nad kterým se má vše smazat" | grep -B100 "Fráze v řádku, pod kterým se má vše smazat" | head -n-1 | tail -n+2 | Výstup

Zde N je 100, musí to bejt víc než počet všech řádků v souboru (okolo 40 jsem měl), kde jsem  to použil. S tím souvisí -A100 -B100. -n+číslo a -n-číslo si také můžeš poupravit. Fráze podle které se smazání řídí by se v souboru měla vyskytnoutjen jednou (a měla by tam bejt).