2010-09-24 17 views
6

Mam mały skrypt bash, który greps/awk akapit przy użyciu słowa kluczowego.Jak przekazać dane wyjściowe AWK do zmiennej?

Po dodaniu dodatkowych kodów: set var = "(......)" wypisuje tylko pustą linię, a nie akapit.

Chciałbym zapytać, czy ktoś wie, jak poprawnie przekazać wyjście awk do zmiennej do wyprowadzania?

Moi kody:

#!/bin/sh 

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

Dzięki!

+2

Należy zawsze umieszczać podwójne cudzysłowy wokół zmiennych: 'echo" $ var "'. Zazwyczaj gryzie użytkowników za pomocą nazw plików zawierających spacje. –

Odpowiedz

5

Użyj command substitution, aby przechwycić dane wyjściowe procesu.

#!/bin/sh 

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

niektóre ogólne porady w odniesieniu do skryptów powłoki:

  • (prawie) zawsze podawać każdą zmienną odniesienia.
  • Nigdy nie umieszczaj spacji wokół znaku równości w przypisaniu zmiennych.
+0

Nie działa "linia 5: awk BEGIN {RS = ORS = \ n \ n: polecenie nie znaleziono" ... – JavaNoob

+2

użyj $() wszędzie tam, gdzie to możliwe! – ghostdog74

+1

@JavaNoob, musisz zachować ostrożność, używając odskoków w backtickach. zobacz tutaj http://mywiki.wooledge.org/BashFAQ/082 – lesmana

3
  • Musisz użyć "podstawiania poleceń". Komendę umieść w obu odgłosach: `COMMAND` lub w nawiasach poprzedzonych znakiem dolara: $(COMMAND).
  • Aby ustawić zmienną, nie należy używać set i nie można mieć spacji przed i po =.

Spróbuj tego:

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

Dałeś mi ten pomysł za zabicie procesu :). Po prostu chrom do tego, co chcesz zabić.

Spróbuj tego:

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

Generalnie chcesz użyć argumentu 'ps -C', tak jak w' ps -C chromium'.Używanie grepa z takim wyjściem ps w końcu wróci, by cię ugryźć, gdy w vimie jest otwarta nazwa pliku lub coś, co pasuje do polecenia, na które się szukałeś. I możesz określić, że tylko pid będzie na wyjściu, oszczędzając awk za pomocą 'ps -C chromium -o pid ='. – dannysauer

+0

Albo po prostu użyj 'killall chromium', jak sądzę;) – dannysauer

0

spróbuj utworzyć zmienną pochodzących z przechowalni/Hashicorp, przy użyciu zmiennych szablonu pakowacz, tak:

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

Można do tego samego z grep ^user

1

za każdym razem, gdy zobaczysz grep wyprowadzony do awk, możesz upuścić grep. do powyższego

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

awk można łatwo zastąpić dowolny rozkaz tekst jak cięcie, ogon, WC, TR itd., a especally wiele greps rurami obok siebie. tj.

grep some_co.mand | a | grep b ... to | awk '/a|b|and so on/ {some action}. 
Powiązane problemy