2番目のコマンドでは、「grep」の出力を変数として使用します。

2番目のコマンドでは、「grep」の出力を変数として使用します。

現在、特定のタスクに必要なデータを収集するために使用する2つのbashコマンドライン文字列があります。私は仕事を簡素化しようとしていますが、スクリプトを使用せずに1つのコマンドだけを使用してデータを収集しようとしています。

cat最初にファイルを作成してgrepコマンドをパイプすると、整数値のみが表示されます。次に、その値を方程式にコピーして貼り付けます。方程式は、grep最初のコマンドの ped 値を除いて、常に同じままです。

  • 最初のコマンド: cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$'
  • 2番目のコマンド: echo $(( (2147483633-"**grep value**")/5184000 ))

私はこれを達成する方法について混乱しています。これについてのご案内をいただきありがとうございます!

答え1

これはコマンドです:

echo $(( (2147483633 - $(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$') )/5184000 ))

簡略化を行う方法

まず、次のパイプラインを検討してください。

cat /proc/zem0 |grep -i isrs`

これは次のように単純化できます。

grep -i isrs /proc/zem0

したがって、最初のコマンド全体は次のようになります。

grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'

最後の変更は、コマンド置換を使用して最初のコマンドを2番目のコマンドに置き換えることです$(...)。したがって、次のものを置き換えます。

echo $(( (2147483633-"**grep value**")/5184000 ))

そして:

echo $(( (2147483633-$(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'))/5184000 ))

別の単純化

grepGNUなどのPerlスタイルの正規表現をサポートしている場合は、grepコメントでjimmijが提案したようにさらに単純化できます。

echo $(( (2147483633-$(grep -Pio 'isrs.*?\K[0-9]+$' /proc/zem0))/5184000 ))

答え2

John1024が答えたようにコマンド置換を使用することがこの問題を解決するための最良の方法です。

または、出力をにパイプすると、while readスペースで区切られた各値が選択した変数に割り当てられます。これは通常、出力に使用したい変数が複数ある場合に使用されます。

cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$' | while read myvariable ; do echo $(( (2147483633-"${myvariable}")/5184000 )) ; done

while read列形式のデータ、インベントリへのコンテンツの挿入などに非常に便利です。たとえば、file1コンテンツが次のような場合:

host1 192.168.0.100 web nyc1 00-23-54-EE-10-5C
host2 192.168.0.101 web nyc2 00-23-54-EE-10-5D
host3 192.168.0.102 web nyc1 00-23-54-EE-10-5E

それではあなたはできます。

cat file1 | while read host ip role dc mac ; do
    cobbler system add --name=${host} --ip-address=${ip} --netmask=255.255.255.0 --mac-address=${mac} --comments="${role} ${dc}"
done

関連情報