2010-09-30 51 views
3
for i in $LIST 
do 
    CFG=`ssh $i "cat log.txt|awk '{print $2}'"` 
    for j in $CFG 
    do 
    echo $j 
    done 
done 

說我想在遠程主機上的日誌文件中打印第二個字段。在上面的腳本中,打印$ 2不起作用。我怎樣才能解決這個問題?謝謝。在for循環中使用awk的bash腳本

+1

使用'cat'是不必要的:'CFG = $(SSH $ I「的awk '{打印$ 2}' 日誌.txt「)' – 2010-09-30 22:16:24

回答

3

嘗試

for i in $LIST 
do 
    ssh $i "cat log.txt|awk '{print \$2}'" 
done 
+0

謝謝,但我剛剛編輯了我的問題。現在反斜槓不起作用。你可以再看一遍嗎? – Stan 2010-09-30 22:06:17

+0

我不確定你在那裏試圖做什麼。你只是想爲$ LIST中的每個主機輸出第二列「log.txt」? – psj 2010-09-30 22:31:41

1

確保你從殼逸出$2 - 你結束了,現在發送ssh命令是這樣的:ssh listvalue cat log.txt|awk '{print }'

0

失去了一隻貓。它沒用..

for server in $LIST 
do 
    ssh "$server" "awk '{print \$2}' log.txt" 
don 
4

根據shell擴展的數量和報價多反斜槓的類型,需要:

awk '{ print $2 }' log.txt # none 
ssh $server "awk '{ print \$2 }' log.txt" # one 
CFG=`ssh $server "awk '{ print \\$2 }' log.txt"` # two 
CFG=$(ssh $server "awk '{ print \$2 }' log.txt") # one (!) 

正如一招就可以把美元符號和兩個之間的空間以防止所有$擴展。 AWK仍然會粘一起:

CFG=`ssh $i "cat log.txt|awk '{print $ 2}'"` 
+1

這個答案非常有幫助!感謝schot! – Stan 2010-10-05 17:36:59

1
for server in $LIST 
do 
    ssh "$server" 'awk "{print $2}" log.txt' 
done 
  • 仔細觀察single-quotedouble-quote的位置。
  • Bash嘗試將雙引號(")內的變量(words beginning with $)展開。
  • 單引號(')停止Bash尋找內部變量。
  • 作爲user131527psj建議,逃避$2\也應該有工作(根據您的Bash是如何配置的)。
0

我能夠把AWK在雙for循環

for i in 1 2 3 4;do for j in $\(ls | awk -v I=$i '{print $I}'); echo $j done; done

+0

一定要在你的答案中設置你的代碼的格式,使它看起來像代碼'''''''' – unmultimedio 2017-03-10 19:01:00

+1

@unmultimedio編號SO在代碼塊內的所有行的開頭使用四個空格 – FelixSFD 2017-03-10 19:35:52

+0

你說得對,它是'代碼行使用'code'',代碼塊使用4個空格 – unmultimedio 2017-03-10 21:10:09