スクリプトを書いたところbash
、期待通りに動作しました。スクリプトは次のとおりです。
#!/usr/bin/env bash
DY=`date +%Y%m%d`
gunzip -c /var/log/cisco/cisco.log-$DY.gz > file.log
sleep 3
cat file.log | grep "Virtual device ath0 asks to queue packet" > file2.log
awk '{print $4}' file2.log > IP.log
sort IP.log | uniq > devices.log
wc -l devices.log
rm file.log file2.log IP.log devices.log
しかし、私は初心者なので、bash
そのようなスクリプトを実行するより良い方法があるかどうかを尋ねたいと思います (まだbash
環境内です)。どんな説明でも、私の学習を向上させるのに非常に役立ちます。
答え1
- スクリプトの機能と使用方法を説明するコメント付きヘッダーを使用する
- 移植性のためにPOSIXシェル(
/bin/sh
)を使用しますが、bash
単純なスクリプトでは必要ありません。 - ハードコードされた文字列の代わりに変数を使用する
$(some_command)
バッククォートの代わりに構文を使用することを検討してくださいcat
ではなくgrep
、代わりにgrep <pattern> <file>
- なぜ眠るのですか?
- ファイルが必要ない場合は一時変数を削除し、代わりにパイプを使用します
sort | uniq
次のように置き換えることができるsort -u
- 一時ファイルを使用する必要がある場合は、きちんと掃除する。
答え2
以下に、スクリプトのバリエーションを「ワンライナー」として示します。
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
grep "Virtual device ath0 asks to queue packet" | \
awk '{print $4}' | sort | uniq | wc -l
中間の一時ファイルの作成を回避するため、5月より高速になります。ただし、中間ファイルが必要な場合や使用する場合、ワンライナーはより悪い方向です。
十分によく書かれたシェル スクリプトを読んで学んだことの 1 つは、"grep | awk" シーケンスは組み合わせられることが多いということです。スクリプトでは、grep コマンドが置き換えられていることに注意してください。
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
awk '/Virtual device ath0 asks to queue packet/ { print $4 }' | \
sort | uniq | wc -l
答え3
最近、これを使うと便利だと分かりました非公式の bash strict モード:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
このパラメータ セットは、とりわけ、未設定の変数による予期しない事態を軽減するのに非常に役立ちます。