从bash shell中的文本行读取数字

时间:2014-10-27 15:27:33

标签: bash shell awk sed grep

我正在尝试编写一个bash shell脚本,该脚本会打开某个文件CATALOG.dat,其中包含以下行,由字符和数字组成:

event_0133_pk.gz
event_0291_pk.gz
event_0298_pk.gz
event_0356_pk.gz
event_0501_pk.gz

我想做的是使用类似NUMBERS.dat的内容在新文件> ./NUMBERS.dat中打印数字(仅限数字),以获取:

0133
0291
0298
0356
0501

我的问题是:如何从文本行中提取数字?是否有什么东西可以让脚本只读取数字作为变量,比如C / C ++中的event_0%d_pk.gz

5 个答案:

答案 0 :(得分:3)

grep解决方案:

grep -oP '[0-9]+' CATALOG.dat >NUMBERS.dat

sed解决方案:

sed 's/[^0-9]//g' CATALOG.dat >NUMBERS.dat

awk解决方案:

awk -F"[^0-9]+" '{print $2}' CATALOG.dat >NUMBERS.dat

答案 1 :(得分:2)

有很多方法可以达到你的结果。一种方法是使用awk:

awk -F_ '{print $2}' CATALOG.dat > NUMBERS.dat

这会将字段分隔符设置为下划线,然后打印包含数字的第二个字段。

答案 2 :(得分:1)

<强> awk中

awk 'gsub(/[^[:digit:]]/,"")' infile 

<强>击

while read line; do echo ${line//[!0-9]}; done < infile

<强> TR

tr -cd '[[:digit:]\n]' <infile

答案 3 :(得分:0)

您可以使用grep命令提取数字部分。

grep -oP '(?<=_)\d+(?=_)' CATALOG.dat

将输出显示为

0133
0291
0298
0356
0501

或者

很简单

grep -oP '\d+' CATALOG.dat

答案 4 :(得分:0)

你不需要在grep中使用perl模式。 BRE可以做到这一点。

grep -o '[[:digit:]]\+' CATALOG.dat > NUMBERS.dat