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 结果行之间添加字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 sql developer 窗口中获取结果行

如何在 Postgres 函数中检索多个结果行?

将结果行强制转换为对象

如何正确迭代所有 BigQuery 结果行?

grep

SQL Query - 在一个结果行中显示连接结果[重复]