印刷する前にawkでコマンドを実行する

印刷する前にawkでコマンドを実行する

ディレクトリサイズの計算中にディレクトリを一覧表示し、単純なコマンドを使用してディレクトリ全体を印刷したいと思います。エルエスそしてアッ、リストと表示する内容を効果的に制御できます。

ls -AlhF /usr | awk '{print $6, $7, $8, "\011", $9 }'

ただし、さらに一歩進んでフォルダやファイルのサイズを確認するには、$ 9と次のコマンドを使用します。Du-sこのような:

ls -AlhF /usr | awk '{print $6, $7, $8, "\011", $9, du -s /usr/$9 }'

バックティックまたは二重引用符を使用してさまざまな方法で作成しようとしましたが、常にエラーや不要な結果が発生しました。

ベストアンサー1

lsこの質問に答え、今は解析された出力に関する質問を無視してからコマンドの出力を取得するには、awk次のようにします。

cmd="that command"
output=""
while ((cmd | getline line) > 0)
  output = output line RS
status = close(cmd)

終了ステータスがエンコードされる方法状態変数はawk実装ごとに異なります。信頼できるのは、cmd成功した場合にのみゼロになるということです。

getlineコマンドラインを解析するには、シェル(通常はPOSIXシェルですが、一部のシステムではBourneシェルかもしれません)を起動します。したがって、その中にあるデータを正確に引用することが重要です。最も安全な一重引用符を使用するのが最善です。

ここで出力はとにかく1行なので(あなたのメソッドは改行はもちろん、空白文字を含むファイル名を処理することはできません)、次の1つだけを実行できますgetline

 awk -v q="'" '
   function shquote(s) {
     gsub(q, q "\\" q q, s)
     return q s q
   }
   {
     cmd = "du -sk " shquote("/usr/" $9)
     cmd | getline du_output
     status = close(cmd)
   }'

getline変数名なしで呼び出すと、$0ディスク使用量をより簡単に抽出できるように設定されます。

DIR=/usr export DIR
LC_ALL=C ls -l -- "$DIR" | awk -v q="'" '
  function shquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  {
    date = $6 " " $7 " " $8
    name = $9
    cmd = "du -sk " shquote(ENVIRON["DIR"] (ENVIRON["DIR"] ~ /^\/*$/ ? "" : "/") name)
    cmd | getline
    disk_usage = $1
    print date "\t" name "\t" disk_usage
  }'

おすすめ記事