簡體   English   中英

使用awk for for循環的Bash腳本

[英]Bash script using awk in for loop

for i in $LIST
do
  CFG=`ssh $i "cat log.txt|awk '{print $2}'"`
  for j in $CFG
  do
    echo $j
  done
done

假設我想在一對遠程主機上的日志文件中打印第二個字段。 在上面的腳本中,打印$ 2不起作用。 我怎樣才能解決這個問題? 謝謝。

根據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}'"`

嘗試

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

確保你從shell ssh listvalue cat log.txt|awk '{print }'$2 - 你現在最終發送的ssh命令是這樣的: ssh listvalue cat log.txt|awk '{print }'

for server in $LIST
do
   ssh "$server" 'awk "{print $2}" log.txt'
done
  • 仔細觀察single-quotedouble-quote
  • Bash嘗試在double-quote( " )中擴展變量( words beginning with $ )。
  • 單引號( ' )阻止Bash查找內部變量。
  • 正如user131527psj建議的那樣,使用\\轉義$2也應該有效(取決於你的Bash配置方式)。

失去了貓。 沒用的..

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

我能夠將awk放入雙循環中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM