如何使这个 awk 命令起作用

如何使这个 awk 命令起作用

我想让下面的命令起作用,但我做不到。请检查一下:

echo "random string random string mark: abcde random string random string" |
    awk '{gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"); print}'

我希望这个命令只返回“abcde”。但它总是返回整个输入字符串。为什么?

答案1

命令 gensub 不会改变字符串。结果是函数的输出。

请尝试:

echo "random string random string mark: abcde random string random string" |
awk '{print(gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"))}'

编辑:

事实证明,用户需要解析顶部输出,这就是(按照用户的要求):

top -b -n 1 -d 1 |
awk 'NR==1{print(gensub(/.*load average: ([0-9\.\, ]+).*$/,"\\1","gs"))}'

注意:对于使用逗号作为小数点分隔符的区域设置,它允许使用点和逗号。

请看一下 mpstat如此处介绍的,它可能更适合您的需求。

答案2

重新表述您的问题:您想打印字符串“mark:”之后的第一个单词。

途中,在 awk 中:

echo "random string random string mark: abcde random string random string" | \
awk -v RS="mark: " 'NR==2{print $1}'

上面的代码将字符串拆分为两个由“mark:”分隔的记录,然后打印第二个记录的第一个单词(即“abcde”)。

在 sed 中:

echo "random string random string mark: abcde random string random string" | \
sed 's/.*mark: \([^ ]*\).*/\1/'

上面使用正则表达式查找“​​mark:”之后的第一个非空格单词,并用该单词替换整个字符串。

相关内容