aa.text
Linuxシステムには、次の行を含むファイルがあります。
$ 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