使用 grep 命令提取数字

使用 grep 命令提取数字

我有以下文件示例:

some text is here  
   sometext(1,21);
   sometext(2,9);
   sometext(3,231);
   sometext(10,1112);
   sometext(11,17)
Some text is here

我试图提取包含 的行括号中的第二个数字sometext,因此在上面的示例中,数字21, 9, 231, 1112, 17

我没有找到适合grep上述模式的命令。

答案1

如果您使用的是 GNU,grep则可以使用 RE 来匹配逗号后的数字

grep -oP ',\K\d+' file

本机perl等效项是这样的

perl -lne 'print for /,\K\d+/g' file

答案2

grep实用程序不适合提取行的一部分,至少如果您想使用标准 Unix 工具。标准grep实用程序过滤与模式匹配的完整线条,但没有自然的方法来提取部分线条。为了以更详细的方式操作线条,可以使用,例如sed

假设文本比您显示的文本更长且更多样,我们可以让文本字符串sometext(告诉我们何时处理第二个整数值的行。一旦我们在数据中看到该字符串,我们就可以修剪掉第二个整数之前和之后的侧翼位。

在这里,我们应用了两种修剪替换,一种是从行首到包括该行最后一个逗号,另一种是从右括号到行尾。我们关闭每行的默认打印,-n并在第二次替换后显式打印结果字符串。

sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file

我们还可以选择删除与特殊触发字符串不匹配的任何行,并将两个替换应用于剩余的任何行。

sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file

如果您希望得到的数字列表作为逗号分隔的列表(就像您在问题中显示的那样),那么请考虑通过管道传输上述命令的结果

paste -d, -s -

根据您问题中的数据,我们得到:

$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17

答案3

我会使用awk逗号或右括号 ( -F'[,)]') 的字段分隔符来实现此目的。这将在字段 2 ( $2)中生成您想要的数字。将其与 $2 仅包含数字的检查结合起来:

$ awk -F'[,)]' '$2 ~ /^[[:digit:]]+$/ {print $2}' input.txt 
21
9
231
1112
17

这假设 $2 仅包含非负整数。如果它可能包含负数和/或实数,请改用以下内容:

awk -F'[,)]' '$2 ~ /^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/ {print $2}' input.txt

注意:因为 awk 使用逗号作为字段分隔符,所以这在使用逗号作为小数分隔符的语言环境中不起作用。

答案4

您可以使用grep来完成繁重的工作,然后使用 - 进行清理tr- 假设您不需要逗号。从帖子中也不清楚您希望如何呈现输出,这会生成一个换行符分隔的数字列表。

grep -Eo ",[[:digit:]]+" input.txt | tr -d ","

或者,避免使用tr作为grep唯一的解决方案:

grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"

相关内容