Linux 在bash中为要输出的搜索名称添加前缀
我有一个简单的egrep命令,在输出null或值的文本文件中搜索多个字符串。下面是命令和输出Linux 在bash中为要输出的搜索名称添加前缀,linux,bash,shell,awk,sed,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 如果您对代码有任何帮助或从何处开始,我们将不胜感激 -Abhi由于我不确切知道您的输入文件内容(在问题中没有正确指定),我将提出一些假设以回答您的问题 案例
cat Output.txt|egrep -i "abc|def|efg"|cut -d ':' -f 2
输出为:-
xxx
(null)
yyy
现在,我正在尝试将我的搜索文本添加到如下输出的前缀
abc:xxx
def:
efg:yyy
如果您对代码有任何帮助或从何处开始,我们将不胜感激
-Abhi由于我不确切知道您的输入文件内容(在问题中没有正确指定),我将提出一些假设以回答您的问题 案例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
解释:
/abc\| def\|efg/{}
用于过滤仅包含所提供模式之一的行,然后执行块中的指令<编码>h;s/*\(abc\|def\|efg\)./\1:/代码>将该行保存在保留空间中,并用3种模式之一替换该行,x;s/^[^:::*:\([^:::*\):.*/\1/代码>用于交换模式、保留空间和提取第二列元素。最后但并非最不重要的是,H;x;s/\n//p
用于将两个提取的元素重新组合到一行并打印 由于我不确切知道您的输入文件内容(问题中没有正确指定),因此我将提出一些假设以回答您的问题
案例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
解释:
/abc\| def\|efg/{}
用于过滤仅包含所提供模式之一的行,然后执行块中的指令<编码>h;s/*\(abc\|def\|efg\)./\1:/代码>将该行保存在保留空间中,并用3种模式之一替换该行,x;s/^[^:::*:\([^:::*\):.*/\1/代码>用于交换模式、保留空间和提取第二列元素。最后但并非最不重要的是,H;x;s/\n//p
用于将两个提取的元素重新组合到一行并打印 试试这个
$ egrep -io "(abc|def|efg):[^:]*" file
将打印匹配项和分隔符后的下一个标记。请尝试此操作
$ egrep -io "(abc|def|efg):[^:]*" file
将打印匹配项和分隔符后的下一个标记。如果我们可以假设只有两个字段,abc
etc将始终在第一个字段中匹配,并且可以接受在包含多个匹配项的行上获取最后一个匹配项,那么一个非常简单的sed
脚本就可以工作
sed -n 's/^[^:]*\(abc\|def\|efg\)[^:]*:\([^:]*\)/\1:\2/p' file
如果应用了其他但类似的条件(例如,有三个或更多字段,但我们不关心前两个字段中的匹配),则所需的修改是微不足道的。如果没有,您真的需要澄清您的问题。如果我们可以假设只有两个字段,abc
等将始终在第一个字段中匹配,并且在包含多个匹配的行上获取最后一个匹配是可以接受的,那么一个非常简单的sed
脚本就可以工作
sed -n 's/^[^:]*\(abc\|def\|efg\)[^:]*:\([^:]*\)/\1:\2/p' file
如果应用了其他但类似的条件(例如,有三个或更多字段,但我们不关心前两个字段中的匹配),则所需的修改是微不足道的。如果没有,您确实需要澄清您的问题。显示一些示例输入和相应的所需输出。您的output.txt
是否有可能包含与您试图获取的值相同的值?你是在试图扭转这个过程吗?顺便说一下,您不需要cat
;使用<代码> EGRIP-AB'.DEF.EFG'Outp.txt剪切-d′:'f 2 < /代码>什么是在剪切-d之前的输出……考虑<代码> SED而不是<代码> EGRP和<代码>剪切< /代码>。如果您可以找出与前缀匹配的正确正则表达式并捕获值,那么您可以使用反向引用(例如\1:\2
)来提供所需的输出awk
无疑可以通过更多类似于cut
的方法实现相同的结果。显示一些示例输入和相应的所需输出。您的output.txt
是否有可能包含与您尝试获取的值相同的值?你是在试图扭转这个过程吗?顺便说一下,您不需要cat
;使用<代码> EGRP-Ⅰ'ABF.DEF'EFG'Outp.txt剪切-d′:'f 2 在剪切-d之前的输出是什么?考虑<代码> SED