0

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

3 回答 3

2

尝试:

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

请参阅sed 正则表达式

于 2012-04-06T15:35:43.703 回答
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
于 2012-04-06T17:14:12.897 回答
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/'
    

    这应该适用于任何版本in的.outsed

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

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

标准sed使用正则表达式的中等功率版本,但它不是完整的 ERE(扩展正则表达式)。特别是,它不支持交替(或'd 替代)。

一些现代版本sed(尤其是 GNU sed)支持 ERE 甚至 PCRE(Perl 兼容的正则表达式)。

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

如果做不到这一点,要使用单个替代品处理“输入”和“输出”,您可以使用:

egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* \([io][nu]t\{0,1\}\)/ \1/'

当然,这将映射onandiut等等int以及inand out; 您的问题是“您的数据中是否会出现这种奇怪现象”?如果是这样,那么这两个显式s///命令更好。

最后,所有的正则表达式都可能受益于or$之后,以确保替换只发生在行尾。inout

于 2012-04-06T15:49:54.260 回答