よりクリーンな方法はありますか?大きな 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