2010-09-24 11 views
6

Ho un piccolo script bash che grep/awk paragrafo utilizzando una parola chiave.Come passare l'output AWK in variabile?

Ma dopo aver aggiunto i codici aggiuntivi: set var = "(......)" stampa solo una riga vuota e non il paragrafo.

Quindi mi piacerebbe chiedere se qualcuno sa come passare correttamente l'output di awk in una variabile per l'output?

miei codici:

#!/bin/sh 

set var = "(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop 
/logs/Default.log)" 
echo $var; 

Grazie!

+2

Prendere l'abitudine di mettere sempre virgolette doppie attorno alle variabili: 'echo" $ var "'. Questo in genere morde gli utenti con nomi di file contenenti spazi. –

risposta

5

Utilizzare command substitution per acquisire l'output di un processo.

#!/bin/sh 

VAR="$(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop/logs/Default.log)" 
echo "$VAR" 

alcuni consigli generali per quanto riguarda scripting di shell:

  • (quasi) sempre citare ogni riferimento variabile.
  • non inserire mai spazi attorno agli uguali firmare l'assegnazione della variabile.
+0

Impossibile funzionare "riga 5: awk BEGIN {RS = ORS = \ n \ n: comando non trovato" ... – JavaNoob

+2

utilizza $() dove possibile! – ghostdog74

+1

@JavaNoob, devi stare attento con le barre retroverse all'interno dei backtick. vedere qui http://mywiki.wooledge.org/BashFAQ/082 – lesmana

3
  • È necessario utilizzare "sostituzione di comando". Inserire il comando all'interno di entrambi i backtick, `COMMAND` o, in una coppia di parentesi precedute da un segno di dollaro, $(COMMAND).
  • Per impostare una variabile non utilizzare set e non è possibile avere spazi prima e dopo lo =.

Prova questo:

var=$(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop/logs/Default.log) 
echo $var 
2

Tu mi ha dato l'idea di questo processo per l'uccisione di un :). Solo cromo per qualunque processo tu voglia uccidere.

Prova questo:

VAR=$(ps -ef | grep -i chromium | awk '{print $2}'); kill -9 $VAR 2>/dev/null; unset VAR; 
+0

Generalmente si desidera utilizzare l'argomento 'ps -C', come in' ps -C chromium'.L'uso di grep con l'output di ps come questo alla fine tornerà a morderti quando c'è un nome di file aperto in vim o qualcosa che corrisponda al comando per cui stavi per grepping. E puoi specificare che solo il pid sia nell'output, salvando awk usando 'ps -C chromium -o pid ='. – dannysauer

+0

O semplicemente uso 'killall chromium', immagino;) – dannysauer

0

tenta di creare una variabile proveniente dal caveau/Hashicorp, quando si utilizzano le variabili di modello packer, in questo modo:

BUILD_PASSWORD=$(vault read secret/buildAccount| grep ^password | awk '{print $2}') 
echo $BUILD_PASSWORD 

È possibile per lo stesso con grep ^user

1

ogni volta che vedi grep pipe per awk, puoi abbandonare grep. per quanto sopra,

awk '/^password/ {print $2}' 

awk può facilmente sostituire qualsiasi comando di testo come taglia, coda, wc, tr ecc e rifatto più greps convogliato accanto all'altro.

grep some_co.mand | a | grep b ... to | awk '/a|b|and so on/ {some action}. 
Problemi correlati