2015-12-19 54 views
0

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

使用awk:'AWK -F [\(+] '{打印$ 2}' 文件> new_file' – Cyrus

+0

你为什么跳出来,然后回AWK周围'anonuser' @Cyrus单引号? - 你的评论是正确的解决方案,所以为什么不把它作为答案(在调整后得到正确的语法:'awk -F'[(+]'{print $ 2}'文​​件)? –

回答

4

随着GNU的grep:

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

输出到NEW_FILE:

​​

参见: PCRE Regex Spotlight: \K

+0

'\ d'可能比'[^ +]'更有意义,因为OP需要一个数字 – Aaron

+0

@Aaron:谢谢你的提示 – Cyrus

+0

另外,如果OP计划收集这些数字并在稍后添加它们,'>>'可能会使更多感觉比'>'。 –

0

如果使用t他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[]中。

还要注意,这种方法允许您存储您捕捉的值,以便您可以按照您在问题中指出的那样对它们进行求和。

0

以下使用与OP相同的方法,并具有一些优点,例如,它不需要任何特殊,它是相当稳健(相对于对输入假设)和可维护性:

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

任何东西更复杂的使用awk但对于简单的任务sed是很容易

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

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

0

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

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