linux - 前缀搜索名称以在 bash 中输出

标签 linux bash shell awk sed

我有一个简单的 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/

相关文章:

database - 如何连接SQLite3数据库服务器?

linux - 调整大小时的 SDL 鼠标范围

c++ - glXMakeCurrent 在多个多线程 Linux opengl 应用程序中永远不会返回

c - 带逗号的返回语句

linux - 如何使用 Awk/cut 获取 "/"之间的文本?

bash - 为什么 `sort file > file` 会导致一个空文件?

bash - 如何迭代 Bash 中变量定义的一系列数字?

linux - 如何为BASH垃圾箱脚本添加选择?

linux - 限制特定子 shell 脚本的日志记录

shell - 从文本文件列表中提取