sed语句语法错误?

时间:2012-04-06 15:28:15

标签: sed

我的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

3 个答案:

答案 0 :(得分:2)

尝试:

egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* \(in\|out\)/ \1/'

请参阅sed regular expressions

答案 1 :(得分:1)

你有3个例子:

  1. egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/'

    这适用于结束in的行。

  2. 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/'
    

    这应该适用于inout任何版本的sed

  3. egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ || out/ out/'

    与之前的诊断一样,第一个s///之后的材料无效sed

  4. 标准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/'
    

    当然,这将映射oniut以及int等,以及inout;你的问题是“你的数据中会出现这种奇怪的现象”吗?如果是这样,那么两个明确的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