次のtxtファイルがあります。
-----------------------------
CPU(%) SWAP Memory(%)
-----------------------------
181.2 0kB 0.4
12.5 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
SWAP列のすべての値が0kBであることを確認したいと思います。誰かを助けてほしい:)
答え1
を使用すると、簡単にこれを行うことができますawk
。最初のフィールドが数字のみで構成されるか.
(ヘッダー行をスキップできるように)、2番目のフィールドではなく行を印刷するだけです0kB
。
awk '$1~/^[0-9.]*$/ && $2!="0kB"' file
答え2
sed -r "s/^\s+/ /g" filename| awk 'BEGIN{print "-----------------------------------------------------\n CPU(%) SWAP Memory(%)\n -------------------------------------------- "} {gsub("kB","",$0)}{if($2 == "0"){print $0}}'
出力
-----------------------------------------------------
CPU(%) SWAP Memory(%)
--------------------------------------------
181.2 0 0.4
12.5 0 0.4
0.0 0 0.4
0.0 0 0.4
0.0 0 0.4
0.0 0 0.4
0.0 0 0.4
0.0 0 0.4
答え3
私を昔ながらと言うこともあり、確かに成果志向的ではないのになぜか何度も過去に帰るようです。バッシュループこういう時、もっと気分が良くなる「制御中」この方法。[ndlr:ちょうどカンタヤ]
> $ cat mytxt.txt
-----------------------------
CPU(%) SWAP Memory(%)
-----------------------------
181.2 0kB 0.4
12.5 1kB 0.4
0.0 10kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
0.0 0kB 0.4
端末で上のテキストファイルのフォルダに移動し、下の行を貼り付けます(変更「mytxt.txt」ファイル名と一致するように)
_x=0 ; while IFS=" " read -r _mycpu _myswap _mymem; do ((_x++)) ; case "${_mycpu//\ /}" in [0-9]*) if [[ ! "${_myswap//\ /}" =~ ^"0kB" ]]; then echo -e "line $_x) \t${_mycpu} \t${_myswap} \t${_mymem}"; else : ; fi ;; *|"") : ;; esac ; done < mytxt.txt
Enterを押してください...チャジャン!
line 5) 12.5 1kB 0.4
line 6) 0.0 10kB 0.4
説明とともに、より使い慣れた形式の同じオネライナーコード:
_x=0 ; \
while IFS=" " read -r _mycpu _myswap _mymem; do \
((_x++)) ; \
case "${_mycpu//\ /}" in \
[0-9]*) if [[ ! "${_myswap//\ /}" =~ ^"0kB" ]]; then \
echo -e "line $_x) \t${_mycpu} \t${_myswap} \t${_mymem}"; \
else : ; fi ;; \
*|"") : ;; \
esac ; \
done < mytxt.txt
説明する
- _x=各行を読み込むたびに、ラインカウンタを1ずつ増やします。 (_x++)
- IFS = "":ファイルから各行を読み取るときに区切り文字を「空白」に設定します。これにより、スペースで区切られた各テキストブロックを3つの変数(_mycpu、_myswap、および_mymem)に割り当てることができます。
- 次に、各行の最初の変数をテストします。_mycpu数字で始めて、最初に「削除」bash文字列操作を使用して、変数から不快なスペースをすべて削除します。 "//" 空白の場合は "\" を、空白置換文字列の場合は "/" を選択します (In の場合: なし):${_mycpu//\ /}次に、以下を使用して数値的にテストします。ケース[0-9]) ... ;;statement* - 空白行、ヘッダー、および行区切り文字の処理をテストしないようにすることで、他の条件を簡単に追加できます。
- case *|""): ;;明確さのための説明です。他のすべての場合は、残りのコードを実行し続けます。
- 最初のケースでは、ifステートメントで始まる!の否定的な「おおよその」比較を使用して、「0kB」の値に対して_myswapをテストします。 ^ [[ ... =~ ^"0kB" ]] を追加して変数が "0kB"で始まる場合、_myswapが "0kB"で始まらない場合は、行番号_xと値をエコーします。他のすべての変数について
- while...read...do... ループを閉じるには did ステートメントを使用します。
- 最後全周期に餌を与えるテキストファイルには<リダイレクタを使用してください。
楽しくお過ごしください!