以下を出力するコマンドがあります。
Some text here
1,3456: "Descr 1"
2,7891: "Descr 2"
3,0976: "Descr 3"
Some other random text here
最初の列を解析して値をどこかに保存して、エンドユーザーにオプションを提供できるbashスクリプトを作成したいと思います。
awkを使用して最初の列を取得することはできますが、最後のランダムなテキスト(「ここに別のランダムなテキストがあります」)のため、awkコマンドはめちゃくちゃになります。
これが私が今まで持っているものです:
#!/bin/bash
VERSIONS=`/usr/libexec/somebin -V`
OPTIONS=$VERSIONS | awk -F'[,]' '{print $1}'
while read -r line; do
echo "... $line ..."
done <<< $OPTIONS
それがすることは印刷するだけです:
Some text here
1,3456: "Descr 1"
2,7891: "Descr 2"
3,0976: "Descr 3"
... ...
でも印刷したいです。
1
2
3
ベストアンサー1
パイプ前の簡単なコマンド:
OPTIONS=$VERSIONS | awk -F'[,]' '{print $1}'
OPTIONS
に設定します$VERSIONS
。実際のユーティリティ名がないため、コマンドは単なる割り当てであるため、出力は生成されません。したがって、何もパイプで接続されていないため、awk
何もawk
しません。 (何かをしてはいけない$OPTIONS
。
悪いことに、パイプは前後のコマンドがサブシェルで実行されることを保証します。したがって、OPTIONS
複合コマンドを含むシェルには設定されません。
私はあなたが望むものは次のように思う。
OPTIONS=$(/usr/libexec/somebin -V | cut -f1 -d,)
または多分
VERSIONS=$(/usr/libexec/somebin -V)
OPTIONS=$(echo "$VERSIONS" | cut -f1 -d,)
ここで、cut
コマンドは呼び出したのと同じ操作を実行しますawk
。
ただし、awk コマンドまたは awk コマンドの両方が「特定のテキスト」を含む行をフィルタリングしないため、次の実際のフィルタが必要になる場合があります。
VERSIONS=$(/usr/libexec/somebin -V | grep ,)
OPTIONS=$(echo "$VERSIONS" | cut -f1 -d,)