it-swarm-ja.com

パターンを使用してテキストのブロックをgrepする

短いテキストファイルがあり、特別なパターンを使用してデータを出力する必要があります。私のファイル:

99 test1
88 test2
10 test3
11 test1
12 test1
13 test2
14 test3
17 test1
18 test4

Test1からtest2、test3へと1つずつ。だから...私はコマンドを書いた:

sed '/test1.*\|test2.*\|test3/!d' filename

そして出力で私は結果を持っています:

99 test1
88 test2
10 test3
11 test1
12 test1
13 test2
14 test3
17 test1

この場合、私には必要のない行があります。

11 test1

17 test1

この行は次々と行きません。どうすれば結果が得られますか?私を助けてください。ご清聴ありがとうございました。私はこの結果を得るはずです:

99 test1
88 test2
10 test3
12 test1
13 test2
14 test3
1
Valeriu

データがtestというファイルにあると仮定します。ここではワンライナーですが、sedはありません。

cat test | tr '\n' '_' | grep -o '[0-9]*\stest1_[0-9]*\stest2_[0-9]*\stest3' | tr '_' '\n'

この行が何をしているのか

  1. testの内容をtr '\n' '_'で複数行から1行に変更する
  2. test1test2、およびtest3grep -o '[0-9]*\stest1_[0-9]*\stest2_[0-9]*\stest3'で他の部分より遅れている部分のみを取得します
  3. tr '_' '\n'を使用して1行から複数​​行に戻る
0
devopsfun