我有这个完美运行的命令:
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 '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
转义单引号和双引号 (
'
和"
)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"
它也不起作用,因为定义变量时会出现同样的问题。
我尝试使用以下命令制作脚本
while : do ...<cmd>...; sleep 2;done
它不起作用,因为看起来没有考虑睡眠延迟;结果,输出速度太快——无法读取内容。
答案1
您没有共享在基于循环的尝试中使用的完整代码,因此这里有一些选项,您必须避免处理多层引用,自由地基于稍微修改的 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"
,您可以将命令替换和此处文档结合起来。如果此处文档的标签被引用(此处为'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
)
答案2
将所有内容括在单引号中并正确转义旧单引号的命令几乎很好。它打印“垃圾”,因为您没有使用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}'\'
(请注意,原始代码中的最后一个''
是与之前的内容连接的单引号空字符串。它没有任何改变。我的代码''
完全省略了这个无用的内容。)
-c
,--color
解释 ANSI 颜色和样式序列。