Bash

我不能在手錶內包裝命令

  • August 13, 2021

我有這個完美的工作命令:

netstat -tuplean | awk '{NR>1; if( $6 ~ /ESTABLISHED/ ) print "\033[0;31m" $5  "   \033[01;31m"$6;if ($6 ~ /_WAIT/ ) print "\033[0;34m"$5  "   \033[01;32m"$6}'

我無法將其包裝成 watch 命令。這是我嘗試過的:

  1. 轉義所有單引號 ( ')
watch 'netstat -tuplean | awk '\''{NR>1; if( $6 ~ /ESTABLISHED/ ) print "\033[0;31m" $5  "   \033[01;31m"$6
 if ($6 ~ /_WAIT/ ) print "\033[0;34m"$5  "   \033[01;32m"$6}'\'''

輸出:

^[0;31m34.210.39.83:443   ^[01;31mESTABLISHED
^[0;31m34.107.221.82:80   ^[01;31mESTABLISHED
^[0;31m34.107.221.82:80   ^[01;31mESTABLISHED
^[0;34m34.117.59.81:80   ^[01;32mTIME_WAIT
^[0;34m34.117.59.81:80   ^[01;32mTIME_WAIT
^[0;31m192.168.0.1:67   ^[01;31mESTABLISHED
  1. 轉義單引號和雙引號 ( 'and ")
watch 'netstat -tuplean | awk '\''{NR>1; if( $6 ~ /ESTABLISHED/ ) print '\'"\033[0;31m'\'" $5  "   \033[01;31m'\'"$6
 if ($6 ~ /_WAIT/ ) print '\'"\033[0;34m'\'"$5  '\'"   \033[01;32m'\'"$6}'\'''

輸出:

bash: syntax error near unexpected token `print'
  1. 導出命令,然後以這種方式呼叫它:
while : do ...<cmd>...; sleep 2;done
watch -n 3 -x bash -c "$cmd" 

它也不起作用,因為在定義變數時會出現相同的 pb 。 4. 我嘗試使用while : do ...<cmd>...; sleep 2;done

它不起作用,因為看起來睡眠延遲沒有被考慮在內,所以輸出出來的速度太快了,沒有辦法讀取東西。

將所有內容括在單引號中並正確轉義舊單引號的命令幾乎是好的。它列印“垃圾”,因為您沒有使用watch --color. 執行這個:

watch --color 'netstat -tuplean | awk '\''{NR>1; if( $6 ~ /ESTABLISHED/ ) print "\033[0;31m" $5  "   \033[01;31m"$6
 if ($6 ~ /_WAIT/ ) print "\033[0;34m"$5  "   \033[01;32m"$6
 if ($6 ~ /TIME_WAIT/ ) print "\033[0;34m"$5  "   \033[01;32m"$6}'\'

(請注意,''原始程式碼中的最後一個是單引號空字元串,與之前的內容連接。它沒有任何改變。我的程式碼''完全省略了這個沒用的。)

來自man 1 watch

-c,--color

解釋 ANSI 顏色和样式序列。

您沒有共享您在基於循環的嘗試中使用的完整程式碼,因此這裡有一些選項您必須避免處理多個級別的引用,這些選項基於稍微修改的 AWK 腳本。

您可以將程式碼保存為執行檔:

#!/bin/bash

netstat -tuplean | awk '
 $6 ~ /ESTABLISHED/ { print "\033[0;31m" $5  "   \033[01;31m"$6 }
 $6 ~ /_WAIT/ { print "\033[0;34m"$5  "   \033[01;32m"$6 }
 $6 ~ /TIME_WAIT/ { print "\033[0;34m"$5  "   \033[01;32m"$6 }
 END { printf("%s","\033(B\033[m") }      # Turn fancy formatting off'

並執行它,請注意,正如您已經擁有的答案watch中指出的那樣,您還需要以下選項:--color

watch -n 3 --color ./my_script

或者,您可以使用無限循環——我無法猜測為什麼在您的情況下,“沒有考慮睡眠延遲”;這似乎按預期工作:

while :
do
 clear
 netstat -tuplean | awk '
   $6 ~ /ESTABLISHED/ { print "\033[0;31m" $5  "   \033[01;31m"$6 }
   $6 ~ /_WAIT/ { print "\033[0;34m"$5  "   \033[01;32m"$6 }
   $6 ~ /TIME_WAIT/ { print "\033[0;34m"$5  "   \033[01;32m"$6 }
   END { printf("%s","\033(B\033[m") }     # Turn fancy formatting off'
 sleep 3
done

要將腳本保存在變數中並將其作為 執行bash -c "$cmd",您可以將命令替換和 here-document 結合使用。如果 here-document 的標籤被引用(此處,'EOT'),則其內容不會被擴展:

cmd=$(cat <<'EOT'
netstat -tuplean | awk '
 $6 ~ /ESTABLISHED/ { print "\033[0;31m" $5  "   \033[01;31m"$6 }
 $6 ~ /_WAIT/ { print "\033[0;34m"$5  "   \033[01;32m"$6 }
 $6 ~ /TIME_WAIT/ { print "\033[0;34m"$5  "   \033[01;32m"$6 }
 END { printf("%s","\033(B\033[m") }      # Turn fancy formatting off'
EOT
)

引用自:https://unix.stackexchange.com/questions/664519