列のすべての値を文字列と比較

列のすべての値を文字列と比較

次の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 ステートメントを使用します。
  • 最後全周期に餌を与えるテキストファイルには<リダイレクタを使用してください。

楽しくお過ごしください!

関連情報