ファイル内のパターンを検索し、コマンドラインでUnixの行を削除する方法
質問
ファイル内のパターンを検索する必要があります。 たとえば、ファイルの内容は次のとおりです。
3555005!K!00630000078!C!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!47001231000000!0!336344324!1!1!POST!USAGE!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
ここで、!D!で行を検索します。行の7番目のフィールドがシステム日付よりも小さい場合、行を削除してファイルを保存します。
それは可能ですか?
解決
AWK を希望する場合...
awk -f logstrip.awk in.log > out.log
logstrip.awkは次のようになります
# *** Simple AWK script to delete lines from log file ***
# Rule: keep all lines except these that have their 2nd
# field equal to "D" and their 7th field more than
# current date time
BEGIN {
FS = "!"; #delimiter
stopDate = systime();
# stopDate = 47001231000001; for test purposes
deletedLineCtr = 0; #diagnostics counter, unused at this time
}
{
if (match($2, "D") && ($7 < stopDate) ) {
deletedLineCtr++;
}
else
print <*>
}
トリックを行う必要があります。
ただし、フィールド#7には奇数の日付形式が含まれています。最近のエポック値(123 ...)を認識していると思いますが、その前には明らかに無関係な4桁があります。これらは、StopDateと比較する前に簡単に削除できます
他のヒント
このような何かがトリックを行う必要があります...これがフィールドのフォーマット方法ではない場合は、時間を解析することができます
perl -ne '/^([^!]+!){6}([^!]+).*/; print if $2 < time && /!D!/;'
mjvの回答に基づいていますが、簡略化して、日付の5番目のフィールドを使用(想定)します(読みやすくするために2行に分割しています):
awk -F! 'BEGIN {stopdate=strftime("%Y%m%d%H%M%S",systime())}
$2 != "D" || $5 >= stopdate {print}' file.log > newfile.log
iファイル内のサンプルデータでテスト
3555005!K!00630000078!C!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090912000000!0!336344324!1!1!POST!vijay!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090912000000!0!336344324!1!1!POST!vijay!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!D!16042296!DUMMY!20090805235959!0!20090917000000!0!336344324!1!1!POST!USAGE!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090919000000!0!336344324!1!1!POST!USAGE!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090914000000!0!336344324!1!1!POST!vijay!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090915000000!0!336344324!1!1!POST!vijay!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090913000000!0!336344324!1!1!POST!vijay!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090912000000!0!336344324!1!1!POST!USAGE!336344324!0!
3555005!C!336344324!1!!!EUR!1!1!!I!
3555005!S!00630000078!20090805172515!LF010300!
3555005!K!204042880166840!I!20090805235959!47001231000000!16042296!336344324!A!1!ENG!0!00630000078!NO!00630000078!
3555005!D!16042296!DUMMY!20090805235959!0!20090912000000!0!336344324!1!1!POST!USAGE!336344324!0!
しかし、!D!で構成されるすべての行を削除しています。 次のawkスクリプトを使用しました
# *** Simple AWK script to delete lines from log file ***
# Rule: keep all lines except these that have their 2nd
# field equal to "D" and their 7th field more than
# current date time
BEGIN {
FS = "!";
#delimiter
stopDate = "date +%Y%m%d%H%M%S";
# stopDate = 47001231000001; for test purposes
deletedLineCtr = 0; #diagnostics counter, unused at this time
}
{
if ( match($2, "D") && ($7 < stopDate) )
{
deletedLineCtr++;
}
else
print <*>
}
何か間違ったことをしていますか?
所属していません StackOverflow