如何使用shell脚本在文件中查找/获取数字

时间:2013-06-07 04:07:55

标签: linux bash shell ubuntu

我是Linux Shell脚本的新手 据我所知,使用文件中的查找号码可以用grep

完成
egrep -o "[0-9][0-9]*" my_file

但如何获取这些字符串的第一位数并将其作为统计信息.. 例如1234,123,1267,所以我得到1次3次

我知道使用

A=$(tr -cd 1 < page.html|wc -c)

可以在文件中获得数字“1”,但这不是我想要的.... 我想算第一位数“1”...... 这就是为什么它对我这么难......

请帮忙...... 非常感谢。

2 个答案:

答案 0 :(得分:3)

A=$(egrep -o '[0-9]+' my_file | egrep -c '^1')

第一个egrep找到所有数字并输出它们。第二个egrep使用-c选项输出匹配计数,正则表达式匹配以1开头的行。

答案 1 :(得分:0)

从问题来看,文件似乎包含各种字符,并且您希望隔离文件中所有数字的第一个数字。看起来这个数字也不一定是一行上的第一个单词(就像之前没有任何空格一样)。牢记这两个假设,您可以执行以下操作:

grep '[0-9]' test.html| sed 's/\([0-9]\+\)/\n\1\n/g' |grep '^[0-9]' |cut -c1 |sort |uniq -c

一个例子:

curl -N -s 'http://stackoverflow.com/users/1353267/samveen' |grep '[0-9]' |sed 's/\([0-9]\+\)/\n\1\n/g' |cut -c1 |grep '^[0-9]' |sort |uniq -c

重要:在上面的示例页面中,有一行{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":1353267,"accountId":1430801,"gravatar":"<div class=\"\">,其分为以下几行:

{"fkey":"
8
f
1
a
9
c
6
e
21503516793
b
853265
ec
4939
","isRegistered":true,"userId":
1353267
,"accountId":
1430801
,"gravatar":"<div class=\"\">

如果您不想要此行为,sed模式将更改为
sed 's/\b\([0-9]\+\)\b/\n\1\n/g',这意味着现在搜索独立的数字(\b是单词边框),并且sed命令的输出现在是:

{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":
1353267
,"accountId":
1430801
,"gravatar":"<div class=\"\">

此外,如果巧妙地选择sed转换,则不需要cut命令。那就是如果
模式的\([0-9]\+\)部分更改为\([0-9]\)[0-9]*,然后sed将仅显示每个数字的第一个数字,而不是整数。因此不再需要cut -c1。使用
sed 's/\b\([0-9]\)[0-9]*\b/\n\1\n/g',我们得到:

{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":
1
,"accountId":
1
,"gravatar":"<div class=\"\">

因此,不需要削减。

如果有关输入文件的更多信息,可以进一步优化该命令。