我的sed仅在输入文件的最后一个条目为'in'时有效,如果文件有'in'或'out',我怎么能让它工作?我尝试了不同的变化但没有成功。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/'
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ out/ out/'
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ || out/ out/'
Apr 6 08:54:23 TCP 212.58.244.58:80 in
Apr 6 09:29:09 TCP 212.58.244.58:443 out
答案 0 :(得分:2)
答案 1 :(得分:1)
你有3个例子:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/'
这适用于结束in
的行。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ out/ out/'
这将因sed
的语法错误而失败。第一部分是有效的s///
命令,直到第二部分in
之后的斜杠;其余的应该是一个新命令,例如:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/; s/:[^:]* out/ out/'
这应该适用于in
和out
任何版本的sed
。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ || out/ out/'
与之前的诊断一样,第一个s///
之后的材料无效sed
。
标准sed
使用中等功率版本的正则表达式,但它不是完整的ERE(扩展正则表达式)。特别是,它不支持交替(或替代)。
sed
的一些现代版本(特别是GNU sed
)支持ERE甚至PCRE(Perl兼容的正则表达式)。
egrep -w 'TCP|UDP' denied.txt | sed -r 's/:[^:]* (in|out)/ \1/'
如果不这样做,用一个替代品处理'in'和'out',你可以使用:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* \([io][nu]t\{0,1\}\)/ \1/'
当然,这将映射on
和iut
以及int
等,以及in
和out
;你的问题是“你的数据中会出现这种奇怪的现象”吗?如果是这样,那么两个明确的s///
命令会更好。
最后,所有正则表达式可能会受益于$
或in
之后的out
,以确保替换仅发生在行尾。
答案 2 :(得分:1)
这可能对您有用:
sed '/\<\(TCP\|UDP\)\>/!d;s/:[^:]*\(in\|out\)/ \1/' denied.txt
Apr 6 08:54:23 TCP 212.58.244.58 in
Apr 6 09:29:09 TCP 212.58.244.58 out
或更简单:
sed '/\<\(TCP\|UDP\)\>/!d;s/:[^ ]*//2' denied.txt
Apr 6 08:54:23 TCP 212.58.244.58 in
Apr 6 09:29:09 TCP 212.58.244.58 out