目次 に戻る

2009 awk intro

GNU Awk 3.0.6 + multi-byte extension 1.15

ls -l の 抜粋 出力 条件 追記

”ls -l”の 抜粋出力として 9個 有る フィールド に対して 5番目 から 9番目 まで 出力 (大きさ、月、日、時間(年)、ファイル名 )させるものを 作成した これに 条件を 付加してもう少し 改良してみよう、現状の物は

Pmt> cat 022_script.sh 
#!/bin/sh
# file name : 022_scrpt.sh

ls -l $* | awk ' 
BEGIN { print "大きさ","\t","月","\t","日","\t","時間(年)","\t","名前"}
NF == 9 && /^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9
      sum+=$5
      ++filenum
}
END { print "合計の大きさ :",sum,"bytes("filenum "files)" }
'

の 様に ファイルの数と その大きさの 合計を 求める 様に なっているが ディレクトリ の 表示はされない 物である。今回はそのディレクトリも 有る様 式にて 出力させるようにする その条件としてディレクトリの 出力される 様子 を 見ると

Pmt> ls -l
drwxr-xr-x    3 nyan       users        4096  1月 13日  22:23 u_data/

の様に 第1番目の フィールドは 最初が ”d ”で 始まっている また フィー ルドの 数が 9個で あることにより 次の様な マッチの 条件が 考えられる 即 ち

NF == 9 && /^d/ 

フィールドが 9個 あり 最初は ”d ”で 開始を するもの これを 有る 条 件を つけて 出力 すれば 良い その場合は ディレクトリの 名前 と ディレク トリです ということのみ表示をする ということで

NF == 9 && /^d/ { 
   print " Directory name ","\t", $9
}

を 付記すれば良いであろう

023_script.sh

そうして 作成した物が 以下の物である

Pmt> cat 023_script.sh 
#!/bin/sh
# file name : 023_scrpt.sh

ls -l $* | awk ' 
BEGIN { print "大きさ","\t","月","\t","日","\t","時間(年)","\t","名前"}
NF == 9 && /^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9
      sum+=$5
      ++filenum
}
NF == 9 && /^d/ { 
   print " Directory name ","\t", $9
}
END { print "合計の大きさ :",sum,"bytes("filenum "files)" }
'

試行してみると

Pmt> source 023_script.sh 
大きさ   月      日      時間(年)      名前
103      1月     13日    22:34           017_scrpt.sh
207      1月     13日    22:47           018_scrpt.sh
261      1月     13日    23:13           019_scrpt.sh
212      1月     13日    23:30           020_scrpt.sh
309      1月     13日    23:28           021_script.sh
320      1月     13日    23:43           022_script.sh
378      1月     15日    11:16           023_script.sh
750      1月     13日    23:56           b023_script.sh
321      1月     13日    23:58           b024_script.sh
 Directory name          u_data/
合計の大きさ : 2861 bytes(9files)

合計の値を検証しておくと

Pmt> source 022_script.sh 
大きさ   月      日      時間(年)      名前
103      1月     13日    22:34           017_scrpt.sh
207      1月     13日    22:47           018_scrpt.sh
261      1月     13日    23:13           019_scrpt.sh
212      1月     13日    23:30           020_scrpt.sh
309      1月     13日    23:28           021_script.sh
320      1月     13日    23:43           022_script.sh
378      1月     15日    11:16           023_script.sh
750      1月     13日    23:56           b023_script.sh
321      1月     13日    23:58           b024_script.sh
合計の大きさ : 2861 bytes(9files)

というふうに なる

参考の物

ここで 参考にしたものを 考慮すると ”ls -lR”の 抜粋

Pmt> ls -lR
.:
合計 44
-rw-r--r--    1 nyan       users         103  1月 13日  22:34 017_scrpt.sh
-rw-r--r--    1 nyan       users         207  1月 13日  22:47 018_scrpt.sh
...
./u_data:
合計 336
...
-rw-r--r--    1 nyan       users          91  1月  9日  17:43 09_awkscr

の 中に ”./u_data:”の ような サブディレクトリが 現れる これを 区別 する 表現を 付記してあるこの場合 sh スクリプト 事態も 変更 しないと いけ ない 様であるが まず マッチ条件を 付記してみよう

$1 ~ /\..*:$/

フィールド 1が 最初 ”.”ピリオド で はじまり 最後”:”コロンで終わる ようなものを サブディレクトリと 考えて その場合 tab と その行全てを 出力 させよう というものを 組み込みます 即ち

$1 ~ /^\..*:$/ 
{
print "\t",$0
}

を 組み込みます

024_script.sh

内容は

Pmt> cat 024_script.sh 
#!/bin/sh
# file name : 024_scrpt.sh

ls -l $* | awk ' 
BEGIN { print "大きさ","\t","月","\t","日","\t","時間(年)","\t","名前"}
NF == 9 && /^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9
      sum+=$5
      ++filenum
}
NF == 9 && /^d/ { 
   print " Directory name ","\t", $9
}

$1 ~ /^\..*:$/ {
print "\t",$0 }

END { print "合計の大きさ :",sum,"bytes("filenum "files)" }
'

試して見ましょう

