Come posso analizzare una riga attraverso un file in bash


0

Sono molto nuovo con lo scripting della shell. Ho avuto una piccola domanda sull'analisi dei file.

Quindi, ecco cosa sto cercando di fare:
eseguo un comando svn merge e il file di conflitto genaratea il mio file di conflitto viene archiviato come conflitti.txt

Quello che voglio fare è leggere questo file riga per riga e analizzare una riga per confrontarla con alcune parole chiave.

Ad esempio, una delle righe nei file è simile alla seguente:
C Client/Game/src/test/test.php

Ora voglio analizzare questa riga e cercare la parola chiave test, nel caso in cui la trovassi, voglio fare qualche azione su di essa, ad esempio interrompere con lo stato di uscita 2, 3, ecc.

ad esempio, voglio scorrere attraverso un file di testo chiamato "FILENAME" che assomiglia a questo

30 '!' C Client/test.js

31 '!' C Client/test2.js

32 '!' C Client/test3.js `

quello che sto facendo è catturare il file usando il ciclo while e il comando gatto

cat $FILENAME | while read LINE do echo $LINE done

qui sto solo stampando la linea, voglio sapere come posso cercare un keyworkd nella linea e se trovo quella parola chiave come posso fare qualche azione su di essa come uscire con lo stato 1

Puoi per favore suggerire un modo per farlo ...


Non sono sicuro di quello che stai cercando di fare, ma sembra che tutto ciò di cui hai bisogno sia già lì. Dai un'occhiata allo strumento grep.
SBI,

Si prega di includere alcuni esempi specifici. Mostraci il tuo file di input e il tuo output previsto. Hai una o più parole chiave?
terdon,

@terdon ho modificato la mia domanda
Riddle

Risposte:


2

Esistono molti modi per farlo, a seconda delle tue esigenze.

  1. Stampa semplicemente tutte le righe contenenti la parola chiave test:

    grep test file.txt
  2. Lo stesso ma per molte parole chiave. Crea un file con tutte le parole chiave, una per riga ed esegui

    grep -f keywords.txt file.txt
  3. Elabora un file riga per riga, esce se viene trovata la riga

    while read line; do echo $line | grep test && break; done < file.txt
  4. Esci con lo stato 1 se la riga corrisponde. Sfortunatamente, se ricordo bene (non sicuro al 100%), bash ti permette solo di impostare valori di ritorno nelle funzioni. Quindi, per ottenere uno stato di uscita devi usare qualcos'altro. Perl ad esempio:

    perl -ne '/test/ && exit(1)' file.txt
  5. Anche se non puoi impostare un valore di uscita, puoi comunque fare qualcosa di simile con bash. Il valore di uscita dell'ultima esecuzione del comando viene sempre salvato come $?in bash, ciò significa che è possibile verificare il valore di $?e agire di conseguenza:

    while read line; do let c++; echo $line | grep test >/dev/null; 
      if [[ $? == 0 ]] ; then echo Match for line $c : $line;
      else echo No match for line $c; fi  
    done < file.txt 
    

0

Il modo più semplice non è affatto analizzare il file riga per riga.

grep -q 'keyphrase' filename && exit <exitcode> 

Non lavorare come root nella shell solo per grep una stringa da un file.
ott--

Non mi occupo ancora di formattazione :)
madlynx,

0
$ function some_action { 
    echo found keyword
}

$ if grep -q -m1 -e 'test3' < input;
  then 
      some_action
  fi
found keyword

opzioni grep:

  • -q: silenzioso; non stampare le partite
  • -m1: esce dopo una partita
  • -e: espressione (parola chiave)

per esempio:

$ grep . input
30 '!' C Client/test.js
31 '!' C Client/test2.js
32 '!' C Client/test3.js

$ if grep -q -m1 -e 'test3' < input; then some_action ; fi
found keyword
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.