Ich versuche, die übereinstimmende Zeile und die vierte Zeile aus der übereinstimmenden Zeile (Zeile mit dem gesuchten Ausdruck) zu drucken.
Ich habe den folgenden Code verwendet:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Es wird jedoch nur die übereinstimmende Zeile gedruckt.
Dies druckt nur die 4. Zeile.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Ich muss nur die übereinstimmende Zeile und die vierte Zeile drucken.
shell-script
debal
quelle
quelle
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
macht genau das, was Sie wollen, es sei denn, ich missverstehe Sie</td>
nicht die 4. ZeileAntworten:
In awk würden Sie das wie folgt machen
oder
Erläuterung
Die erste Lösung findet alle übereinstimmenden Zeilen
pattern
. Wenn eine Übereinstimmung gefunden wird, wird die Datensatznummer (NR
) im Array gespeichertnr
. Es speichert auch den 4. DatensatzNR
in demselben Array. Dies geschieht durch dienr[NR+4]
. Jeder Datensatz (NR
) wird dann überprüft, um festzustellen, ob er imnr
Array vorhanden ist. In diesem Fall wird der Datensatz gedruckt.Die zweite Lösung funktioniert im Wesentlichen genauso, außer wenn sie auf
pattern
diese Zeile stößt und dann den vierten Datensatz davor im Array speichert und dannnr
zum nächsten Datensatz wechselt. Wenn Sie dannawk
auf diesen 4. Satz stoßen, wird derNR in nr
Block ausgeführt und gibt diesen +4 Satz danach aus.Beispiel
Hier ist ein Beispiel für eine Datendatei
sample.txt
.Verwendung der 1. Lösung:
Verwendung der 2. Lösung:
quelle
awk
Verknüpfungen. Können Sie eine kurze Erklärung hinzufügen (z. B., dass Print in awk impliziert ist und Arrays assoziativ usw. sind)?Ich füge einfach vor dem Drucken eine Löschung der entsprechenden Zeilen hinzu
{ 3,5d ; p }
.quelle
sed: -e expression #1, char 18: unknown option to
s'`Sie können es mit der
-A
Option versuchengrep
, die angibt, wie viele Zeilen nach der übereinstimmenden Zeile gedruckt werden sollen. Wenn Sie dies mit koppelnsed
, erhalten Sie die erforderlichen Zeilen.grep -A 4 pattern input.txt | sed -e '2,4d'
Mit
sed
löschen wir die von der zweiten bis zur vierten Zeile.quelle
pattern
in der Datei voraus .Hier ist ein Weg in Perl, der mit einer beliebigen Anzahl übereinstimmender Zeilen umgehen kann:
In Perl. Die spezielle Variable
$.
ist die aktuelle Zeilennummer. Jedes Mal, wenn ich eine passende Zeile finde, druckepattern
ich sie aus und speichere ihre Zeilennummer unter$c
. Ich drucke dann erneut, wenn die aktuelle Zeilennummer 4 mehr ist als die zuvor gedruckte.quelle
Sie machen im Wesentlichen ein Suchen und Ersetzen. Sie können demselben Befehl nur einen Fund hinzufügen , der beide ausgibt :)
quelle