Unix - 在 grep 结果行之间添加字符串
Posted
技术标签:
【中文标题】Unix - 在 grep 结果行之间添加字符串【英文标题】:Unix - Add string between grep resulted lines 【发布时间】:2021-10-05 10:06:45 【问题描述】:任何人都知道一种方法(在 RHEL7 和 AIX5 上工作)制作一个在 /bin/bash 或 /bin/ksh 上运行的脚本,以使用 grep(或其他函数)在文本文件中搜索 1 个或多个字符串),结果被放入一个变量中,但在该变量中,每次出现的末尾都有一个字符串“\\n”?
例如:
TextFile1.txt
[root@server ~]$ cat TextFile1.txt
aby ORA-3120: unable to xx
sxyy unable to aa
sxyy ORA-3120: unable to aa
ytxy unable to bb
y41y unable to dd
yanby unable to ff
ytxy ORA-3120: unable to bb
y41y ORA-3120: unable to dd
y124gby unable to gg
yanby ORA-3120: unable to ff
aby unable to xx
y124gby ORA-3120: unable to gg
简单的grep
[root@server ~]$ cat TextFile1.txt | grep "ORA-"
aby ORA-3120: unable to xx
sxyy ORA-3120: unable to aa
ytxy ORA-3120: unable to bb
y41y ORA-3120: unable to dd
yanby ORA-3120: unable to ff
y124gby ORA-3120: unable to gg
将结果放入变量中
[root@server ~]$ aa=$(cat TextFile1.txt | grep "ORA-")
[root@server ~]$ echo $aa
aby ORA-3120: unable to xx sxyy ORA-3120: unable to aa ytxy ORA-3120: unable to bb y41y ORA-3120: unable to dd yanby ORA-3120: unable to ff y124gby ORA-3120: unable to gg
想要的结果:
[root@server ~]$ echo $aa
\\n aby ORA-3120: 无法 xx \\n sxyy ORA-3120: 无法 aa \\n ytxy ORA-3120: 无法 bb \\n y41y ORA-3120: 无法 dd \\n yanby ORA-3120: 无法 ff \\n y124gby ORA-3120: 无法 gg \\n
提前感谢您的帮助和提示
【问题讨论】:
尝试使用双引号,echo "$aa"
为什么将输出存储在aa
变量中?
在 bash 中,"$aa//$'\n'/\\\\n"
@anubhava 该变量将由脚本的另一个步骤获取,以传递给另一个需要它的程序
@Shawn 感谢您的提示,这无疑是朝着正确方向迈出的一步。但目前它并未显示所有已识别的行。它有点把它们从中间切开。早上不累的时候会尝试调试它。 [root@server]# echo "$aa//$'\n'/\\\\n" \\ny124gby ORA-3120: 无法 ggaby ORA-3120: 无法 xx [root@server]# echo "$aa//$'\n'/ \\\\n " \\n y124gby ORA-3120: 无法 ggaby ORA-3120: 无法 xx
【参考方案1】:
有很多方法可以做到这一点。这里有两个:
将grep
的输出连接到sed
:
aa=$(echo " \\\n"; grep "ORA-" TextFile1.txt | sed 's/\(.*\)/\1 \\\\n/')
输出:
$ aa=$(echo " \\\n"; grep "ORA-" TextFile1.txt | sed 's/\(.*\)/\1 \\\\n/')
$ echo $aa
\\n aby ORA-3120: unable to xx \\n sxyy ORA-3120: unable to aa \\n ytxy ORA-3120: unable to bb \\n y41y ORA-3120: unable to dd \\n yanby ORA-3120: unable to ff \\n y124gby ORA-3120: unable to gg \\n
$
将grep
的输出传送到awk:
aa=$(echo " \\\n"; grep "ORA-" TextFile1.txt | awk 'print $0 " \\\\n"')
输出:
$ aa=$(echo " \\\n"; grep "ORA-" TextFile1.txt | awk 'print $0 " \\\\n"')
$ echo $aa
\\n aby ORA-3120: unable to xx \\n sxyy ORA-3120: unable to aa \\n ytxy ORA-3120: unable to bb \\n y41y ORA-3120: unable to dd \\n yanby ORA-3120: unable to ff \\n y124gby ORA-3120: unable to gg \\n
【讨论】:
嗨,这些是一些不错的代码,但我遇到了一个奇怪的效果。我得到的结果(不管命令运行)是: \\n y124gby ORA-3120: 无法 gg \\n 我没有得到你想要的结果,而是得到了部分结果。即使我将输出重定向到文件(以防终端显示错误)它仍然是相同的 嗨@PancakeSlapper,输入ps
,确保您使用的是bash。然后,将问题分解成小部分,看看有什么没有按预期工作。首先,输入grep "ORA-" TextFile1.txt
,并确保您获得了文件中的所有行。然后,只输入这个:grep "ORA-" TextFile1.txt | sed 's/\(.*\)/\1 \\\\n/'
,并确保所有行现在都以\\n
结尾,依此类推。让我知道是什么命令产生了意外的输出。另外,请复制并粘贴我的回复以避免拼写错误。
嗨 Luis,我在 bash 上运行,命令按预期工作。无论出于何种原因将结果添加到变量中时,除了最后一行之外的所有内容都会被删除。对为什么会发生这种情况有任何想法吗?没遇到过【参考方案2】:
一种快速的解决方案是使用 awk:
aa=$(cat TextFile1.txt | grep "ORA-"| awk 'print $0 "\\n"')
【讨论】:
感谢您的意见【参考方案3】:正如您在 echo "$aa"
中看到的(使用双引号避免 bash 吃掉换行符),每一行都已经以换行符结尾。
当您确定不需要双引号时,只需在每行末尾添加:
aa=$(cat TextFile1.txt | grep "ORA-" | sed 's/$/\\\\n/')
【讨论】:
感谢您的意见以上是关于Unix - 在 grep 结果行之间添加字符串的主要内容,如果未能解决你的问题,请参考以下文章