Regex 如何返回匹配表达式的特定单词B

Regex 如何返回匹配表达式的特定单词B,regex,bash,awk,sed,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,它吐出了垃圾。不确定我遗漏了什么。将此作为测试文件: $ cat file user 25999 0.0 0.7 6787

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

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

我有一个充满数据的文件,其中有相似的行。我需要的价值之前?从所有线路返回。我被卡住了。尝试了
awk-F'?'{print$1}'|awk'{print$NF}'test1.txt
,它吐出了垃圾。不确定我遗漏了什么。

将此作为测试文件:

$ cat file
user    25999  0.0  0.7 678772 259772 ?       Ssl  Nov05  11:54 fwd
$ 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
要获取
之前的值,请尝试:

$ awk '{sub(/?.*/, ""); print $NF}' file
259772
命令
sub(/?*/,“”)
消除从
到行尾的所有文本。完成此操作后,新修订行的最后一个字段,
$NF
,就是您想要的字段

讨论 这不起作用:

$ awk -F '?' '{print $1}' | awk '{print $NF}' file
fwd
上面发生的是
awk'{print$NF}文件
读取
文件
并打印出行中的最后一个字段。忽略来自
awk-F'?'{print$1}'
的stdin

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

$ awk -F '?' '{print $1}' file | awk '{print $NF}' 
259772
问题第二版的答案 让我们看一下这个测试文件:

$ cat file
user    25999  0.0  0.7 678772 259772 ?       Ssl  Nov05  11:54 fwd
$ 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

如果您有支持Perl正则表达式的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 
\K
在Perl正则表达式中表示“忘记以前的匹配”
Perl正则表达式中的
?=
是一个先行断言

[?]
是一种文字?

我能够使它与 awk“{for(i=1;i=1500000)print$(i-1)}”filename.txt 它打印我的文件中的所有行,值在“?”>1500000之前。我还需要上一行的第一个字和这个数字。该代码将无法工作,因为它一次只遍历一行字。
有什么想法吗?

你说你想得到“特定字段”,但没有解释是哪个字段。默认情况下,字段在awk中用空格分隔。无需定义新的字段分隔符,您只需显示第6个字段。考虑到该输入,您只需
awk'{print$6}'
。如果这还不是你所需要的全部,那么编辑你的问题,以提供更具代表性的样本输入和预期输出,说明为什么这是不够的。在你的原始问题中,你没有提到>1500000或保存“前一行的第一个字”的要求。在答案发布后如此戏剧性地改变一个问题是不好的。然而,我更新了我的答案以满足这些新的要求。