从字符串中剪切数字

时间:2015-12-19 13:23:30

标签: string bash shell awk cut

我想从.txt文件中剪切多个数字,以便稍后添加它们。以下是.txt文件中的摘要:

anonuser   pts/25       127.0.0.1   Mon Nov 16 17:24 - crash (10+23:07)  

我想得到" 10"在" +"之前我只想要这个号码,没有别的。此编号应写入另一个.txt文件。我使用了这段代码,但只有在数字有一位数时才有效:

awk ' /^'anonuser' / {split($NF,k,"[(+0:)][0-9][0-9]");print k[1]} ' log2.txt > log3.txt

4 个答案:

答案 0 :(得分:4)

使用GNU grep:

grep -Po '\(\K[^+]*' file > new_file

输出到new_file:

10

请参阅:PCRE Regex Spotlight: \K

答案 1 :(得分:0)

如果您使用match()中的awk功能怎么办?

$ awk '/^anonuser/ && match($NF,/^\(([0-9]*)/,a) {print a[1]}' file
10

这是如何运作的?

  • /^anonuser/ && match() {print a[1]}如果该行以anonuser开头并找到该模式,请将其打印出来。
  • 在最后一个字段(match($NF,/^\(([0-9]*)/,a))中
  • (10+23:07),查找字符串( +数字并在数组a[]中捕获这些数字。

另请注意,此方法允许您存储捕获的值,以便您可以在问题中指示它们进行求和。

答案 2 :(得分:0)

以下使用与OP相同的方法,并且具有一些优点,例如它不需要任何特殊的东西,它非常强大(关于输入的假设)和可维护性:

awk '/^anonuser/ {split($NF,k,/+/); gsub(/[^0-9]/,"",k[1]); print k[1]}'

答案 3 :(得分:0)

对于任何更复杂的使用awk,但对于简单的任务sed来说很容易

sed -r '/^anonuser/{s/.*\(([0-9]+)\+.*/\1/}'

查找(+符号之间的数字。