私は次のawkステートメントを持っています
awk '/^string$/{i=1;next} i && i++ <= 2' file
その後、文字列を検索して2行を印刷します。
例えば
$ cat file
string
aaa
bbb
ccc
$ awk '/^string$/{i=1;next} i && i++ <= 2' file
$ bbb
私がしたいのは、2をカウンタに変更して毎回10行を繰り返すことです。例えば
for i in {1..5}
do
awk '/^111$/{i=1;next} i && i++ <= $i' file
done
もちろんこれはうまくいきません。コマンドがループにカプセル化されているため、可能であるかどうかはわかりません。
ちなみに、私がやりたいことは、設定ファイル(file.cfg)の[header]値を調べて、その変数が有効になっているか(変数=有効にする)ことです。
例えば
cat file.cfg
[header]
# nothing
variable = enabled
私の考えでは、コア属性は[header]が決定されていない行(おそらく1行目、おそらく122行目)にあることです。
そして、変数が常に[header]の後ろの2行目にあるわけではありません。一部の人は変数を7桁に置くことも、他の人は2桁に配置することもできます。
これが意味があることを願っております。
答え1
[header]
構成ファイルを 1 行ずつ作成した場合は、以下を使用variable=value
して特定のセクションのすべての値を取得できます。
sed -n '/^\[header\]/,/^\[/p' /path/to/file.cfg|grep -vE '?\s?[;#]'
このセクションでは、対応する文字で始まり、次の行までのすべてのsed
行をフィルタリングします。このコマンドは、またはで始まる行をフィルタリングします。[header]
[
grep
;
#
代わりにsedを使用できますawk
。質問に対する以前の回答に基づいてhttps://stackoverflow.com/questions/17988756/how-to-select-lines-Between-two-marker-patterns-which-may-occurr-multiple-times-w:
awk '/\[header\]/{print; flag=1; next}/\[/{flag=0}flag' file.cfg
grep
コメント行をフィルタリングするには、上記のコマンドを追加します。
答え2
シェルでは、文字列の間に空白なしで連結する場合は、文字列を連結できます。たとえば、次のようになります。
echo 'abc$def'"and so on"
abc$defand so on
したがって、あなたの例では、文字列を終了( ')し、文字列を開始( ")してシェルが
$i
文字列を補間できるようにします。
awk '/^111$/{i=1;next} i && i++ <= '"$i" file
あるいは、[header]
文字列がデータ行と簡単に区別できる場合は、awkの機能を使用して2行の間でコマンドを実行できます。たとえば、
seq 10 | awk '/6/,/9/{print}'
6〜9行が印刷されます。したがって、自分の数を数え、一般的な[header1]
ヘッダー構文を想定する代わりに(エスケープする必要があります)、次のようなものを使用できます。[
awk '/^\[header1]/,/^\[header2]/ { print }'