我无法将命令包装在手表内

我无法将命令包装在手表内

我有这个完美运行的命令:

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}'

我无法将其包装到监视命令中。这是我尝试过的:

  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
    
  2. 转义单引号和双引号 ('")

    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'
    
  3. 导出命令,然后以这种方式回调它:

     while : do ...<cmd>...; sleep 2;done
     watch -n 3 -x bash -c "$cmd" 
    

    它也不起作用,因为定义变量时会出现同样的问题。

  4. 我尝试使用以下命令制作脚本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}'\'

(请注意,原始代码中的最后一个''是与之前的内容连接的单引号空字符串。它没有任何改变。我的代码''完全省略了这个无用的内容。)

man 1 watch:

-c,--color
解释 ANSI 颜色和样式序列。

相关内容