我正在处理一个文件
File: /var/log/audit/audit.log:
/var/paas/sys/log/kubernetes/audit.log
/var/paas/sys/log/csms-storagemgr/audit.log
File: /var/log/sudo.log: Good
File: /var/log/secure: Good对于没有以“File:”开头的行,我需要将其与上面的行结合起来
预期结果将是
File: /var/log/audit/audit.log /var/paas/sys/log/kubernetes/audit.log /var/paas/sys/log/csms-storagemgr/audit.log
File: /var/log/sudo.log: Good
File: /var/log/secure: Good如何使用sed或其他工具来实现这一目标?
我试过了
sed -ne '/File:/{:a;N;/File:/!{ba};s/\n/\t/g;p}' /tmp/test但失败了。
发布于 2020-11-17 12:00:01
这可能对您有用(GNU sed):
sed -E '/^File:/{:a;N;/\nFile:/!s/\n\s*/ /;ta;P;D}' file匹配以File:开头的一行。
追加下一行。
如果附加行没有开始File:,则将换行符和后面的任何其他空格替换为单个空格。
如果替换成功,则返回并追加下一行等。
否则,打印/删除模式空间中的第一行并再次开始sed循环。
注意:尝试使用N命令在文件结束后读取,将按您的预期进行,并打印当前行。
发布于 2020-11-17 12:57:14
对于GNU awk,假设空间的数量并不重要。
$ awk -v RS='File:' 'NF{$1=$1; print RS, $0}' ip.txt
File: /var/log/audit/audit.log: /var/paas/sys/log/kubernetes/audit.log /var/paas/sys/log/csms-storagemgr/audit.log
File: /var/log/sudo.log: Good
File: /var/log/secure: GoodRS='File:'将File:设置为输入记录separatorNF,这样空记录就不再是基于输出字段分隔符的printed$1=$1重建输入记录,这是由defaultprint RS, $0打印RS的值,然后是空格,然后是重建的输入记录的值。
默认输入字段分隔符是单空格字符,它将删除前导/尾随空格/制表符/换行符,并根据这三个字符的一个或多个连续序列将记录拆分为字段。下面是另一个例子:
$ printf ' a \t b 3 ' | awk '{$1=$1; print}'
a b 3发布于 2020-11-17 07:57:25
试试这个?
awk '/^File:/ && f { printf "\n" }
{ printf "%s", $0; f=1 }
END { if (f) printf "\n" }' /tmp/test这将省略每一行末尾的换行符,然后当它看到下一个File:行时将其添加回。注意,在完成所有输入行之后,请注意END块来添加最后一个换行符。
如果希望从行开始对空格进行规范化,请尝试在gsub(/^[ \t]+/, " ")之前添加printf "%s", $0。
https://stackoverflow.com/questions/64870968
复制相似问题