web-dev-qa-db-fra.com

Comment grep une chaîne après un numéro de ligne spécifié?

J'ai un gros fichier texte, je veux voir les lignes contenant "time spent" dans ce fichier texte, j'utilise:

grep -in "time spent" myfile.txt

Mais je ne m'intéresse qu'aux lignes après 50000. Dans la sortie, je veux voir les lignes après 50000 et qui contiennent du "temps passé". Y a-t-il un moyen de faire cela?

22
alwbtc

Vous pouvez le suivre, puis grep:

tail -n +50000 myfile.txt | grep -in "time spent"
36
adray

Vous pouvez également utiliser sed. sed peut être utilisé pour imiter grep comme ceci:

sed -n 's/pattern/&/p'

Par défaut, sed imprime chaque ligne même si aucune substitution ne se produit. Les combinaisons de -n et /p fait sed imprimer uniquement les lignes où une substitution s'est produite. Enfin, nous remplaçons pattern par & ce qui signifie remplacer pattern par lui-même. Résultat: nous avons simplement imité grep.

Maintenant, sed peut prendre une série de lignes sur lesquelles agir. Dans ton cas:

sed -n '50000,$s/time spent/&/p' myfile.txt

Le format pour spécifier la plage est le suivant: start,end Nous demandons simplement à sed de travailler de la ligne 50000 à $ ce qui signifie la dernière ligne.

5
neric

Réponse pour la grepping entre 2 numéros de ligne:

Using sed and grep:

sed -n '1,50000p' someFile | grep < your_string >
4
K.K

Vous pouvez utiliser head + grep et grouper les commandes avec {...} afin qu'ils partagent la même entrée:

{ head -n 50000 >/dev/null; grep -i PATTERN; } < infile

head ne consomme pas l'intégralité de l'entrée, il n'obtient que les 50000 premières lignes et les sauvegarde dans /dev/null; les lignes restantes sont traitées par grep.
Si vous avez besoin des numéros de ligne ajoutés (comme avec grep -in) vous pouvez utiliser awk:

awk 'NR>50000 && tolower($0)~/PATTERN/{print NR ": " $0}' infile
1
don_crissti