从字符串中剪切数字

Cut number from string

我想从 .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

使用 GNU grep:

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

输出到new_file:

10

参见:PCRE Regex Spotlight: \K

如果在awk中使用match()函数会怎么样?

$ 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[].

另请注意,此方法允许您存储捕获的值,以便您可以按照问题中的说明对它们求和。

以下使用与 OP 相同的方法,并且有几个优点,例如它不需要任何特殊的东西,而且它非常健壮(关于输入的假设)并且可维护:

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

对于任何更复杂的事情,使用 awk 但对于简单的任务 sed 就足够了

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

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

我不确定文件中的格式。
可以使用简单的剪切命令吗?

cut -d"(" -f2 log2.txt| cut -d"+" -f1 > log3.txt