我想让下面的命令起作用,但我做不到。请检查一下:
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:”之后的第一个非空格单词,并用该单词替换整个字符串。