我有一个简单的 egrep 命令在一个文本文件中搜索多个字符串,它输出 null 或一个值。下面是命令和输出。
cat Output.txt|egrep -i "abc|def|efg"|cut -d ':' -f 2
输出是:-
xxx
(null)
yyy
现在,我正在尝试将前缀我的搜索文本 到输出,如下所示。
abc:xxx
def:
efg:yyy
对于实现此目的或从哪里开始的代码的任何帮助,我们将不胜感激。
-阿比
最佳答案
由于我不确切知道你的输入文件内容(问题中没有正确指定),我会提出一些假设来回答你的问题。
情况 1:您要查找的模式始终位于同一列中
如果是这样,答案就很简单了:
$ cat grep_file.in
abc:xxx:uvw
def:::
efg:yyy:toto
xyz:lol:hey
$ egrep -i "abc|def|efg" grep_file.in | cut -d':' -f1,2
abc:xxx
def:
efg:yyy
在 grep 之后,只需使用您要查找的 2 列的剪切(这里是 1 和 2)
备注:
不要cat
文件,pipe
它然后grep
它,因为这是做两次工作!!!您的 grep 命令将已经读取该文件,因此不要读取它两次,它对小文件可能不那么重要,但您会感觉到例如 10GB
文件的不同!
情况 2:您要查找的模式不在同一列中
在这种情况下,它有点棘手,但并非不可能。实现方式有很多种,这里我将详细介绍awk
方式:
$ cat grep_file2.in
abc:xxx:uvw
::def:
efg:yyy:toto
xyz:lol:hey
如果你的输入文件是这种格式;您的模式可以位于任何地方:
$ awk 'BEGIN{FS=":";ORS=FS}{tmp=0;for(i=1;i<=NF;i++){tmp=match($i,/abc|def|efg/);if(tmp){print $i;break}}if(tmp){printf "%s\n", $2}}' grep_file
2.in
abc:xxx
def:
efg:yyy
解释:
FS=":";ORS=FS
在 :
处定义您的输入/输出字段分隔符 然后在每一行上定义一个测试变量,当您到达您的模式时该变量将变为真,你循环该行的所有字段,直到你到达它,如果你打印它,打破循环并打印第二个字段+一个 EOL 字符。
如果你不符合你的模式,你什么都不做。
如果您更喜欢sed
方式,您可以使用以下命令:
$ sed -n '/abc\|def\|efg/{h;s/.*\(abc\|def\|efg\).*/\1:/;x;s/^[^:]*:\([^:]*\):.*/\1/;H;x;s/\n//p}' grep_file2.in
abc:xxx
def:
efg:yyy
解释:
/abc\|def\|efg/{}
用于过滤仅包含所提供模式之一的行,然后执行 block 中的指令。 h;s/.*\(abc\|def\|efg\).*/\1:/;
将行保存在保留空间中并用 3 种模式之一替换该行, x;s/^[^:]*:\([^:]*\):.*/\1/;
用于交换模式和保持空间并提取第2列元素.最后但并非最不重要的一点是,H;x;s/\n//p
用于将两个提取的元素重新组合在一行上并打印出来。
关于linux - 前缀搜索名称以在 bash 中输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49120413/