linux 使用gawk命令的REGEX

46scxncf  于 2022-12-03  发布在  Linux
关注(0)|答案(4)|浏览(117)

在Linux中,我运行以下命令

pmap -x $PID | tail -n 1

这会给我一个类似下面的行:

total kB         168194812  870692  852296

我正在尝试提取第二个数字(rss)以供使用。我在www.example.com中找到了此示例regex101.com:

/[^\d]*[\d]+[\s]+([\d]+)/

然而,当我尝试对我的文本行运行它时,我没有得到任何打印输出:

echo "total kB         168194812  870692  852296" | gawk 'match($0, /[^\d]*[\d]+[\s]+([\d]+)/, a) {print a[1]}'

我希望它能印出来

870692
pgvzfuti

pgvzfuti1#

就像这样:

$ pmap -x $PID | gawk 'match($0, /[^0-9]*[0-9]+\s+([0-9]+)/, a) {print a[1]}'
870692

表达式\d是特定的Perl/PCRE兼容正则表达式。一些语言如Python也使用这个表达式。
您可以简化为:

awk '{print $4}'

使用grep

grep -oP '\d+(?=\s+\d+$)'
dba5bblo

dba5bblo2#

如果只显示第4个字段,

awk '{print $4}'

以你为例

echo "total kB         168194812  870692  852296" | awk '{print $4}'

返回

870692
t40tm48m

t40tm48m3#

使用GNU grep和你展示的示例,请尝试以下grep代码。以下是完整的Online regex demo正则表达式。

echo "total kB         168194812  870692  852296" |
grep -oP '^total kB\s+\d+\s+\K\d+'

说明:

  • 我在这里使用GNU grep-oP选项,它们分别用于精确匹配和启用PCRE正则表达式风格。
  • 然后在主grep程序中,我使用regex ^total kB\s+\d+\s+\K\d+,其中:
  • 从值的开头开始匹配total kB,后跟空格、数字和空格。
  • 然后使用\K选项来忘记到目前为止与正则表达式匹配的值,这将帮助我们获得所需的输出,尽管它与正则表达式匹配,但在输出打印中不考虑值。
  • 然后匹配一个或多个数字,这是我们所需的输出。
xggvc2p6

xggvc2p64#

如果要使用awk,可以将数字与[0-9]和求反版本[^0-9]匹配
当您使用tail -n 1输出单行时,您也可以使用gnu awk将行分隔符设置为1位或更多位数,并在行号为2时打印行终止符。

echo "total kB         168194812  870692  852296" | 
awk -v RS='[0-9]+' 'NR == 2 {print RT}'

输出量

870692

相关问题