首页 > 解决方案 > 如何使用 grep 获取字符串中的第 n 个数字字段?

问题描述

如何使用 grep 获取第二个数字字段?例如,有一个字符串 12 34 56 78 我想得到第三个数字,我可以将字符串分成不同的标记:

echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" 

输出是

12 
34
56
78

如何从这里选择第n个数字?

标签: bashgrep

解决方案


N=3假设您这样做(或您想要的任何字段),有几个 bash 可能性。

echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | tail -n+$n | head -n1
echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | tr '\n' '\t' | cut -f$N

您可以在 awk 中轻松完成此操作,无需额外的 shell 命令:

echo "ab12 34_56.78" | awk -vN=3 -F'[^[:digit:]]+' '{print $(N+($1==""))}'

-F将字段分隔符设置为匹配任何非数字序列的正则表达式;添加($1=="")N是处理第一个数字之前没有非数字的可能性。

如果你有 Gnu grep 或其他提供 PCRE 的 grep 实现,你可以使用\K“匹配点重置”断言:

echo "ab12 34_56.78" | grep -Po '(?:[[:digit:]]+[^[:digit:]]+){2}\K[[:digit:]]+'

或者如果你想用来$N控制匹配的数量:

echo "ab12 34_56.78" | grep -Po '(?:[[:digit:]]+[^[:digit:]]+){'$((N-1))'}\K[[:digit:]]+'

推荐阅读