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

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///コマンドであり、2番目の部分の後のスラッシュまでinです。残りは、次のような新しいコマンドである必要があります。

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

    これは、のどのバージョンでも機能するinはずoutですsed

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

    前の診断と同様に、最初の診断の後の資料s///は単に無効ですsed

Standardsedは、適度に強力なバージョンの正規表現を使用しますが、完全な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ます。あなたへの質問は、「そのような奇妙なことがあなたのデータで発生する可能性があるか」ということでしょう。その場合は、2つの明示的なコマンドの方が適しています。inouts///

最後に、すべての正規表現は、またはの$後の恩恵を受けて、行の終わりでのみ置換が行われるようにすることができます。inout

于 2012-04-06T15:49:54.260 に答える
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 に答える