Usa grep per riportare solo i numeri di riga


106

Ho un file che potrebbe contenere una formattazione errata (in questo caso, l'occorrenza del pattern \\backslash). Vorrei utilizzare grepper restituire solo i numeri di riga in cui si verifica (come in, la corrispondenza era qui, vai alla riga # x e risolvila).

Tuttavia, non sembra esserci un modo per stampare il numero di riga ( grep -n) e non la corrispondenza o la riga stessa.

Posso usare un'altra regex per estrarre i numeri di riga, ma voglio assicurarmi che grep non possa farlo da solo. grep -nosi avvicina di più, penso, ma mostra comunque la corrispondenza.


1
La risposta più utile per me era nella domanda grep -no:! Questo ha fatto quello che sono venuto qui per provare a fare! (cioè non stampare la riga che a volte è molto lunga, ad esempio, file sorgente javascript minimizzati.)
LondonRob

Risposte:


156

provare:

grep -n "text to find" file.ext | cut -f1 -d:

1
Sulla mia macchina, sto stampando solo i file corrispondenti senza numeri di riga (quindi se ho 3 corrispondenze all'interno di un file viene stampato solo una volta), il che è ancora molto utile ...
Mario Awad

3
@MarioAwad, dovresti manipolare -fparam. Per me lo è stato -f2. (So ​​che è roba vecchia, ma penso che potrebbe aiutare alcune povere anime)
Emil Sierżęga

grazie per il bellissimo scripting della shell ad hoc per unix. questo dimostra che gli strumenti flessibili valgono la loro complessità e curva di apprendimento!
Alex

12
grep -n "text to find" file.ext | cut -f1,2 -d:mostra il nome del file e il numero di riga.
Jondlm

2
@jondim mostra solo il nome del file se è presente più di un file da cercare; è necessario aggiungere -Hper forzare la visualizzazione del nome del file quando è presente un solo file. Al contrario, puoi sempre usare -hper dirgli di non visualizzare il nome del file, indipendentemente dal numero di file che stai greppando.
Mark Reed

45

Se sei disposto a utilizzare AWK:

awk '/textstring/ {print FNR}' textfile

In questo caso, FNR è il numero di riga. AWK è un ottimo strumento quando guardi grep | cut, o ogni volta che stai cercando di prendere l'output di grep e manipolarlo.


2
Utilizza un processo (che contava di più in passato, ma ancora), e abbastanza facile da capire per i principianti awk!
bgStack15

NRfunziona anche quando c'è un solo file in esame, come in questo caso.
Mark Reed

Semplicemente geniale! È così veloce!
GTodorov

34

Tutte queste risposte richiedono che grep generi le intere linee di corrispondenza, quindi le invii a un altro programma. Se le tue righe sono molto lunghe, potrebbe essere più efficiente usare just sed per produrre i numeri di riga:

sed -n '/pattern/=' filename

2

Versione Bash

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}

1
E cosa succede se più di una riga corrisponde a quel modello?
izabera

@izabera add | coda -1
Diego

1

Raccomando le risposte con sede awksolo per ottenere il numero di riga, invece di utilizzare grepper ottenere l'intera riga di corrispondenza e quindi rimuoverla dall'output con cuto un altro strumento. Per completezza, puoi anche usare Perl:

perl -nE '/pattern/ && say $.' filename

o Ruby:

ruby -ne 'puts $. if /pattern/' filename

0

Vorrai il secondo campo dopo i due punti, non il primo.

grep -n "text to find" file.txt | cut -f2 -d:


Funziona se si desidera abbinare il testo, ma nel caso in cui il numero di riga sia quello che l'OP stava chiedendo.
AJP

0

Per contare il numero di righe corrispondenti al modello:

grep -n "Pattern" in_file.ext | wc -l 

Per estrarre il modello abbinato

sed -n '/pattern/p' file.est

Per visualizzare i numeri di riga su cui è stato trovato il modello

grep -n "pattern" file.ext | cut -f1 -d:

2
Il primo dovrebbe essere solo "grep -c 'Pattern' in_file.ext". Il secondo dovrebbe essere "grep -o 'Pattern' in_file.ext". Non c'è bisogno di coinvolgere sed o wc.
thelogix

0

usando solo grep :

grep -n "text to find" file.ext | grep -Po '^[^:]+'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.