回答編集履歴

9

追加

2016/10/04 03:37

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -77,3 +77,77 @@
77
77
  while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Swx
78
78
 
79
79
  ```
80
+
81
+
82
+
83
+ awkの簡単な説明ですが
84
+
85
+ ```awk
86
+
87
+
88
+
89
+ awkはsedと同じように入力ファイル1行づつ処理を行います。
90
+
91
+  awk '{....}' <infile >outfile
92
+
93
+
94
+
95
+ 1行のセパレータはデフォルト空白またはタブですそれ以外は-Fにて指定することができます。
96
+
97
+ 今回はタブだけにしたいので-Fで指定しています。
98
+
99
+
100
+
101
+ 詳しくは'awk wiki'でググッた方が良いです。分かり易いです。
102
+
103
+ 今回使ったawkを解説します(分解して)
104
+
105
+
106
+
107
+ awk -F'\t' #タブのセパレータ指定
108
+
109
+
110
+
111
+ '{for(i=1;i<NF+1;i++){ #NFはタブ区切りのフィールド数 i:フィールドの位置として利用
112
+
113
+
114
+
115
+ if(i!=1){ #フィールドの一番目でない行判定
116
+
117
+
118
+
119
+ if(i==3){ printf"%2d",$i}\  #3番目のフィールドを2桁で表示
120
+
121
+
122
+
123
+ else if(i==4){printf"%10s",$i} #4番目のフィールドを10桁で表示
124
+
125
+
126
+
127
+ else{printf" %s",$i}} #1,3,4以外を表示
128
+
129
+
130
+
131
+ else{ff="";n=split($i,ar,"/");\ #1フィールド目を"/"で分解して配列arに挿入
132
+
133
+
134
+
135
+ while(n>0){ff=ff ar[n] "/";n--} #配列の最後から逆読みで/を加えてffに文字列追加
136
+
137
+
138
+
139
+ ;sub("/$","",ff);  #ff行の最後の余分な/を削除
140
+
141
+
142
+
143
+ printf "%-80s",ff} #ffを80桁の右詰で表示
144
+
145
+
146
+
147
+ }print""}' #ラインの改行を表示
148
+
149
+ ```
150
+
151
+
152
+
153
+

8

変更

2016/10/04 03:37

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -68,12 +68,12 @@
68
68
 
69
69
  #!/bin/sh
70
70
 
71
- find /home/ts21adm/test -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | nkf -Ws |\
71
+ find /home/ts21adm/test -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | nkf -Wsx |\
72
72
 
73
73
  LANG=C awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
74
74
 
75
75
  else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
76
76
 
77
- while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Sw
77
+ while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Swx
78
78
 
79
79
  ```

7

追加

2016/10/04 01:25

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -59,3 +59,21 @@
59
59
  while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-120s",ff}}print""}'
60
60
 
61
61
  ```
62
+
63
+
64
+
65
+ 実行環境のLANGをUTF8としています。表示用です。
66
+
67
+ ```bash
68
+
69
+ #!/bin/sh
70
+
71
+ find /home/ts21adm/test -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | nkf -Ws |\
72
+
73
+ LANG=C awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
74
+
75
+ else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
76
+
77
+ while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Sw
78
+
79
+ ```

6

変更

2016/10/04 01:15

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -44,18 +44,18 @@
44
44
 
45
45
 
46
46
 
47
- えあえずファイルパスの最大長を80としました。最終行の-80の部分で調整できます。
47
+ タブをセパレータして最大長を120としました。
48
48
 
49
49
  ```bash
50
50
 
51
51
  #!/bin/sh
52
52
 
53
- find /usr/local -printf "%p %M %n %s %TY-%Tm-%Td %TH:%TM\n" | \
53
+ find /usr/local -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | \
54
54
 
55
- awk '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
55
+ awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
56
56
 
57
57
  else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
58
58
 
59
- while(n>0){ff=ff ar[n] "/";n--};sub("\/$","",ff);printf "%-80s",ff}}print""}'
59
+ while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-120s",ff}}print""}'
60
60
 
61
61
  ```

5

更新

2016/10/03 14:17

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -41,3 +41,21 @@
41
41
  done
42
42
 
43
43
  ```
44
+
45
+
46
+
47
+ とえあえずファイルパスの最大長を80としました。最終行の-80の部分で調整できます。
48
+
49
+ ```bash
50
+
51
+ #!/bin/sh
52
+
53
+ find /usr/local -printf "%p %M %n %s %TY-%Tm-%Td %TH:%TM\n" | \
54
+
55
+ awk '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
56
+
57
+ else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
58
+
59
+ while(n>0){ff=ff ar[n] "/";n--};sub("\/$","",ff);printf "%-80s",ff}}print""}'
60
+
61
+ ```

4

修正

2016/10/03 07:06

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
20
20
 
21
- sed -e 's/^ //' -e s/\/$//'
21
+ sed -e 's/^ //' -e 's/\/$//'
22
22
 
23
23
  ```
24
24
 

3

追加

2016/10/03 06:29

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -23,3 +23,21 @@
23
23
  ```
24
24
 
25
25
 
26
+
27
+ revを使ってみました
28
+
29
+ ```bash
30
+
31
+ #!/bin/sh
32
+
33
+ find /usr/local/src -printf "%M %2n %10s %TY-%Tm-%Td %TH:%TM %p\n" | while read ff
34
+
35
+ do
36
+
37
+ echo "$ff" | rev | cut -d\ -f2- | rev | tr '\n' ' '
38
+
39
+ echo $ff | rev | cut -d\ -f1 | rev | awk '{n=split($1,ar,"/");while(n>0){printf ar[n] "/";n--}printf "\n"}' |sed 's/\/$//'
40
+
41
+ done
42
+
43
+ ```

2

変更

2016/10/03 05:51

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
20
20
 
21
- sed 's/\/$//'
21
+ sed -e 's/^ //' -e s/\/$//'
22
22
 
23
23
  ```
24
24
 

1

変更

2016/10/03 05:07

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -4,16 +4,22 @@
4
4
 
5
5
  階層を逆順で表示ですが、良いコマンドが見つからなかったのでawk
6
6
 
7
+ 修正してみました
8
+
7
9
  ```bash
8
10
 
9
11
  #!/bin/sh
10
12
 
11
- find /usr/local -printf "%M %2n %10s %TY-%Tm-%Td %TH:%TM %p\n" | \
13
+ find /usr/local -printf "%M %n %s %TY-%Tm-%Td %TH:%TM %p\n" | \
12
14
 
13
- awk '{for(i=1;i<NF+1;i++){if(i!=NF){printf $i" "}else{n=split($i,ar,"/");\
15
+ awk '{for(i=1;i<NF+1;i++){if(i!=NF){if(i==2){printf"%2s",$i}\
14
16
 
17
+ else if(i==3){printf"%10s",$i}else{printf" %s",$i}}else{n=split($i,ar,"/");\
18
+
15
- while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
19
+ printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
16
20
 
17
21
  sed 's/\/$//'
18
22
 
19
23
  ```
24
+
25
+