grep cambiando il delimitatore


12

in che modo possiamo cambiare il delimitatore che utilizza grep?

Penso che, per impostazione predefinita, grep usi \ncome delimitatore.


Sembra che sarebbe più adatto su SuperUser.com
Mitch Dempsey,

Leggi la pagina man, vedi se esiste una tale opzione (no, non credo ci sia).
Cascabel,

L'ho già letto e no, non vi è alcuna opzione

@jhon: Quindi non chiedere come cambiare grep, chiedi come fare quello che vuoi fare con qualcos'altro. Ad esempio, è possibile specificare il separatore di record in perl ( $/) e awk ( RS). Oppure potresti fare qualcosa del genere echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Molte molte risposte, a seconda del problema reale.
Cascabel,

Risposte:


2

Ti interessa solo l'output, trpotrebbe funzionare per te:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

in realtà, ho una gran quantità di dati come questo, memorizzati in una variabile: qualcosa xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ quindi, immaginavo se fosse possibile: echo $ my_var | grep "qualcosa" funziona, ma non come voglio, grep prende il gruppo di dati come una singola riga, ecco perché voglio cambiarlo in un carattere specifico (ecco '@')

Quindi potresti provare a metterlo in questo modo:echo $my_var | tr @ '\n' | grep blahblah
che

L'ho fatto, ma sembra che la shell stia "cercando di" eseguire il contenuto: S

2
Devi citare la variabile $my varper preservare gli spazi bianchi e le nuove linee, ad es echo "$my_var" | ....
mrucci,

1

agrepdall'Università dell'Arizona consente di impostare il delimitatore. Non è un sostituto drop-in per grep; utilizza un algoritmo diverso (grep approssimativo, può corrispondere a errori) e ha una sintassi del modello diversa. Ma è uno strumento utile.

Sfortunatamente, penso che a causa di problemi di licenza, siano stati chiamati più progetti simili agrepe non sono tutti compatibili. Ma penso che tutte le versioni ti consentano di impostare un delimitatore.


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) Sebbene ciò possa risolvere il problema, preferiamo che le risposte abbiano qualche spiegazione in più. Ad esempio, c'è qualche vero motivo per dire d="${1}"invece che solo d="$1"? (2) È necessario espandere l'avviso: se utilizzato con più file, si verifica anche un problema se uno dei nomi di file contiene "@". (3) (Nit pick) Un vero sostituto / emulatore “grep” funzionerebbe anche con argomenti file zero.
Scott,

1

Sostituisci il delimitatore zero ('@') con una nuova riga (\ n) prima di grep:

file cat | tr '\ 00' '\ n' | grep "stringa di ricerca"


0

Com'è questo ? Qualche uso?

file grep "stringa di ricerca" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Impostare "@" su quello che si adatta alle proprie esigenze.

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.