ログディレクトリの下にログを出力するためにbashスクリプトを実行しています。最初は、次のようにして生成されたログの数を知りたかったです。
ls logs | wc -l
bashスクリプトはリアルタイムで実行されるため、以下を追加で使用できます。
watch -n 5 'ls logs | wc -l'
同時ログ・ファイルの数を表示します。
ただし、次のファイルの下の行数を確認してログファイルの総数を生成する必要があることもわかりますfile.txt
。
cat file.txt | wc -l
今度は、2つの数字を減算して生成する必要があるログの数を表示したいと思います。検索してみると、expr
二重括弧を使用または使用するなど、シェルで数学を実行する方法はいくつかあります。たとえば、合計行数がfile.txt
1000個であるとします。これをコマンドにハードコードすると、最後のコマンドは次のようになります。
`watch -n 5'lsログ| xargs expr 1000 - '
1000
しかし、代わりにコマンドの結果を使用したいと思いますcat file.txt | wc -l
。以下を試しましたが、動作しません。xargs
2つのコマンドで2つの引数を受け取ってもいいのか、それともここではそうしないのかわかりません。
watch -n 5 'ls logs | wc -l | xargs expr "cat file.txt | wc -l" + '
file.txt
(注:文字で始まらず、空白行ではなく行だけ数えたい場合はどうすればよいですか#
?ここではどうすればいいですか?)本当にありがとう。
答え1
xargs
2つのコマンドから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()の直後に終わる()行と一致します^
。つまり、空です。