パターンが一致したら、行を削除する必要があります。

パターンが一致したら、行を削除する必要があります。

aa.textLinuxシステムには、次の行を含むファイルがあります。

$ cat aa.text
I am a user
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [PCRMR2S]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:52 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:55 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:58:03 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
username is valid
Fri Feb 09 23:58:04 2024

次の出力を取得したい。

i am a user
username is valid 
Fri Feb 09 23:58:04 2024

私は試した:

sed -e '/ORA-1653/,+1 d' aa

これは私に次のことを与えます:

i am a user
Fri Feb 09 23:57:51 2024
Fri Feb 09 23:57:51 2024
Fri Feb 09 23:57:51 2024
Fri Feb 09 23:57:52 2024
Fri Feb 09 23:57:54 2024
Fri Feb 09 23:57:55 2024
Fri Feb 09 23:57:56 2024
username is valid
Fri Feb 09 23:58:04 2024

しかし、私は必要です。

i am a user
username is valid 
Fri Feb 09 23:58:04 2024

どうすればいいですか?

要件は、終了(行)にタイムスタンプを印刷することだけではありません。要件は、ORA-1653一致する単語が見つかり(たとえば)、次の次の行がタイムスタンプの場合はこれらの2行が削除されますが、一致する単語がなく、次の次の行がタイムスタンプの場合、タイムスタンプは次のとおりです。削除されません。

答え1

これにより、入力した入力に基づいて期待する出力が生成されます。

$ head -n 1 file; tail -n 2 file
I am a user
username is valid
Fri Feb 09 23:58:04 2024

これが必要なすべてでない場合は、質問を編集して出力する3行を選択する必要がある要件を教えてください。

答え2

-v鍵を使用できますgrep。このオプションがない場合はパターン付きのgrep行が印刷され、オプションが-vない場合はgrepパターンなしの行が印刷されます。

無視する行タイプは 2 つあるため、grep検索には 2 つのモードが必要です。とマークしてください-e

したがって、次のことを試すことができます。

grep -v -e "ORA-1653" -e "Fri Feb" aa.text

答え3

仮定:

  • 3つの異なる行形式があります...
  • フォーマット#1:行は次から始まります。ORA
  • フォーマット#2:行に日付/タイムスタンプ形式が含まれています。Day Mon dd hh:mm:ss yyyy
  • フォーマット#3:一致しないものフォーマット#1またはフォーマット#2
  • 目標は...
  • 無視するフォーマット#1
  • 最後の行を印刷するフォーマット#2
  • すべてのアイテムを印刷フォーマット#3

アイデアawk

awk '
BEGIN    { regex = "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]" }    # hh:mm:ss

/^ORA/   {                next }                           # format #1

NF==5 &&
$4~regex { last_dt = $0 ; next }                           # format #2

1                                                          # format #3 (ie, everything else)

END      { print last_dt }
' aa.txt

これで以下が生成されます。

I am a user
username is valid
Fri Feb 09 23:58:04 2024

答え4

使用幸せ(以前のPerl_6)

~$ raku -e 'my @day-of-week = <Sun Mon Tue Wed Thu Fri Sat>;  \
            for slurp() { 
                put S:g/ ^^ ORA \- 1653 \: \h .+? $$ [\n ^^ @day-of-week .+? $$]? \n // 
            };  file

#or

~$ raku -e 'my @day-of-week = <Sun Mon Tue Wed Thu Fri Sat>;  \
            S:g/^^ ORA \- 1653 \: \h .+? $$ [\n ^^ @day-of-week .+? $$]? \n //.put for slurp;'  file

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。ファイルがslurp編集され(メモリとして一度読み込まれる)、2つのターゲット行がS///Rakuの「big-S」代替演算子の認識ドメインに記述されます(名前付き引数を使用してグローバル化されますS:g///)。 2行目は[\n ^^ Fri .+? $$]?列挙子のオプションです?。交換された半分には何もなく、認識されたテキストシーケンスが削除されます。

入力例:

ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [PCRMR2S]
I am a user
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [PCRMR2S]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:52 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:55 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:58:03 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
username is valid
Fri Feb 09 23:58:04 2024

出力例:

I am a user
username is valid
Fri Feb 09 23:58:04 2024

\n上の「例出力」の末尾に改行文字が挿入されたようです。これが問題であれば、.trim-trailingとfinalの間にルーチン呼び出しを挿入することで解決できます。S:g///.put


slurp上記の方法は、ファイルのメモリが一度にある場合に機能します。サイズが問題の場合、以下の答えはinput_fileを1行ずつ読みます。楽を使う3元演算子(Perlとスペルが少し異なります):テスト ?? 本物 !! 間違った

~$ raku -e 'my @day-of-week = <Sun Mon Tue Wed Thu Fri Sat>; my $flag = 0; \
            for lines() { / ^ ORA \- 1653 \: \h .+ $ /          \
                ?? ( $flag=1 andthen next )                     \
                !! ( $flag == 1 and / ^ @day-of-week .+ $ /)    \
                    ?? ( $flag=0 andthen next )                 \
                    !! ( .put andthen $flag=0 ) };'   file
I am a user
username is valid
Fri Feb 09 23:58:04 2024

https://docs.raku.org/routine/slurp
https://docs.raku.org/言語/regexes#S///__non-breaking_substitution
https://docs.raku.org/言語/operators#infix_??_!
https://raku.org

関連情報