Comment puis-je lire un certain nombre de lignes après avoir trouvé du texte?
Par exemple.:
Lisez les 2 lignes suivantes après avoir trouvé "Unix" sur:
Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9
Le résultat peut être:
Test 5
Test 6
Remarque: "Unix" sur le dernier exemple est un argument, et ainsi, il peut s'agir de n'importe quel autre texte.
Ce que j'ai:
Je suis toujours à court d'idées, j'ai juste besoin d'une lumière. Penser à créer un autre script pour ce faire.
$
signe au début de ma réponse est l'invite du shell, ne fait pas partie de laawk
commande.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
Une
grep
solution:Explication:
-A
signifie: imprimer les deux lignes suivantes après la correspondanceOu
awk:
Explication: Cette instruction recherche UNIX dans la ligne (
$0=="UNIX"
). Si cela est donné, il obtient le suivant dans son buffer (getline
) et imprime le buffer (print
). Cela se fait deux fois.Ou utilisez
sed
:Explication: cela recherche UNIX (
/^UNIX$/
). S'il est trouvé, il exécute la pièce dans le fichier{...}
.n
signifie ensuite,p
signifie imprimer. Cela se fait également deux fois.la source
getline; print;
partie de l'awk
instruction ou lan;p;
partie de l'sed
instruction.grep -A100 -P '^UNIX$' file | tail -n +2
. La partie arrière consiste à supprimer le premier privilège. Dans les autres (sed, awk), il faudrait écrire des boucles, ce qui le rend moins simple.La page de manuel de grep décrit ainsi l'option:
la source
UNIX
en sortie.UNIX
pipe àtail
:[...] | tail -n +1
ou àsed
:[...] | sed '1d'
.tail
et nesed '1d'
fonctionnent correctement que siUNIX
n'apparaît qu'une seule fois dans le texte saisi. Toutes les autres réponses permettent plusieurs occurrences. Il serait peut-être préférable de suggérer... | grep -v UNIX
. Certes, cela devient désordonné siUNIX
apparaît sur les lignes 15 et 17.sed
avec une certaine forme desed '/UNIX/d;n;n;p/' /path/to/file
, que je viens d'évoquer et de soumettre comme réponse.Cela semble bien faire l'affaire:
Preuve de concept:
la source
for
boucle n'est pas nécessaire.Vous pouvez utiliser
ex
:où:
1,/UNIX/d
- supprime le texte après la correspondance%p
- tampon d'impressionq!
- quitter sans enregistrer les modifications apportées au fichier (utiliserwq
pour modifier sur place)la source