最初のゲームの後、特定の行から始めて、2つのゲーム間のすべてのデータをどのように印刷できますか?たとえば、2つのパターンLinux
があり、これら2つの単語の間に項目があり、単語の後の特定の行(以下の例ではLinuxの後の6行目、単語まで)のUnix
データを印刷したいとします。Linux
Unix
Linux
12
32
34
556
676
77
85434
rdb
232323
232435656
Unix
98736
4345
4546456
456
予想出力:
85434
rdb
232323
232435656
awk、sed、および grep を使用してこの操作をどのように実行できますか?
答え1
相手のアドレス指定が表示されるたびに、手を伸ばして探してみる必要がありますed
。
echo '/Linux/+7,/Unix/-1p' | ed -s input_file.txt -
または整理として:
ed -s input_file.txt - <<\EOF
/Linux/+7,/Unix/-1p
EOF
答え2
この試み、
awk '/^Linux$/{flag=1;next}/^Unix$/{flag=0}flag' file | tail -n +7
またはtail
:
awk '/^Linux$/{flag=1;n=NR;next}/^Unix$/{flag=0};flag&&NR>(n+6);' file
説明する:
- パターンを検索して
^Linux$
検出すると、flag
1(true)に設定され、next
その行に直接移動します。 ^Unix$
パターンが見つかるまで続行してflag
0(false)に設定します。- 最後の
flag
ものはawk固有のシンボルです。 true の場合はflag
行を印刷し、それ以外の場合は何もしません。 flag
変数名だけがあれば、f
何でも構いませんprintthisline
。
Gnuの使用sed
:
sed '/^Linux$/,/^Unix$/{//!b};d' file | tail -n +7
答え3
そのうちの1つを書きます。
sed -n '/Linux/,/Unix/p' file | sed '1,7d;$d'
# or
awk '/Linux/ {nr = NR} /Unix/ {exit} nr && NR > nr+6' file
答え4
検索すると、grep
次のようにできます。
grep -A 5 "string used to search" <path-to-file(s)>
一致する文字列の後に5行が表示されます。grep -B 5 "string used to search" <path-to-file(s)>
一致する文字列の前に5行が表示されます。grep -C 5 "string used to search" <path-to-file(s)>
一致する文字列の前後5行が表示されます(Cはコンテキストを表します)。
あなたの例は次のとおりです
grep -A 2 -B 1 "rdb" <path-to-file(s)>