
Ich verwende den folgenden Befehl, um eine Liste von IP-Adressen in einer Zeile auszugeben, mit der Anweisung „working IP“ nach jeder IP
cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' | sed 's/$/ working IP/' | sed -e '0,/ working IP/ s/ working IP//' | sed '$ d' | paste -s -d ' ' | sed 's/working IP$//'
Die Ausgabe sieht folgendermaßen aus:
147.123.41.112 working IP 129.138.70.113 working IP 173.230.45.54 working
IP 133.218.250.56 working IP 136.203.152.128 working IP 117.22.29.254
working IP 117.3.11.111 working IP 127.59.131.236
Ich habe es mehrmals in sed weitergeleitet, damit es so aussieht, wie ich es wollte. Gibt es einen besseren Ansatz als die mehrmalige Verwendung von sed?
Antwort1
Es geht nicht nur darum, mehrere sed
Befehle zu kombinieren (Jasen hat diesen Teil in seiner Antwort erklärt). Sie können noch mehr lernen:
cat file | sort ...
cat
ist nicht erforderlich, da Sie einen Dateinamen angeben können sort
, müssen Sie cat
vorher nicht, aber tun Sie
sort file | uniq -c | awk ...
uniq -c
entfernt Duplikate und fügt eine Anzahl hinzu, aber da im Folgenden awk
nur der dritte Comlun verwendet wird, wird die Anzahl sowieso gelöscht. Sie können das löschen -c
und das Ganze durch die uniq
Option ersetzen :-u
sort
sort -u file | awk -F " " '{print $2}' | sed ...
Hier verwenden Sie awk
for falsch, aber das steht Ihnen frei. Jetzt können Sie diesen Schritt cut -d" " -f 2
aber auch weiterhin in verwenden oder ausführen . Sie müssen für eine Aufgabe, die in jedem Tool gleichermaßen erledigt werden kann, nicht zwischen den Tools wechseln:awk
sed
sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/' ...
Hier wird es langsam seltsam, wenn man die Eingabedatei nicht kennt. Aber wenn man working IP
an jede Zeile anfügt und es dann für alle im Bereich entfernt, bis es zum ersten Mal vorkommt, sollte es identisch sein mit dem Anfügen an alle Zeilen außer der ersten:
sort -u file | sed 's/[^ ]* *//;s/ .*//;1!s/$/ working IP/'
Als nächstes kann das paste
einfach in aufgenommen werden, sed
indem man die Zeilen im Hold-Bereich sammelt und später die ersten Zeilenumbrüche durch ein Leerzeichen ersetzt, alle anderen durch working IP
. Gleichzeitig kann die Entfernung der letzten Zeile ( ) erfolgen, so dass die ganze meilenlange Kommandozeile mit 6 verschiedenen Befehlen und 8 Pipes auf ein einfaches , nur eine Pipe und ein kurzes Skript $ d
reduziert wird :sort
sed
sort -u file | sed 's/[^ ]* *//;s/ .*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'
Identisches Ergebnis, ohne ein Leben lang die Optionen seitenweise durchzulesen man
und zu analysieren, was in jeder Phase passiert.
Antwort2
es ist wahrscheinlich möglich, die ersten drei sed-Aufrufe wie folgt zu kombinieren
cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' |
sed 's/$/ working IP/;s/ working IP//; $ d' | paste -s -d ' ' |
sed 's/working IP$//'
Aber das lässt sich schwer sagen, ohne zu wissen, welche Eingaben zulässig sind und welche Ausgaben erwünscht sind.