目次 に戻る

2007 awk intro

GNU Awk 3.0.6 + multi-byte extension 1.15

note on ls -l via awk

”ls -l ”で の 標準出力を 見てみよう またその 追加の形も見ておこう

Pmt> ls -l
合計 8
-rw-r--r--    1 nyan       users         293  1月 13日  16:21 014_awkscr
drwxr-xr-x    2 nyan       users        4096  1月 13日  16:22 u_data/
Pmt> ls -l $*
合計 8
-rw-r--r--    1 nyan       users         293  1月 13日  16:21 014_awkscr
drwxr-xr-x    2 nyan       users        4096  1月 13日  16:22 u_data/
Pmt>  ls -l  | awk '{print $9}'

014_awkscr
u_data/
Pmt> ls -l  | awk '{print $5}'

293
4096

これらから フィールドは 9個 有るようである フィールドの 5は ファイ ルの大きさ で フィールドの 9 は ファイル(ディレクトリの場合も あるよう だが)の 名前を示している

ほんなら

Pmt> ls -l | awk '{ print $5,$9}'
 
293 014_awkscr
4096 u_data/
Pmt> ls -l | awk '{ print $5,"\t",$9}'
         
293      014_awkscr
4096     u_data/

少し修正して sh スクリプトを 作ってみる 即ち

014_bash.sh

Pmt> cat 014_bash.sh 
#!/bin/sh

ls -l $* | awk '{ print $5,"\t",$9}'
Pmt> ls -l 014_bash.sh 
-rw-r--r--    1 nyan       users          48  1月 13日  21:24 014_bash.sh

試行

Pmt> source 014_bash.sh 
         
293      014_awkscr
48       014_bash.sh
4096     u_data/
Pmt> ls -l | awk '{print $5,"\t",$9}'
         
293      014_awkscr
48       014_bash.sh
4096     u_data/

015_bash.sh

そこで もう少し 付け加えてみる 和を 求める 総数を 求める

        sum += $5
        ++filenum

として 付け加えると

Pmt> cat 015_bash.sh 
#!/bin/sh

ls -l $* | awk '
BEGIN { print "BYTES", "\t", "FILE" }
{ 
        sum += $5
        ++filenum
print $5,"\t",$9
}
END { print "Total: ", sum, "bytes (" filenum " files)" }'

試行

ほたら どうなるか、まず ファイルを確認

Pmt> ls -l | awk '{ print $5 , "\t" , $9}'
         
112      010_awkscr
34       011_awkscr
125      012_awkscr
293      013_awkscr
48       014_bash.sh
214      01_awkscr
721      01_phone_test
183      02_awkscr
188      03_awkscr
83       03_blank_lines
228      04_awkscr
226      05_awkscr
189      06_awkscr
50       07_awkscr
135      08_awkscr
91       09_awkscr

この状態で

Pmt> source ../../015_bash.sh 
BYTES    FILE
         
112      010_awkscr
34       011_awkscr
125      012_awkscr
293      013_awkscr
48       014_bash.sh
214      01_awkscr
721      01_phone_test
183      02_awkscr
188      03_awkscr
83       03_blank_lines
228      04_awkscr
226      05_awkscr
189      06_awkscr
50       07_awkscr
135      08_awkscr
91       09_awkscr
Total:  2920 bytes (17 files)
Pmt> source ../../015_bash.sh | cat -n
     1  BYTES    FILE
     2           
     3  112      010_awkscr
     4  34       011_awkscr
     5  125      012_awkscr
     6  293      013_awkscr
     7  48       014_bash.sh
     8  214      01_awkscr
     9  721      01_phone_test
    10  183      02_awkscr
    11  188      03_awkscr
    12  83       03_blank_lines
    13  228      04_awkscr
    14  226      05_awkscr
    15  189      06_awkscr
    16  50       07_awkscr
    17  135      08_awkscr
    18  91       09_awkscr
    19  Total:  2920 bytes (17 files)

なにか ピッタリとは来ない 良いようではあるが しかし ながら という感じ である

Pmt> bc -q
112+34+125+293+48+214+721+183+188+83+228+226+189+50+135+91
2920

改良

016_shell.sh

そこで もう少し 改良を加える 以下 参考にしたもの そのままの コピーで ある。

Pmt> cat ../../016_shell.sh 
ls -l $* | awk '
# filesum: list files and total size in bytes
# input: long listing produced by "ls -l"

#1 output column headers
BEGIN { print "BYTES", "\t", "FILE" }

#2 test for 9 fields; files begin with "-"
NF == 9 && /^-/ {
        sum += $5       # accumulate size of file
        ++filenum       # count number of files
        print $5, "\t", $9       # print size and filename
}

#3 test for 9 fields; directory begins with "d"
NF == 9 && /^d/ {
        print "<dir>", "\t", $9  # print <dir> and name
}

#4 test for ls -lR line ./dir:
$1 ~ /^\..*:$/ {
        print "\t" $0 # print that line preceded by tab
}

#5 once all is done,
END {
        # print total file size and number of files
        print "Total: ", sum, "bytes (" filenum " files)"
}'

試行

それでは

Pmt> source ../../016_shell.sh 
BYTES    FILE
112      010_awkscr
34       011_awkscr
125      012_awkscr
293      013_awkscr
48       014_bash.sh
214      01_awkscr
721      01_phone_test
183      02_awkscr
188      03_awkscr
83       03_blank_lines
228      04_awkscr
226      05_awkscr
189      06_awkscr
50       07_awkscr
135      08_awkscr
91       09_awkscr
Total:  2920 bytes (16 files)

こういう感じです、この使いかた

にゃんたろう 拝!
GNU Awk 3.0.6 + multi-byte extension 1.15
2007年 1月11日 (木) 22:01:21 JST 作成


目次 に戻る

Copyright © 2004.-2007. nyantarou All Rights Reserved.