目次 に戻る

2008 awk intro

GNU Awk 3.0.6 + multi-byte extension 1.15

ls -l の 抜粋 出力

今回は 9個 有る フィールド に対して 5番目 から 9番目 まで 出力 さ せる ということで 作成 してみる。大きさ、月、日、時間(年)、ファイル名

Pmt> ls -l ../../
合計 12
-rw-r--r--    1 nyan       users         749  1月 13日  22:02 016_shell.sh
-rwxr-xr-x    1 nyan       users          92  3月  2日 1997年 jjkhj*
drwxr-xr-x    3 nyan       users        4096  1月 13日  21:56 u_data/

簡単に考えると この様に なるでしょう

Pmt> ls -l $* | awk '{ print $5,"\t",$6,"\t",$7,"\t",$8,"\t",$9}'
                                 
37       1月     13日    22:23   017_scrpt.sh
4096     1月     13日    22:23   u_data/

sh に 組み込む

awk の 部分を sh に組み込むのは そのままの 条件で 良いようですが

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

ls -l $* | awk '{ 

print $5,"\t",$6,"\t",$7,"\t",$8,"\t",$9

}'

試行してみると

Pmt> source 017_scrpt.sh 
                                 
103      1月     13日    22:34   017_scrpt.sh
4096     1月     13日    22:23   u_data/

で 良いのでしょう、というわけで これに まず ヘッダー を つけてみましょ う

ヘッダー 付加

sh スクリプトとして

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

ls -l $* | awk ' 
BEGIN { print "大きさ","\t","月","\t","日","\t","時間(年)","\t","名前"}
{print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9}
'

試行してみると

Pmt> source 018_scrpt.sh 
大きさ   月      日      時間(年)      名前
                                         
103      1月     13日    22:34           017_scrpt.sh
207      1月     13日    22:47           018_scrpt.sh
4096     1月     13日    22:23           u_data/

空白の行が出力されています というのは フィールドが 9個 無い物も有り その場合は その行のフィールドが 5〜9に存在していないと 考えら れます

たとえ

この様なものを考えて

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

ls -l $* | awk ' 
BEGIN { print "不明1","\t","不明2","\t","\t","大きさ","月","\t","日","\t","時間(年)","\t","名前"}
{print $1,"\t",$2,"\t",$5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9}
'

試してみると

Pmt> source 019_scrpt.sh 
不明1    不明2           大きさ 月       日      時間(年)      名前
合計     16                                              
-rw-r--r--       1       103     1月     13日    22:34           017_scrpt.sh
-rw-r--r--       1       207     1月     13日    22:47           018_scrpt.sh
-rw-r--r--       1       261     1月     13日    23:07           019_scrpt.sh
drwxr-xr-x       3       4096    1月     13日    22:23           u_data/

従って その行は 出力しない というより フィールドが 9個 有る物だけを 対象に しよう マッチするものを対象 まず 最初が ”-”で始まるものを 対象に する事にすれば

マッチ その1

フィールド 1 の 最初が ”-”で始まるもの を 抽出 即ち

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

ls -l $* | awk ' 
BEGIN { print "大きさ","\t","月","\t","日","\t","時間(年)","\t","名前"}
/^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9}
'

試してみると

Pmt> source 020_scrpt.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:14           020_scrpt.sh

”ls -l”の 趣旨からは 外れるが 一応 良いであろう 失われたものは ディ レクトリ が 無くなった これを 救済せねば いけないが まず これで ファイル の 数と 合計の 大きさを 求めるものを 作成 してみよう。

021_script.sh

内容は

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

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

試行すると

Pmt> source 021_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
合計の大きさ : 1092 bytes(5files)

実績のもので 確認すると

Pmt> source u_data/016_shell.sh 
BYTES    FILE
103      017_scrpt.sh
207      018_scrpt.sh
261      019_scrpt.sh
212      020_scrpt.sh
309      021_script.sh
<dir>    u_data/
Total:  1092 bytes (5 files)

取り敢えずは いいのではないかいな? まだ ディレクトリが 無い状態であ るが、参考にしたものは これに条件 フィールドの数 9個 というのを 追記 し ている 即ち

/^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9
      sum+=$5
      ++filenum
}
                 ======================================
NF == 9 && /^-/ {print $5,"\t",$6,"\t",$7,"\t",$8,"\t\t",$9
      sum+=$5
      ++filenum
}

では

022_script.sh

内容は

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> 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
合計の大きさ : 1412 bytes(6files)
Pmt> source 021_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
合計の大きさ : 1412 bytes(6files)
Pmt> source u_data/016_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
<dir>    u_data/
Total:  1412 bytes (6 files)

今の 素直な感想は 過剰品質である 大きな目で 見ると この 機能を 付加す るのは 必要なのであろうが?

あと ディレクトリと他の 条件は 次の 所で 追記 していこう 今日は 此処 まで

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


目次 に戻る

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