GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - grep de certaines lignes à la fin du fichier

Je veux "grep" de la "ligne 2A" à la fin du fichier :

sed -n '/2A/,$p'
  • -n :supprime sed sortie par défaut
  • /2A/ :lignes de sortie de la première contenant "2A"
  • $ :vers la fin du fichier

Je veux "grep" de la "ligne 2A" à la ligne suivante qui contient "A":

sed -n '/2A/,/A/p'
  • /A/ :sortie jusqu'à ce qu'une ligne contienne "A"

Je veux "grep" de la première ligne contenant "A" à la suivante :

printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

(développé à partir du commentaire)

awk a la capacité de sélectionner des "gammes" de lignes qui correspondent parfaitement à ce besoin, comme décrit dans le manuel GNU-awk (gawk). (Cette fonctionnalité fonctionne dans d'autres awk s mais le gawk le manuel est facile à lier.)

awk '/line 2A/,0' imprime les lignes commençant par la première qui correspond à line 2A et continue jusqu'à la fin de la saisie car 0 est une condition qui n'est jamais vraie.

awk '/line 2A/,/A/&&!/line 2A/' commence l'impression avec une ligne qui correspond à line 2A et s'arrête après une ligne qui correspond à A mais PAS line 2A (et ne peut donc pas être la même ligne que la ligne de départ). Ça va recommencer sur une suite line 2A etc; si vous voulez éviter cela, il existe des moyens légèrement plus compliqués de le faire.

Si les lignes d'arrêt ont toujours un caractère autre que 2 avant le A cela peut être simplifié en awk '/line 2A/,/[^2]A/' qui s'arrête après une ligne qui correspond à n'importe quel caractère autre que 2, suivi de A. Vous voudrez peut-être une variante de ceci, par ex. pour s'arrêter sur n'importe quel A à un seul chiffre différent de 2A, mais pas d'autre comme WHAT; pour cela la condition d'arrêt pourrait être ,/line [013-9]A/ .


Je pense que la meilleure façon est d'utiliser grep en combinaison avec cut et tail . Tout d'abord, utilisez grep pour obtenir la ligne sur laquelle se trouve la chaîne souhaitée (-n pour sortir le numéro de ligne ; -m 1 pour arrêter la recherche après la première correspondance) :

grep -n -m 1 "somestring" filename.txt

Cela génère le numéro de ligne et la chaîne elle-même. Pour couper la chaîne, nous utilisons cut (-f1 :premier champ de sortie ; -d: utilisez ":" comme délimiteur) :

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

Ensuite, nous utilisons la sortie de cette commande comme paramètre dans tail. Normalement, tail imprime les k dernières lignes, mais en utilisant -n +k , nous obtenons la queue à imprimer à partir de la ligne k. La commande totale est :

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

Pour sortir les lignes jusqu'à somestring utilisez head au lieu de tail et -n -# au lieu de -n +# . Vous pouvez également combiner les deux pour obtenir les lignes d'une chaîne à l'autre.


Linux
  1. Utilisation de Google Drive à partir de la ligne de commande Linux

  2. Comment boucler sur les lignes d'un fichier ?

  3. Avec la commande "cat" de Linux, comment afficher uniquement certaines lignes par numéro ?

  4. Tirer au hasard un certain nombre de lignes à partir d'un fichier de données ?

  5. Aller au début ou à la fin du fichier dans Vim [Quick Tip]

Programmer le matériel à partir de la ligne de commande Linux

Copier un fichier dans plusieurs répertoires à partir de la ligne de commande sous Linux

Rapports d'E/S à partir de la ligne de commande Linux

Afficher le contenu d'un fichier dans la ligne de commande Linux

Comment trouver la ou les lignes les plus longues dans un fichier sous Linux

5 commandes pour afficher le contenu d'un fichier en ligne de commande Linux