GNU Awk 3.0.6 + multi-byte extension 1.15
”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 }
を 付記すれば良いであろう
そうして 作成した物が 以下の物である
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 }
を 組み込みます
内容は
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 '
に 変更してみましょう 検証用の 物も 作成しておきましょう
内容は
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)" }
'
これは 参考の物を 変更したもの
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”は 参考にした ものを一部 独断と偏見にて 改悪したもの 検証用である 試してみましょう
では 試してみましょう
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)
では 試してみましょう
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.shu_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 作成