• ベストアンサー

文字列抽出について

環境 ・Windows2000 SP4 ・Cygwin ※Windows環境ですがやりたいことがUNIX(bash)ベースなのでこちらに質問させていただきました。 あるディレクトリで ls -lAF | grep "^-" を実行し以下の出力(以下例)を得た後、awk等で「ファイル名」「サイズ」「日付」を抽出したいです。 (例) -rw-r--r-- 1 A0000001 なし 62 Mar 4 2005 aaa -rw-r--r-- 1 A0000001 なし 12099 Nov 7 2005 bbb -rw-r--r-- 1 A0000001 なし 62 Mar 9 2005 temp 1 ファイル名の取得は上記コマンド後、awkで$9を表示すれば、と思いましたが例の3番目の表示のようにファイル名がスペースで区切られていると表示が切れてしまい上手く取得できません。 $9以降の全てを抽出できるような方法をご教示いただけますか。awkでなくてもOKです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.6

#4です。 >上に書かれた方法はBEGINセクションに書くことをイメージされていますか? いいえ。BEGINって何故? ls -lAF | awk '/^-/{size=$5;hiduke=$6" "$7" "$8;OFS="";for(i=1;i<9;++i)$i="";filename=$0;OFS=",";print filename,size,hiduke}'

aobei
質問者

お礼

見当違いなこと言ってすいません。。 なるほどです。 紹介いただいた例のfor文のあたりを こねくりまわしていたところでした。 今回の件でawkについていろいろ 知ることが出来ました。 ありがとうございました!

その他の回答 (5)

回答No.5

 やや正攻法ではありませんが、 /bin/ls -lQ | awk '/^-/{ FS=" " ; $0 = $0 ;printf "%4s\t%s %2s %s ", $5, $6, $7, $8 ; FS="\"" ; $0 = $0 ; print $2 }' でそれらしい出力が得られました。

aobei
質問者

補足

ありがとうございます。 はい。 たしかにサイズ、日付、ファイル名確認しました。 申し遅れましたがこの後の加工の都合でファイル名を 先頭に。。というリクエストを受けていました。 ただ目的のものは取得できているので こちらの案、考えさせていただきます。

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.4

awkでの方法です。 案1: FIELDWIDTHを使って固定長区切りにする 参考:http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html 案2: 必要な情報を取得した後で、 OFS="";$1="";$2="";中略;$8="";filename=$0;OFS=" "

aobei
質問者

補足

ありがとうございます。 案2の方法で試しています。 上手くいきそうな気配がしていますが 私のコマンド記述が悪くてもう一歩の ところでつまっています。 上に書かれた方法はBEGINセクションに 書くことをイメージされていますか? 申し訳ありませんが補足いただけないでしょうか。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

Perlのsplit関数を使います split関数に分割の上限をしていすることで、最後の項目に残りの部分がはいります。 $field=split(/\s/,$_,9); $fileName=$field[8];

aobei
質問者

補足

ありがとうございます。 すいません、環境の制約でbashの コマンドしか使えないのです。 perlで書けたら。。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

> おっしゃる通りの問題でつまっております。 と言うことで… #include <stdio.h> int main(void) { char buf[BUFSIZ]; char date[3][BUFSIZ]; char size[BUFSIZ]; char name[BUFSIZ]; while (fgets(buf, BUFSIZ, stdin) != 0) { sscanf(buf,"%*s %*s %*s %*s %s %s %s %s %[^\n]", size, date[0], date[1], date[2], name); printf("name=\"%s\"\n",name); printf("size=%s\n",size); printf("date= %s %s %s\n\n", date[0], date[1], date[2]); } return(0); }

aobei
質問者

補足

ありがとうございます。 参考にさせていただきます。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

ls -lAF | grep "^-" | awk ' { print "size=" $5 print "date=" $6 " " $7 " " $8 printf "name=" for (i = 9; i <= NF ; ++i) { printf "%s ", $i } printf "\n" }' なら一応抽出はできますが空白が1個とは限らないし、TABの場合もあるのでだめですね。 やっはりここはCで書いたほうが早いかな。

aobei
質問者

補足

早速のご回答ありがとうございます。 おっしゃる通りの問題でつまっております。 こちらの都合によりbashで作成することに なっておりなんとも。。といったところです。

関連するQ&A