1つのコマンドラインを使用して他の2つのコマンドの結果として2つの整数の減算を計算する方法

1つのコマンドラインを使用して他の2つのコマンドの結果として2つの整数の減算を計算する方法

ログディレクトリの下にログを出力するためにbashスクリプトを実行しています。最初は、次のようにして生成されたログの数を知りたかったです。

ls logs | wc -l

bashスクリプトはリアルタイムで実行されるため、以下を追加で使用できます。

watch -n 5 'ls logs | wc -l'

同時ログ・ファイルの数を表示します。

ただし、次のファイルの下の行数を確認してログファイルの総数を生成する必要があることもわかりますfile.txt

cat file.txt | wc -l

今度は、2つの数字を減算して生成する必要があるログの数を表示したいと思います。検索してみると、expr二重括弧を使用または使用するなど、シェルで数学を実行する方法はいくつかあります。たとえば、合計行数がfile.txt1000個であるとします。これをコマンドにハードコードすると、最後のコマンドは次のようになります。

`watch -n 5'lsログ| xargs expr 1000 - '

1000しかし、代わりにコマンドの結果を使用したいと思いますcat file.txt | wc -l。以下を試しましたが、動作しません。xargs2つのコマンドで2つの引数を受け取ってもいいのか、それともここではそうしないのかわかりません。

watch -n 5 'ls logs | wc -l | xargs expr "cat file.txt | wc -l" + '

file.txt(注:文字で始まらず、空白行ではなく行だけ数えたい場合はどうすればよいですか#?ここではどうすればいいですか?)本当にありがとう。

答え1

xargs2つのコマンドから2つのパラメータを受け取ることができるかどうかはわかりません。

複数の入力行に分散された複数のパラメータを使用してコマンドを実行できます。たとえば、次はxargs入力から取得した3つのパラメータexpr(順番にログ数-との行数file.txt)を使用して実行するように指示します。

(ls logs | wc -l; printf "%s\n" -; wc -l < file.txt) | xargs -n 3 expr

使用する方がより慣用的かもしれません。コマンドの置き換えここで:

expr "$(ls logs | wc -l)" - "$(wc -l < file.txt)"

[W]file.txtで#文字で始まらず、空行ではなく行数だけを計算するにはどうすればよいですか?

セダgrep:

grep -c -v -e '^#' -e '^$' file.txt
  • -c一致する行数の計算
  • -v次の一致しない行が選択されるように一致を反転します。
  • -e '^#^()で始まる行の一致#
  • -e '^$$start()の直後に終わる()行と一致します^。つまり、空です。

関連情報