如何使用grep获取第二个数字字段?例如,有一个字符串12 34 56 78,我想获取第三个数字,我可以将其分成不同的标记:
echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+"
输出是
12
34
56
78
如何从这里选择第n个数字?
[假设您执行了N=3
(或您想要的任何字段),有两种可能。
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:]]+'
使用sed
:
echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | sed -n 3p
或
echo "ab12 34_56.78" | sed -E 's/^([^[:digit:]]*[[:digit:]]+){2}[^[:digit:]]+([[:digit:]]+).*/\2/'
使用sed
echo "ab12 34_56.78" | sed 's/[^0-9]/\n/g' | grep -v '^$'
[^0-9] --> Any digit other than numbers 0,1,2,3,4,5,6,7,8,9
\n --> New line char
^ -- > start of line
$ --> End of line
用数字[[换行替换除数字以外的任何字符,然后删除空行。