Pmt> source 024_script.sh 
大きさ   月      日      時間(年)      名前
103      1月     13日    22:34           017_scrpt.sh
207      1月     13日    22:47           018_scrpt.sh
261      1月     13日    23:13           019_scrpt.sh
212      1月     13日    23:30           020_scrpt.sh
309      1月     13日    23:28           021_script.sh
320      1月     13日    23:43           022_script.sh
378      1月     15日    11:16           023_script.sh
413      1月     15日    11:47           024_script.sh
 Directory name          u_data/
合計の大きさ : 2203 bytes(8files)

値の検証

Pmt> source 023_script.sh 
大きさ   月      日      時間(年)      名前
103      1月     13日    22:34           017_scrpt.sh
207      1月     13日    22:47           018_scrpt.sh
261      1月     13日    23:13           019_scrpt.sh
212      1月     13日    23:30           020_scrpt.sh
309      1月     13日    23:28           021_script.sh
320      1月     13日    23:43           022_script.sh
378      1月     15日    11:16           023_script.sh
413      1月     15日    11:47           024_script.sh
 Directory name          u_data/
合計の大きさ : 2203 bytes(8files)

この場合は 特に 何の 効果も 期待できないと 考えられます 最初の行が

ls -l $* | awk '

となっているからです この部分を

ls -lR $* | awk '

に 変更してみましょう 検証用の 物も 作成しておきましょう

025_script.sh

内容は

Pmt> cat 025_script.sh 
#!/bin/sh
# file name : 025_scrpt.sh

ls -lR $* | awk ' 
BEGIN { print "大きさ","\t","月","\t","日","\t","時間(年)","\t","名前"}
NF == 9 && /^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9
      sum+=$5
      ++filenum
}
NF == 9 && /^d/ { 
   print " Directory name ","\t", $9
}

$1 ~ /^\..*:$/ {
print "\t",$0 }

END { print "合計の大きさ :",sum,"bytes("filenum "files)" }
'

026_script.sh

これは 参考の物を 変更したもの

Pmt> cat 026_shell.sh 
ls -lR $* | 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)"
}'

”025_script.sh” は 作成付加したもの ”026_script.sh”は 参考にした ものを一部 独断と偏見にて 改悪したもの 検証用である 試してみましょう

025_script.sh の 結果

では 試してみましょう

Pmt> source 025_script.sh 
大きさ   月      日      時間(年)      名前
         .:
103      1月     13日    22:34           017_scrpt.sh
207      1月     13日    22:47           018_scrpt.sh
261      1月     13日    23:13           019_scrpt.sh
212      1月     13日    23:30           020_scrpt.sh
309      1月     13日    23:28           021_script.sh
320      1月     13日    23:43           022_script.sh
378      1月     15日    11:16           023_script.sh
413      1月     15日    11:47           024_script.sh
414      1月     15日    11:56           025_script.sh
750      1月     15日    11:54           026_shell.sh
 Directory name          u_data/
         ./u_data:
183      1月     13日    21:40           015_bash.sh
749      1月     13日    22:02           016_shell.sh
64       1月     9日     17:39           41_grades.data
121      1月     10日    22:02           42_President_list
735      1月     11日    20:45           43_list
200      1月     11日    21:53           44_data
109      3月     2日     1997年                  45_data
144550   11月    24日    21:10           jjmail01
145698   11月    24日    20:45           mail01
4845     11月    26日    21:59           note_001_mew_period
 Directory name          uu_data/
         ./u_data/uu_data:
112      1月     10日    16:38           010_awkscr
34       1月     10日    22:33           011_awkscr
125      1月     11日    20:49           012_awkscr
293      1月     11日    21:43           013_awkscr
48       1月     13日    21:24           014_bash.sh
214      12月    28日    20:33           01_awkscr
721      12月    28日    20:24           01_phone_test
183      12月    28日    21:06           02_awkscr
188      12月    28日    21:58           03_awkscr
83       1月     9日     17:12           03_blank_lines
228      1月     9日     11:34           04_awkscr
226      1月     9日     11:43           05_awkscr
189      12月    28日    21:59           06_awkscr
50       1月     9日     17:20           07_awkscr
135      1月     9日     17:26           08_awkscr
91       1月     9日     17:43           09_awkscr
合計の大きさ : 303541 bytes(36files)

026_script.sh の 結果

では 試してみましょう

Pmt> source 026_shell.sh 
BYTES    FILE
        .:
103      017_scrpt.sh
207      018_scrpt.sh
261      019_scrpt.sh
212      020_scrpt.sh
309      021_script.sh
320      022_script.sh
378      023_script.sh
413      024_script.sh
414      025_script.sh
750      026_shell.sh
    u_data/
        ./u_data:
183      015_bash.sh
749      016_shell.sh
64       41_grades.data
121      42_President_list
735      43_list
200      44_data
109      45_data
144550   jjmail01
145698   mail01
4845     note_001_mew_period
    uu_data/
        ./u_data/uu_data:
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:  303541 bytes (36 files)

いずれの結果も ファイルの数と その合計は等しいと いう事です 出力の フォーマットは 異なるとしても

補足

ここで sh スクリプトの 最初の部分

ls -l $* | awk '

の”$*”が 必要なのか という 素 朴な 疑問が 出てくるのですが 現在の所 解決していません

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


目次 に戻る

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