Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中为要输出的搜索名称添加前缀_Linux_Bash_Shell_Awk_Sed - Fatal编程技术网

Linux 在bash中为要输出的搜索名称添加前缀

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由于我不确切知道您的输入文件内容(在问题中没有正确指定),我将提出一些假设以回答您的问题 案例

我有一个简单的egrep命令,在输出null或值的文本文件中搜索多个字符串。下面是命令和输出

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