使用sed从行获取数字

时间:2013-08-27 07:25:22

标签: regex bash sed awk cut

我的文件包含如下行:

xx_1: 2414 xx_4: 34214 xx_3: 4214 xx_2: 21421
xx_2: 1212 xx_1: 2424 xx_3: 23213 xx_4: 25214
...

我正在使用此命令获取特定值(例如xx_3的值:来自第一行):

cat results.txt | head -n 1| sed -e 's/[xx_]//g' | sed  's/\(3:.*\):/_\1_/g' | cut -d"_" -f2  | awk '{print $2}'

除非看起来很糟糕,否则它不适用于最后一个元素(如xx_2)。有什么想法吗?

修改

抱歉不精确。调用我的命令给我结果

cat results.txt | head -n 1| sed -e 's/[IT_]//g' | sed  's/\(4:.*\):/_\1_/g' | cut -d"_" -f2  | awk '{print $2}'
34214
cat results.txt | head -n 1| sed -e 's/[IT_]//g' | sed  's/\(1:.*\):/_\1_/g' | cut -d"_" -f2  | awk '{print $2}'
2414

4 个答案:

答案 0 :(得分:2)

你的sed表达式试图匹配两个冒号“:。*:”,因此它不适用于最后一个元素。如果您知道您的元素是数字,则可以将sed表达式更改为更具体:

s/\(2: [0-9]\+\)/_\1_/g

甚至只是匹配除冒号之外的所有内容:

s/\(2: [^:]\+\)/_\1_/g

答案 1 :(得分:0)

$ grep -Po 'xx_3: \K[^[:space:]]*' foo.input
4214
23213

$ grep -Po 'xx_2: \K[^[:space:]]*' foo.input
21421
1212

从那里,您可以使用sed / awk来检索特定行,或者如果您只关心第一行,则可以使用head前面的grep。< / p>

答案 2 :(得分:0)

我不确定你想要选择器 xx_3:,但这会打印出它之后的数字。

sed 's/.*\(xx_3:.\)\([0-9]*\).*/\2/g' results.txt

答案 3 :(得分:0)

搜索xx_3,打印下一个字段,退出。没有循环减慢它:

awk '/xx_3/ {f=NR} f&&NR-1==f {print;exit}' RS=" " results.txt
4214

这可以用于在搜索命中后打印任何下一个文件。