- PR -

grepについて

1
投稿者投稿内容
ゆえる
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 57
投稿日時: 2006-06-12 14:32
いつも拝見させて頂いています。

前回、mvで教えていただいた。


mv `ls | grep -E "(aaa[3-9]|aaa[0-9]{2}+)"` /aaa/old/backup"`date +%Y%m%d`"/


を使用して aaa3〜aaa9 を移動させていました。


今回、aaa1〜aaa17まで数字が増え現在のコマンドでは aaa3〜aaa17 まで表示するようになりました。

今回は aaa1〜aaa16 まで残し、aaa17から移動させたいのですが上記のコマンドに

どの様に追加すればよろしいでしょうか?


aaa[?-?]の数字を変えてみたり削ってみたりとしてみたのですが解決できませんでした。

よろしくお願いします。


あと、このコマンドは特殊なのでしょうか? どの様に検索してもでてきませんでした。

Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2006-06-12 14:54
引用:

mv `ls | grep -E "(aaa[3-9]|aaa[0-9]{2}+)"` /aaa/old/backup"`date +%Y%m%d`"/


(aaa[3-9]|aaa[0-9]{2}+)
の部分は、正規表現と呼ばれる記載手法です。
前回の質問ではこの単語が出てなかったみたいですが、
とりあえず正規表現について調べてみたほうがよいかと。

あとは試行錯誤してやるにしても、どう正規表現が展開されてるのかくらいは
把握したほうがいいでしょう。
bash環境なら
bash -x
を実行後にコマンドを実行すると、どう展開されたかわかる状況になります。

実際には、
grep -E "(aaa[3-9]|aaa[0-9]{2}+)"
の部分を修正したものの結果だけ確認していけば十分です。
ゆえる
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 57
投稿日時: 2006-06-12 17:22
Mattunさん、ありがとうございます。

正規表現って言うんですね。初めて知りました。

今、色々と調べてる最中ですが・・・

やっぱりよくわかんなかったり・・・

ここら辺はもうちょっと調べて見ないとわかりませんね。


できましたらまたご報告致します。
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 2006-06-13 02:28
どういうキーワードで検索しようとしたのかわかりませんが、
基本は man grep では?

それ以前に、grep(と正規表現)を持ち出さなくてもこの程度の
ルールならシェルのワイルドカード展開で十分できそうですが。
ゆえる
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 57
投稿日時: 2006-06-13 10:13
お世話になります〜。

paniponi-xさん

ワイルドカード展開を色々調べてみましたが、どの様にすれば良いか
よく分かりませんでした。

今回は一応正規表現を使いできたのですが、これで正しいのかがわかりません。

mv `ls | grep -E "(aaa[1][7-9]|aaa[2][0-9]+)"` /aaa/old/backup"`date +%Y%m%d`"/

こんな感じでいいのでしょうか?

一応 aaa17〜20-9 までは表示することができました。
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 2006-06-13 19:47
引用:

mv `ls | grep -E "(aaa[1][7-9]|aaa[2][0-9]+)"` /aaa/old/backup"`date +%Y%m%d`"/



とりあえず、aaaの後に来る数字部分が二桁なら大丈夫じゃないですかね。
ただ、共通部分はまとめられるのと、一桁の数字ならブラケットで囲む必要は
ないので、

コード:
bash-3.00$ for i in `seq 1 200`; do echo "aaa"$i; done | grep -E 'aaa(1[7-9]|2[0-9])$'
aaa17
aaa18
aaa19
aaa20
aaa21
aaa22
aaa23
aaa24
aaa25
aaa26
aaa27
aaa28
aaa29



とか。数字部分を二桁に限定するために$をつけています。
これがないと aaa171 とかいうファイル名がスルーされます。

で、シェルのワイルドカード展開(グロビング)ですが、

コード:
ls aaa{1[7-9],2[0-9]}



とすると、該当のディレクトリに aaa1 から aaa200 くらいまであったとして

コード:
aaa17  aaa19  aaa21  aaa23  aaa25  aaa27  aaa29
aaa18  aaa20  aaa22  aaa24  aaa26  aaa28



という結果が得られます。bashなら問題なくできますが、純粋なshだと
できないかもしれません。

ゆえる
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 57
投稿日時: 2006-06-14 10:13
paniponi-xさん

ありがとうございます。

色々と参考になりました。
ワイルドカード展開についてもまた調べていきたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)