ログ処理/アイテム削除、マルチパイプライン(grep sed grep)、ログ巡回2回。このソリューションを改善できますか?

ログ処理/アイテム削除、マルチパイプライン(grep sed grep)、ログ巡回2回。このソリューションを改善できますか?

よりクリーンな方法はありますか?大きな input.txt ファイルの単一パスが優先されます。これまでの解決策:

grep -e "\[.*fred" input.txt |sed 's/.*\[\([^]]*\)\].*/\1/g' |grep -vf /dev/stdin input.txt

説明する:

grep -e "\[.*fred" input.txt |

行で、「fred」の前に開く括弧付きの「fred」というラベルの付いた行を探します。発行者

sed 's/.*\[\([^]]*\)\].*/\1/g' |

ファイル内のすべての「fred」エントリを識別する角括弧の間のIDを見つけます。各「fred」タグの同じID項目の数は固定されていません。この例では、各「fred」に対して2つの行を表示しますが、任意の数字にすることができます。発行者

grep -vf /dev/stdin input.txt

ファイルからこれらのIDを持つすべての行を削除します。 (必要に応じて/ dev / stdinを「-」に置き換えます。つまり、パイプ入力)

入力.txt:

Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

希望の出力:

Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

答え1

削除したい場合ファイルのどこでも行がファイルのどこからでも抽出されたIDと一致する場合、この操作は一度に実行できません。

ただし、最後に一致した行のみを削除する必要がある場合は、次のことができます。

$ perl -lne '$pid = $1 if /(\[.*?\]).*fred/; print unless index($_,$pid) > -1' input.txt 
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

関連情報