
私はこれに慣れておらず、awk
オンラインで見つけた多くの提案を試しましたが、問題を解決することはできません。$number
-F arg値内で評価する変数が必要です。
このドアは期待どおりに機能します。
inn=$(ip ad)
vth=$(echo $inn | awk -F ' 6: |@' '{print $2}')
echo $vth
しかし、この「6」を抽出し、それに応じて値を変更する必要がありますが、どうすればよいですか?
これは最高の推測ですが、うまくいきません。
inn=$(ip ad)
vth=$(echo $inn | awk -vn="$number" -F ' n: |@' '{print $2}')
echo $vth
アップデート:@Archemarが提供したソリューションを試してみました。
コンソールではうまくいきますが、ファイルに追加すると機能しませんか?なぜ?変数の評価がどのように異なるか。ファイルを作成して自分で実行してみてください。快適?
編集:1)$innを追加する2)コンソールと.shファイルで実行することの違い
答え1
これはシェルの問題に近いです。試してみましたか?
vth=$(echo "$inn" | awk -F ' '"$number"': |@' '{print $2}')
- シェルがbashであることを確認してください(例:最初の行は
#!/bin/bash
)。 - 他の場所で必要でない場合は、
$inn
次を使用します。vth=$( ip ad | ... )
@
(または)の結果を再現できません。ip a s
ip ad
$number
使用するLANインターフェース名番号をキャプチャしてください。
vth=$(ip a s | awk -F'[: @]' -v n="$number" '$1 == n { print $3 ; exit; }' )
の結果はip a s
解析できないことに注意してください。
ユーティリティを使用してより簡単に解析できるjsonスクリプトを生成する-j
オプションがあります。ip
jq
答え2
BEGIN
ブロックの使用:
awk -v n="$number" 'BEGIN {FS=" " n ": |@"}'
したがって、あなたのものは次のとおりです。
vth=$(echo "$inn" | awk -v n="$number" 'BEGIN {FS=" " n ": |@"} {print $2}')