Bash
我不能在手錶內包裝命令
我有這個完美的工作命令:
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 命令。這是我嘗試過的:
- 轉義所有單引號 (
'
)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
- 轉義單引號和雙引號 (
'
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'
- 導出命令,然後以這種方式呼叫它:
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 )