如何在匹配的表达式之前返回特定单词

时间:2017-12-13 21:33:34

标签: regex bash awk sed

作为更大代码的一部分,我必须从下面的行中获取特定字段。

user    25999  0.0  0.7 678772 259772 ?       Ssl  Nov05  11:54 fwd

我有一个包含类似行的数据文件。我以前需要这个价值吗?从所有线路返回。我被卡住了。试过awk -F '?' '{print $1}' | awk '{print $NF}' test1.txt,吐出垃圾。不确定我错过了什么。

3 个答案:

答案 0 :(得分:1)

将此作为测试文件:

$ cat file
user    25999  0.0  0.7 678772 259772 ?       Ssl  Nov05  11:54 fwd

要获取?之前的值,请尝试:

$ awk '{sub(/?.*/, ""); print $NF}' file
259772

命令sub(/?.*/, "")消除了从?到行尾的所有文本。完成此操作后,新修订的行$NF上的最后一个字段就是您想要的字段。

讨论

这不起作用:

$ awk -F '?' '{print $1}' | awk '{print $NF}' file
fwd

上面发生的是awk '{print $NF}' filefile读取并打印出该行的最后一个字段。来自awk -F '?' '{print $1}'的标准输入被忽略。

通过在第一个命令中放置文件名,我们可以实现您想要的目标:

$ awk -F '?' '{print $1}' file | awk '{print $NF}' 
259772

第二版问题的答案

我们来看看这个测试文件:

$ cat file
user1    25999  0.0  0.7 678772  259772 ?       Ssl  Nov05  11:54 fwd
user2    25999  0.0  0.7 678772 1500000 ?       Ssl  Nov05  11:54 fwd
user3    25999  0.0  0.7 678772  259772 ?       Ssl  Nov05  11:54 fwd

根据您的意见,仅在?之前打印数字,只要它是> = 1500000并打印上一行中的第一个字段:

$ awk '{sub(/?.*/, "")} $NF>=1500000{print last,$NF} {last=$1}' file
user1 1500000

答案 1 :(得分:0)

如果您有支持Perl Regex的gnu grep,您可以使用以下内容:

$ grep -Po '.* \K\w+ (?=[?])' file

测试:

$ echo "$a"
user    25999  0.0  0.7 678772 259772 ?       Ssl  Nov05  11:54 fwd
$ echo "$a" |grep -Po '.* \K\w+ (?=[?])'
259772 
Perl Regex中的

\K表示“忘记以前的比赛” Perl Regex中的?=是一个先行断言 [?]是文字吗?

答案 2 :(得分:0)

我能够使用它 awk' {for(i = 1; i< = NF; i ++)if($ i =="?"&& $(i-1)> = 1500000)print $(I-1)}' FILENAME.TXT 它会在'?'之前打印我文件中的所有行。 > 1500000.我还需要上一行的第一个字以及这个数字。这段代码无法正常工作,因为它一次遍历每行一行。 有什么想法吗?