【sed】シェルスクリプト総合@LINUX Part2【awk】

このエントリーをはてなブックマークに追加
1ミスターバッシュ
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

前スレ
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。
2ミスターバッシュ:2006/08/03(木) 13:12:11 ID:5dVnjkpT
関連スレ
おまいら! sed の使い方教えて下さいm(_ _)m@linux板
http://pc8.2ch.net/test/read.cgi/linux/1067815570/l50
【Shell】どのシェル使ってる?【Script】@LINUX板
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
シェルスクリプト総合 その6
http://pc8.2ch.net/test/read.cgi/unix/1143302182/
sed@UNIX板
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
2ちゃん画像落としまくりスクリプト@UNIX板
http://pc8.2ch.net/test/read.cgi/unix/1003833552/
連番のH画像/動画を一気にダウンロードする2
http://pc8.2ch.net/test/read.cgi/unix/1135533382/

ログを読みたい人はこちら
http://makimo.to/cgi-bin/search/search.cgi?q=%83V%83F%83%8B%83X%83N%83%8A%83v%83g&andor=OR&sf=0&H=&view=table&all=on&shw=
3ミスターバッシュ:2006/08/03(木) 13:13:16 ID:5dVnjkpT
4login:Penguin:2006/08/03(木) 14:44:47 ID:NQ3T36sk
前スレで

one
two
three

の改行を「,」に置換してつなげたいと質問したものです。
結果として、sedではなく、pasteを使って解決致しました。

$ paste -s -d , file > newfile

sedでやる方法については、結構むずかしそう(Nとか駆使)なので、
時間をかけて勉強していきたいと思います。アドバイスして下さった
方々、ありがとうございました。これからもよろしくお願い致します。
5login:Penguin:2006/08/03(木) 17:55:54 ID:TFA/5ZAA
>4
からかって悪いけど、前スレで「tree 」を見たとき笑ってしもうた。
6login:Penguin:2006/08/03(木) 21:08:32 ID:NQ3T36sk
>>5
(*・∀・)あわてて、何事もなかったように直しましたとも。
7login:Penguin:2006/08/03(木) 21:47:36 ID:tNhCb6YC
>>1

>>4
他のスレで拾った物だけど
sed -ne '1h;1!H;${x;s/\n/,/g;p}' file > newfile

http://pc8.2ch.net/test/read.cgi/tech/1112553783/
8login:Penguin:2006/08/03(木) 22:39:28 ID:NQ3T36sk
>>7
ありがとうございます。今、テストしたら完璧でした!
原理はこれから学びます。胸のモヤモヤがとれました。
9login:Penguin:2006/08/03(木) 23:27:57 ID:TFA/5ZAA
関係ない話だけど、
「原理」とか「摂理」とかいう比較的重い意味を持つ概念が
怖いものの代名詞というか、近づいてはならぬものに
使われる言葉となってしまったことは悲しいことだ。

なんかbashのスクリプト一発でドカンと世界中の破壊的カルトを消滅させられればいいのに・・・
10login:Penguin:2006/08/04(金) 00:24:00 ID:YSnXFLrG
>>9

つ find 世界中 -name カルト -exec rm {}\;
11login:Penguin:2006/08/04(金) 00:39:59 ID:eCSPZD0t
どんなに自分(達)だけは違うとか言い張っても
スクリプト書いてる時点で所詮はハッカー夷的カルトだろ。
つか何で又とつぜん???
12login:Penguin:2006/08/04(金) 00:48:36 ID:tTQk3to+
>11
んにゃ、単に「原理」→「統一協会(統一=原理)」→
「破壊的カルト」と連想が行ったので、急に
「ビンラディンとか文鮮明とかおかしな連中を一斉に消せないかしら」
と思っただけで深い意味はないわ。
スレ汚し失礼。
13login:Penguin:2006/08/04(金) 02:16:12 ID:hXVs7Oof
rm -f /bin/ladin
14login:Penguin:2006/08/04(金) 02:20:36 ID:UtLdfbE9
$ gen-riken > /dev/null
15login:Penguin:2006/08/04(金) 07:15:35 ID:tTQk3to+
ははは。皆さんノリが良いですねえ。
16login:Penguin:2006/08/04(金) 21:29:56 ID:YSnXFLrG
質問です。

カレントに apple orange pine etc というディレクトリがあり、これに
次々とログインして(出来ればetc以外)、

$ myprog

と実行したいのですが、どこから手をつけて良いのやらまったくわかりません。
わかる方、ヒントだけでも結構ですので、ご教授頂けませんでしょうか?
17login:Penguin:2006/08/04(金) 22:03:09 ID:YSnXFLrG
微妙に自己解決

ls -1 | sed '/^etc/d' | xargs myprog

で出来たくさいけど、美しくないです。
出来れば、これを

$ myprog

一発でやれたらなと思ってます。
18login:Penguin:2006/08/04(金) 22:04:26 ID:YSnXFLrG
たびたびすいません。訂正です。

>>16
誤 次々とログインして
正 次々と移動して

でした。すいません。
19login:Penguin:2006/08/04(金) 22:38:41 ID:dXMK20nx
>>16

for workingdir in apple orange pine etc # 「etc」がいらなきゃ削れ
do
    cd $workingdir
    myprog
    cd ..
done

ま、cd .. という流儀が気に入らないという奴がこのスレにはいるかも。
そういう奴は適当にレスつけろや。
20login:Penguin:2006/08/04(金) 22:41:39 ID:wY0VtmKQ
sedじゃないからレス付けないわよ
21login:Penguin:2006/08/04(金) 22:53:54 ID:dXMK20nx
sedのスレじゃないんじゃない?スレタイの【sed】はpart1の継承と思われ。
22login:Penguin:2006/08/04(金) 23:03:25 ID:VDkmAFM5
>>19
>17はlsしてるから、こういうことのような気がする。
for workingdir in !(etc) # bashのみ

myprog一発の意味は良くわからないままだが。
23login:Penguin:2006/08/05(土) 09:14:42 ID:O9k+WVF/
ふつーfindじゃね?
ttp://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
-path pattern参照
24login:Penguin:2006/08/05(土) 14:47:48 ID:9HX9xiOs
{}\ の意味を教えてください!
GoogleやYahooで出ないよ!!!!なんでー
25login:Penguin:2006/08/05(土) 14:48:38 ID:J3gOyxfQ
>>24
引数は特にない。区切り記号
26login:Penguin:2006/08/05(土) 15:21:31 ID:4ssKXxYM
>>24

正確にいうと、

{}\ でなく、{} \

スペース空けないとエラーになります。
27login:Penguin:2006/08/05(土) 15:23:21 ID:J3gOyxfQ
>>26
正確に言うと{}\;ではないか
28login:Penguin:2006/08/05(土) 17:30:27 ID:XjGTvucN
>>24
話が見えないんだが…
find の引数ってことで良いの?
29login:Penguin:2006/08/06(日) 01:16:46 ID:Myj22fA7
まずman読もうよ....

>引き数は、 `;' を含む引き数にいたるまで、すべて command の引き数と
>みなされる。文字列 `{}' は現在処理しているファイル名に置き換えられる。
30login:Penguin:2006/08/07(月) 19:15:39 ID:C6inuQl7
>>19 >>22

亀レスですいません。アドバイスありがとうございます。
諸事情でネットに繋ぐことが出来ませんでした。

具体的にやりたいことを説明しますと、/var/spool/ml の下に100個程のディレク
トリがあります。etc他、数ディレクトリは無視して、任意のディレクトリ配下の
activeファイルからコメント行(#)を削除。その後、$ cp members actives を実行、
という感じです。
どういう用途かと言いますと、メーリングリストのユーザ設定ファイルのゴミ行を
整理する目的です。で、現在、次の様なmyprogというスクリプトを書き

#/bin/sh
PROGRAM=`basename $0`
HOME=/var/spool/ml/
for x in "$@"
do
if [ -d $x ]; then
if [ -f $x/actives ]; then
cd $x
sed '/^#/d' actives | sort | uniq > members;
cp members actives;
echo "done... $x"
else
echo "actives not found... $x"
fi
cd $HOME
else
echo "not direcotory... $x"
fi
done
31login:Penguin:2006/08/07(月) 19:16:14 ID:C6inuQl7
下記コマンドでやりたいことは出来るのですが
$ ls -1 | sed -e '/^bin/d' -e '/^etc/d' -e '/^@/d' -e '/^doc/d' | xargs myprog
出来れば、ls -1 の結果を配列(あるのかな?)に入れて、myprog内で実行したいと
思っています。また、こうすればもっと美しくなるというアドバイスもあれば、とても
うれしく思います。
32login:Penguin:2006/08/07(月) 19:30:10 ID:C6inuQl7
少し短くなりました。後は、ls -1 の結果を forに渡せれば完璧
なんですが(´・ω・`)

#/bin/sh
PROGRAM=`basename $0`
HOME=/var/spool/ml/t/

for x in "$@"
do
if [ -f $x/actives ]; then
sed '/^#/d' $x/actives | sort | uniq > $x/members;
cp $x/members $x/actives;
echo "done... $x"
else
echo "actives not found... $x"
fi
done

33login:Penguin:2006/08/07(月) 20:48:45 ID:gs8/6rb4
やりたいことできてるならそれでいいじゃん。
きれいに書きたいとか配列使いたいとかなら
もっとまともなスクリプト言語使った方がいいよ。
そういうのをシェルに求めちゃいかん。
34login:Penguin:2006/08/07(月) 22:46:57 ID:w0ywXoJn
やきもそ?
35login:Penguin:2006/08/07(月) 23:23:40 ID:h+JkAwh7
TOPDIR=/var/spool/ml/t/

cd "${TOPDIR}"
for x in *
do
case "$x" in
bin|etc|doc|@*)
continue
;;
esac

${PROGRAM}はいらないのでは?
${HOME}を書き換えるのも気持ち悪いかと
36login:Penguin:2006/08/08(火) 09:51:22 ID:xwC3gQjv
for x in `find hoge`でまわして
除外対象は${x%hoge}でチェックとかはよくやる。

あと、ここの前擦れにwhile+readの例があったと思う。
お、まんまの例があった。
ttp://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8
37login:Penguin:2006/08/10(木) 01:17:08 ID:hLDol0PX
>>33-36
アドバイスありがとうございます。
勉強になります。

>>35
PROGRAMは慣習でつけてます。拡張していった時に
echo "usage: $PROGRAM filename"
とかって使ったりするので。たしかにHOMEは気持ち悪いですね。直しました!

>>36
for x in `find hoge`
これは使えるかも!ありがとうございます!コマンド結果をxに渡せるとは
知りませんでした。
38login:Penguin:2006/08/11(金) 00:24:55 ID:dPYSw/pT
>>37
$0
39login:Penguin:2006/08/11(金) 19:52:52 ID:c1dCdFjO
Cutlist: 0-2731,19014-21714,37651-41262,64752-68382,80903-84503,95557-98910,
という出力を
0 2731 0
19014 21714 0
37651 41262 0
64752 68382 0
80903 84503 0
95557 98910 0
このように整形することはできました。(最後の0は定数)
さらにこの個々の値を全て29.97で割って倍精度出力したいのですが
シェルスクリプトでそこまで出来るでしょうか?
できるという方、その方法を教えてください。お願いします。

今のところのコマンド
mythcommflag --getcutlist -f /mpeg/rec/1007_20060609005300.mpg | grep Cutlist | sed -e 's/Cutlist: //' -e 's/-/\t/g' -e 's/,/\t0\n/g' | sed -e '$,$d'
40login:Penguin:2006/08/11(金) 20:41:43 ID:byhCsImE
>>39
最終結果(倍精度出力)はawkあたりを使うと良いと思われ。
41login:Penguin:2006/08/11(金) 22:17:16 ID:AQmE1c/e
>>40
#!/usr/bin/gawk -f
/^Cutlist/ {
sub(/^Cutlist: */, "", $0);
sub(/,$/, "", $0);
n = split($0, a, ",");
for(i = 1; i <= n; i ++){
split(a[i], j, "-");
printf("%f %f 0\n", j[1] / 29.97, j[2] / 29.97);
}
}
4239:2006/08/11(金) 22:27:22 ID:c1dCdFjO
>>40-41
ありがとうございます。神です。
今から自分で一行ずつ理解していくつもりです。
# ちょっと複雑な物はawkのがいいのかな

ありがとうございました。
43login:Penguin:2006/08/12(土) 02:02:48 ID:F5xv4HYx
基本的な質問ですが、このスレって、sed、awk限定ですか?
それとも、「シェルスクリプト総合」とある様に、他の質問などしても大丈夫
なんでしょうか?
44login:Penguin:2006/08/12(土) 02:22:13 ID:0D4xQrt3
【】はアホが付けたゴミなので無視すべし。
45login:Penguin:2006/08/12(土) 15:55:03 ID:qqxmgQZ0
>39
bcの有無次第という経験がある。
perlの方がawkの実装違いに悩むよりはいい鴨試練。

>43
expectあたりもおk
46login:Penguin:2006/08/12(土) 17:23:29 ID:rfgDoil3
wish もシェルの内?
47login:Penguin:2006/08/12(土) 17:49:22 ID:0P6HlNMI
仮にそうだとしても、このスレに書いても反応ないと思う。
48login:Penguin:2006/08/13(日) 00:22:41 ID:/XLxPgJE
大げさでも遠慮する必要もない、どんどん使え。
どうせperlは必須科目、読み書きできてあたりまえ。
pythonも必須科目になりつつある。
ruby、どうかな。
bashのスクリプトをpythonで書き直すとかはいい訓練になるよ。
古代象形文字を英語に翻訳する感じ。
49login:Penguin:2006/08/13(日) 00:33:57 ID:CGwN7DaL
>>48
そうですか。んでは次の方どうぞ。
50login:Penguin:2006/08/17(木) 14:26:19 ID:NdJCZwC6
正規表現について質問です。

dir
dir1
dir10
dir.tar
file.php

とあり、dir、dir1、dir10という風にdir[数字0桁〜2桁]へマッチさせたい
のですが、

"^dir[0-9][^\.]"

だと、dir自体にマッチしてくれません。どう書けばいいんでしょうか?
昨日からやってます。アドバイスお願い致します。
ちなみに、PHPのereg()です。
51login:Penguin:2006/08/17(木) 14:29:36 ID:1Ek0hIni
52login:Penguin:2006/08/17(木) 20:06:26 ID:nAJZh721
>>50
grep -e "^dir[0-9]*$"
53login:Penguin:2006/08/18(金) 00:36:00 ID:Dr7kWMUz
>>52
dir111

ハイアウト。
54login:Penguin:2006/08/18(金) 00:44:07 ID:RiO8CgXj
55login:Penguin:2006/08/18(金) 00:54:13 ID:OVN7tn41
数字は2桁までだそうですよ、センセ
56login:Penguin:2006/08/18(金) 00:55:07 ID:RiO8CgXj
なるほど。

>>52は俺じゃないけど

grep -e "^dir[0-9]$" -e "^dir[0-9][0-9]$"

これでいいんか?
57login:Penguin:2006/08/18(金) 01:01:10 ID:FNYS+oEf
grep じゃなくて PHP だそうですよ、センセ。
58login:Penguin:2006/08/18(金) 01:02:06 ID:K8QeIm2Y
だったらお前が書いてやれ、センセ
59login:Penguin:2006/08/18(金) 10:11:45 ID:uU/Ps5z+
(^dir$|^dir\d{1,2}$)
60login:Penguin:2006/08/18(金) 10:37:01 ID:FNYS+oEf
http://pc8.2ch.net/test/read.cgi/tech/1127806509/419
で解決してるみたいよ。
61login:Penguin:2006/08/18(金) 12:19:14 ID:uU/Ps5z+
dir\D+ともマッチしそうだけど、まいーか
62login:Penguin:2006/08/18(金) 12:23:17 ID:uU/Ps5z+
あ、大丈夫だな
63login:Penguin:2006/08/19(土) 17:46:13 ID:CKH2sw8O
テキストファイルの中から、 "\b[a-zA-Z]{10}\b" にヒットする単語
(スペース+アルファベット10文字+スペース)を抽出して一覧で出
したいんですが、手も足も出ません。

awkかsedで実現する方法を教えていただけませんでしょうか。
64login:Penguin:2006/08/19(土) 21:11:45 ID:lL38en3G
>>63
(step 1)1行複数単語→1行1単語の形式にまず直す。
これは\bを改行にtrすることでほぼ実現できる(余計な空行とか多少入るけど)。
(step 2)grep '^[a-zA-Z]{10}$' のようなことをする。
(grepの実装によっては{}をサポートしてたりしてなかったりするだろう)
6563:2006/08/19(土) 21:41:31 ID:CKH2sw8O
>>64
貴殿、頭いいな。方向性は見えた。Thanks。
66login:Penguin:2006/08/20(日) 12:36:50 ID:8BT2kJaV
きのうやっとsedとかawkの勉強を始めたOSX使いの俺はお断りですかそうですか。
断られないようにきっちり勉強してくると汁。

でもさあ、
いまいち練習のいいネタが見つからないんだよなあ。
みなさま正規表現の練習とかするときのネタは、どこから仕込んでるんですか?
67login:Penguin:2006/08/20(日) 12:45:30 ID:HHyoi7jx
>>66
htmlでも解析してみたらどうだい?
68login:Penguin:2006/08/20(日) 15:37:07 ID:6ucGe45P
>>66
俺は初めはviの置換で練習した。sedと同じ表記が可能。
awkは言語としてとらえたほうがいいかも。
6966:2006/08/20(日) 15:46:43 ID:8BT2kJaV
>>66
BlogのHTMLの解析をして、それをRSSにでっち上げるとか面白そうだからやってみようと思いますた。

さっきからdatを解析してました。HTMLに吐き出すもの。
この1行で処理するというのには正直感動。

$ cat dat1.dat | awk -F"<>" '{print "<h1>" $3 "</h1><p>" $4 "</p>"}' | sed -e 's/\(http:\/\/.*\/l50\)/<a href=\"\1\">\1<\a>/g' > test.html

こんな具合だけれど…。文章中にリンクがあったときに、自動でタグをくっつけるやり方がいまいちぱっとしない。

sed -e 's/\(http:\/\/[^/]*\)/<a href=\"\1\">\1<\a>/g'
ホストのトップディレクトリにリンクがはれる('A`)。

いわゆる | をつけて処理しようとすると、うちのsedは何も吐き出さないんだけれど、これはバージョンが古いってことかな。
70login:Penguin:2006/08/20(日) 16:58:41 ID:jjYenmqQ
1行で実現するより、複数行になってもawkオンリーあるいはsedオンリーで実現した方が美しいだろ。
71login:Penguin:2006/08/20(日) 17:00:11 ID:HHyoi7jx
>>70
TPO
72login:Penguin:2006/08/20(日) 20:07:25 ID:9C4Qkftc
xmlawkつかうといいよ。
73login:Penguin:2006/08/20(日) 23:30:08 ID:OEoaYPnv
それで練習になるのか?
74login:Penguin:2006/08/21(月) 02:12:20 ID:Wd9CmAkD
>>69
いわゆる | って正規表現の選択のやつ?
だとしたら、BREには選択はないのでそもそも使えない。

ただし、GNU sed だと \| という表記で使える。
75login:Penguin:2006/08/22(火) 21:07:59 ID:+v8xeAHC
初歩的な質問で恐縮です。

user1:AAAAAAAA
user2:BBBBBBBB
user3:CCCCCCCC

という中身のファイルがあったとします。で、user3の行があれば、第2カラムを
DDDDDDDDに変更。無ければ、user3:DDDDDDDDの行を追加したいのですが、何の
コマンドを使えばよろしいんでしょうか?希望としては、コマンド一発で出来る
方法を探っています。※Perlなどでスクリプトを組まない

お知恵をお借り出来ればと思います。宜しくお願い致します。
76login:Penguin:2006/08/22(火) 21:11:51 ID:iaWm4QvQ
>>75
(grep -v '^user3:' srcfile ; echo user3:DDDDDD) > tmpfile ; mv tmpfile srcfile
77login:Penguin:2006/08/22(火) 21:29:52 ID:+v8xeAHC
>>76

ありがとうございます。
でも、これだと、user1,user2が上書きされて消えてしまいます(T.T)
78login:Penguin:2006/08/22(火) 21:33:49 ID:iaWm4QvQ
ぇー
79login:Penguin:2006/08/22(火) 21:39:31 ID:+v8xeAHC
なんか例がわかりずらかったですね。
もっと細かく説明します。

adminファイル
admin:AAAAAAAA
power:CCCCCCCC

userファイル
user:DDDDDDDD

とあり、userファイルに、adminファイルの内容を追加したいのです。
追加だけなら

$ cat admin >> user

で済むのですが、既に追加済みの場合は、新しく、adminとpowerの行を
上書きしたいのです。わかりずらくてすみません。
80login:Penguin:2006/08/22(火) 21:46:24 ID:iaWm4QvQ
細かくも何もぜんぜん要求仕様ちがうやん。
いつのまにかファイル2個あるし。
81login:Penguin:2006/08/22(火) 22:10:49 ID:NABXSFVh
joinつうコマンドでできるような気がするが、オプション覚えるのがめんどくさいから、
俺はその手の処理にはawkを使うようにしている。
82login:Penguin:2006/08/22(火) 22:10:59 ID:+v8xeAHC
すいません。m(__)m
説明不足でごめんなさい。
83login:Penguin:2006/08/22(火) 22:36:43 ID:iaWm4QvQ
join 微妙だなぁ。cat してワンライナー組んじゃった方が早い感じ。
84login:Penguin:2006/08/22(火) 22:37:55 ID:qaN2f1N0
>>75を無理矢理一行で書いてみた。sed -iを使ったので反則気味。

#!/bin/sh

grep -q -c "user3:" userfile \
&& sed -i 's/^user3:.*$/user3:DDDDDDDD/' userfile \
|| echo "user3:DDDDDDDD" >> userfile
85login:Penguin:2006/08/22(火) 23:46:45 ID:90hvAnWP
Linuxをインストールする時のパッケージや設定とかをシェルスクリプトにまとめたことある人いますか?
シェルスクリプトはやったことがないので、こんな感じでまとめていいものか、
途方にくれています。


「スクリプト前」
# cd /etc
# mv -i logrotate.conf logrotate.conf.org
# cp -i -p logrotate.conf.org logrotate.conf
# vi logrotate.conf
# ci -u -zLT logrotate.conf



「スクリプト後」
if [ cd /etc];
then
mv -i logrotate.conf logrotate.conf.org &&
cp -i -p logrotate.conf.org logrotate.conf &&
cp -p /home/SHELL/logrotate.conf logrotate.conf &&
ci -u -zLT logrotate.conf
else
echo"logrotate Error!!!"
fi
86login:Penguin:2006/08/23(水) 02:58:44 ID:LeEwpLMn
>85
行動の成否で判定したいだけなら[]は余計。
87login:Penguin:2006/08/23(水) 05:01:38 ID:B3/HAlAd
引数に特定の文字列があるかどうか grep で確かめたい場合、
どういう書き方が一番いいでしょうか?
今は

if echo "$1" | grep 'h[ao]ge' > /dev/null ;then

こんな感じでやってるんですけど、
echo と /dev/null へのリダイレクトが冗長に思えるので、
もっと簡潔なやり方があれば教えてください。
88login:Penguin:2006/08/23(水) 06:01:06 ID:uCowIUgO
>>87
case $1 in h[ao]ge) echo found ;; *) echo notfound ; esac
正規表現じゃなくてパス名展開なので注意
89login:Penguin:2006/08/23(水) 19:14:08 ID:XWE7YPDO
>>87
grep -q
90login:Penguin:2006/08/23(水) 21:54:25 ID:m8SvDdPt
>>89
grep -s な環境もあるので、>/dev/null の方がポータブル。
91login:Penguin:2006/08/29(火) 10:44:29 ID:LacrCZoW
>>86の補足。

シェルスクリプトの文法では、if文は、
if コマンド; ...
なので、if cd ...; と書くという意味ね。

[ はif文の括弧じゃなくてtestコマンドへのリンク。
if [ ... ]; then は if test ...; then と等価。
test ではなく [ という名前で実行した場合は最後に ] という引数が
ないとエラーになるという作りになっている。
92login:Penguin:2006/08/30(水) 08:56:40 ID:ptUsDypX
あぁ、]は引数なのか。どうりでスペースが。。。
勉強になった。ありがと。>>85じゃないけど
93login:Penguin:2006/09/01(金) 20:00:08 ID:lCcTQKLy
bashで、ファイルAとファイルBの
タイムスタンプの同一性が確認したいのですが、
どーやればいいのでしょうか。
内容の同一性ではなく、あくまでタイムスタンプの同一性です。

Cでかけば、多分こんな感じ。
struct stat stat1=fstat(file1);
struct stat stat2=fstat(file2);
if( stat1.mtime==stat2.mtime){....}

bash ではどうするのでしょうか?
94login:Penguin:2006/09/01(金) 20:08:17 ID:5aC2i0M0
test ! tstest1 -nt tstest2 -a ! tstest1 -ot tstest2 && echo hoge
95login:Penguin:2006/09/01(金) 20:46:18 ID:9V2XQm3y
>>93
statを使えば可能かと
96login:Penguin:2006/09/03(日) 02:05:43 ID:F8zNeDUy
ディレクトリを755
ファイルを644で一括して変換したいんですが、

$ chmod -R 755 dir

だと、ファイルも755になってしまします。何か良い方法かコマンドがあったら
教えて下さい。chmodのman見たけど、ないっぽいのでこちらで質問します。
97login:Penguin:2006/09/03(日) 02:10:10 ID:Ke5Muy7n
find -type
98login:Penguin:2006/09/03(日) 11:45:21 ID:bshh0ysH
>>96
find tmp \( -type d -exec chmod 0755 {} \; \) -o \( -type f -exec chmod 0644 {} \; \)
99login:Penguin:2006/09/03(日) 11:47:59 ID:O81fbTM3
findってキモいなぁ
100login:Penguin:2006/09/03(日) 11:54:50 ID:Kb773J88
chmod -R a+r,u+w
10196:2006/09/03(日) 12:49:17 ID:F8zNeDUy
>>97-100
アドバイスありがとうございます!解決しそうです。
102login:Penguin:2006/09/03(日) 13:12:10 ID:K075yEZw
zshでしあわせになろうと、
chmod 755 **/*(/)
chmod 644 **/*(.)
を試みたらディレクトリが深すぎて怒られることもある。

一発でやらないなら
find -type d -print0 | xargs -0 chmod 755
find -type f -print0 | xargs -0 chmod 644
が一番汎用性が高くてすっきりしているか。
Darwinの非GNU find/xargsにも-print0や-0あるようだし。
103login:Penguin:2006/09/03(日) 13:12:44 ID:K075yEZw
find . 以下略にすべきでした。
104login:Penguin:2006/09/03(日) 13:45:39 ID:K075yEZw
そういえばここLinux板だった。GNU find/xargs前提でいいんだな、きっと。
105login:Penguin:2006/09/04(月) 15:50:53 ID:N5MHYTmG
mkdir でディレクトリを作成してそのディレクトリに移動するスクリプトを書きたいと思っています。
#!/bin/sh
mkdir $1 && cd $1
だと、子プロセスが移動するだけで親がcdしてくれません。いい方法はないでしょうか。
106login:Penguin:2006/09/04(月) 15:57:14 ID:dcVwde1w
いまいち、意味がよくわからんけど、
呼び出すときに、
$ . /hoge.sh
とするということか?
107login:Penguin:2006/09/04(月) 16:36:14 ID:N5MHYTmG
>>106
意味が分かりにくくてスミマセン。
パスが通ったところに例えばmkdircdという名前で置いておいて
$ mkdircd $(date +%Y%d%m)-1
とすると、$(date +%Y%d%m)-1というディレクトリを作成して
そこにcdするという意味です。言い換えると、
$ mkdir $(date +%Y%d%m)-1
$ cd $(date +%Y%d%m)-1
を一度にするという意味です。mkdirのワラッパーを作成してalisasで置き換え、
例えば--cdというオプションがあれば、mkdirした後にそこへcdするというもの
でも構いません。
# 単に打鍵数を減らして横着したいだけなのですが。。

108login:Penguin:2006/09/04(月) 16:38:38 ID:Xg7jkciV
ふふふ
109login:Penguin:2006/09/04(月) 16:38:41 ID:vaQkza9Z
「ワラッパー」ってのが何だかわからんけど、
関数じゃだめなん?
110105:2006/09/04(月) 16:52:20 ID:N5MHYTmG
>>109
ありがとうございます。解決しました。
mkdircd () { /bin/mkdir $1 && cd $1; }
111login:Penguin:2006/09/04(月) 19:50:25 ID:Zd0ujhiz
>>102
find -type d -exec chmod 755 {} \;
find -type f -exec chmod 644 {} \;
112login:Penguin:2006/09/04(月) 22:34:21 ID:sHXG9gFj
wrap = ラップ (サランラップとかラッピングとか)
113105:2006/09/04(月) 23:17:00 ID:N5MHYTmG
>>112
ありがと。ラッパーでつね。
114login:Penguin:2006/09/04(月) 23:31:18 ID:GlEy5cG5
chmod -R 644 /
115login:Penguin:2006/09/05(火) 10:08:07 ID:5E+/nWTh
シェルスクリプトの中で変数中の "`" を "\`" に escape したいんですができません

#!/bin/sh
S='a`b'
S2=`echo "${S}" | sed 's/\`/\\\`/g'`
echo "${S2}"

a`b

外部に sed script をおけばできるんですが
shell script の中だけではむりでしょうか
116login:Penguin:2006/09/05(火) 10:36:35 ID:CtztP3Q6
そらそだ
117login:Penguin:2006/09/05(火) 10:53:09 ID:4GXGTKmU
S2=`echo "$S" | sed 's/\`/\\\\\`/g'`
118115:2006/09/05(火) 22:33:00 ID:pCLRKlZc
>>117
なるほど、できました
しっかし、これは難しかった
#!/bin/sh が `----` を解釈するとき
sed 's/\`/\\\\\`/g' が sed 's/`/\\`/' になって、
sub shell が '----' を解釈して
sed に $1==s/`/\`/ を渡すということですか!!

119login:Penguin:2006/09/05(火) 22:54:42 ID:dRnTZ/L0
>>118
なんかああー!もうだめー!ブリブリぶりー!!って言うコピペに見えた。
120login:Penguin:2006/09/05(火) 23:33:33 ID:w48ryD58
>>119
眼科池
121login:Penguin:2006/09/06(水) 01:03:44 ID:k0MtvRe2
>>119
脳外科池。
2chの見過ぎには注意しよう。
122login:Penguin:2006/09/07(木) 17:27:40 ID:iCRx2SWb
dir以下を再帰的に掘っていって、全てのファイル(.txt)の中の文字列

SAM001P (SAM+三桁数字+英1桁〜2桁)

のSAMを削除をしたいんですけど、どんな感じでスクリプトを作れば良いか
アドバイス頂けますでしょうか?

めんどくさいことに、SAM001P/SAM002PX/SAM003B ってのもあれば、

これについてはSAM004NNを参照。

と言う風に文に埋まってしまってるものもあります。なんとかshとsedとawkで
やり遂げたいと思ってます。
123login:Penguin:2006/09/07(木) 17:34:35 ID:q58mDIRA
>>122
find と sed -i で行けそうじゃない?
124login:Penguin:2006/09/07(木) 18:59:32 ID:iCRx2SWb
>>123
いけそうな気がして来ました!
がんばってみます(*・∀・)=3
125login:Penguin:2006/09/14(木) 01:29:15 ID:p/dn3po+
例えば P1-5 P3-12 P2-9 を P1-05 P3-12 P2-09 というようにマイナスのあとを2桁にしたい
のですが、
echo P1-5 P3-12 P2-9 | sed -e 's/P\([123]\)-\([0-9]\{1\}\)/P\1-0\2/g'
P1-05 P3-012 P2-09
うまくいきません。この場合はどのように正規表現を書いたらよいのでしょうか。
126125:2006/09/14(木) 01:40:51 ID:p/dn3po+
自己解決しました
cho P1-5 P3-12 P2-9 | sed -e 's/P\([123]\)-\([0-9]\)\([^0-9]\|$\)/P\1-0\2\3/g'
P1-05 P3-12 P2-09
127login:Penguin:2006/09/14(木) 23:49:34 ID:rr8HdM9N
ちょw
128login:Penguin:2006/09/22(金) 16:32:09 ID:Gi/VKmOp
簡単にお金稼ぎ!!!

以下の手順でやれば、無料でお金稼ぎができます。
企業も広告の宣伝になるから、お金をくれるわけです。
最初の1日目で 2000 円〜3000 円 は確実に稼げます。
実際の作業は数十分程度、1時間はかかりません。

@ http://www.gendama.jp/invitation.php?frid=470908
    ↑このアドレスからサイトに行く。
Aそこのサイトで無料会員登録(応募)します。
 (その時点で 500 ポイントが貰えます。)
 ※事前に新規でヤフーなどのフリーメールアドレス
 を取っておくといいですね。
Bポイントを稼ぎます。
 懸賞の応募や無料会員登録などをする事によって
 1日目で約 20000 ポイントは GET できます。
C 3000 ポイントから、現金や WEB マネーに交換できます。
Dトップの右上に「交換」という所がありますので、
 そこから交換をしましょう。
 その月に初めてポイントバンクにポイントを移行した時、
 さらに別途として 1000 ポイント貰えます。

これで現金や WEB マネーを稼ぐといいですよ!!!
129login:Penguin:2006/09/25(月) 14:04:16 ID:ENWvwHb8
シェルはbashで、
MySQLのデータを元に自動でユーザを作るシェルを
作りたいのですが、参考になりそうなサイトを教えて
下さい。
ぐぐったけどそういう参考になるサイトが出てこないです。
130login:Penguin:2006/09/25(月) 15:53:36 ID:3M5G2Z3K
131login:Penguin:2006/09/25(月) 20:01:16 ID:8zKTMoIu
常套手段だったらすまん。
#!/bin/busybox ash
とかやると結構早くなるかな?

それとも各種コマンドの表現力のなさに絶望するかな。
132login:Penguin:2006/09/25(月) 23:30:01 ID:bEafUneY
へぇー(x3)、busybox ashでシェルスクリプト実行させると
該当する外部コマンド呼び出しはシェルコマンド的呼び出しになるんだ。
$?とか使えるからてっきりバイナリ実体の共通化だけが目的で、
コマンド実行自体は普通にfork&execしてるのかと思ってた。

それはともかく、インストーラだとかでは結果的にそれやってる訳だから、
それなりに使えるんじゃない?逆にGNU拡張とかに依存しない移植性の
高いシェルスクリプトを書けるようになるかも。

速度は・・・速くなるだろうけど、シェルスクリプトで気にするかというか。
133129:2006/09/26(火) 10:54:20 ID:/kN9yJk7
シェルでMySQLの起動までは出来るんですけど、その続きを自動で処理してくれません。
(MySQLにログインした後、入力待ち状態になってしまって、起動後にDBを変更してくれない)。

mysql -u mofu -pmofumofu
use mohe
select * from moeneko;

としたところログイン後の処理をしてくれずにMySQLを終わらせた時点でuseって何だゴルァと
怒られます(以降の処理も怒られます)。
134login:Penguin:2006/09/26(火) 11:19:28 ID:df8bksAP
>>133
echo 'use mohe; use select * from moeneko;' | mysql -u mofu -pmofumofu
135129:2006/09/26(火) 15:05:32 ID:/kN9yJk7
>>134
そんなスマートな方法が・・・。

mysql -u mofu -pmofumofu mohe <mofu.sql

[mofu.sql]
use mohe
select * from moeneko;

って2つのファイルにしてやってた。
問題はこのクエリを発行後、戻ってきた奴を変数に入れる方法だね。

//MySQLのレストア作業で読み込ませるファイルがCreate文とか普通に
手打ちで出来ることをテキストに纏めて順次実行してるだけなんだから、
select文とかも実行できるんじゃね?と思って試してみました。
136login:Penguin:2006/09/28(木) 23:39:58 ID:qmT4SbpH
シェル(使ってるのは主にbash)って、ちょっと複雑な処理をさせると、
すぐに動作が重くなるね(多重にループさせたときとか)。
同じ処理でも、Cの方が圧倒的に早い。
最適化しないのがおおきいのかな?
137login:Penguin:2006/09/28(木) 23:46:14 ID:kP+fnhcw
シェルは真のインタプリタ
Tcl、Perlなどはランタイムコンパイル
138login:Penguin:2006/09/29(金) 00:09:45 ID:ikhtZqAF
>>137
どっからperlがでてきてんだ?
139login:Penguin:2006/09/29(金) 00:17:43 ID:qV/OGN3K
>>136
具体的にどういう処理?

そもそもCで書かれたbash上の実行内容をCで書いたら負けるわけないだろ。
書く時間がかかるからフツーshellでやるけど。
140login:Penguin:2006/09/29(金) 00:19:49 ID:ikhtZqAF
>>139
>そもそもCで書かれたbash上の実行内容をCで書いたら負けるわけないだろ。

そうか?Cでアセンブラを書くことも出来るわけでな。
141login:Penguin:2006/09/29(金) 02:33:29 ID:AlG8EKxr
shellscriptだってバイトコードべた書きできるよ
142login:Penguin:2006/10/01(日) 14:53:16 ID:me3R4vLB

原点に戻ろう。ケースバイケースで使い分ければ済む事。

用途に合ってれば、バイナリをゲロする言語で結構。

そこまですることない、ってーならシェルスクリプトでいいジャマイカ

143login:Penguin:2006/10/01(日) 19:06:18 ID:Xo+fTZgf
>>139
遅レスだが、あるファイル内のすべてのの10進を16進に変換する処理。
(bashって、16進形式ないよね?)
アルゴリズムは16の何乗かで割っていくというよくある方法。
変換する文字が10個以上くらいになると、途端に遅くなる。
144login:Penguin:2006/10/01(日) 19:18:04 ID:7VdKxRNj
>>143
それシェルでやるか?
普通はbcやら計算用の他のプログラムを呼ぶと思うんだが。

そもそもシェルスクリプトは、単機能なプログラム群(test,expr,sed,awk,etc.)
のグルーとして機能して、複雑な機能の9割を短期間で構成できる所が強みだろ。
プログラミング言語としてのシェル自体の能力を語ってみてもなあ。
145144:2006/10/01(日) 19:21:28 ID:7VdKxRNj
16進変換自体は、bcでobase指定してもいいけど、今の時代ならprintfの方が簡単か。
146login:Penguin:2006/10/02(月) 14:46:13 ID:D0XdThx6
>>143みたいなジョークはおいといてw
必要ならperlやcで書いてそれをbashから使えばいいだけの事。
bashもいっぱしの言語なので他の言語で書けるアルゴリズムならbashでも書けるが
効率的にナンセンスなモノは書く前に気づけよ。
ちょいとbashで済ませる程度の事をcで書くのも効率的にナンセンス。
147login:Penguin:2006/10/03(火) 05:16:19 ID:FpR8NZbm
今のCPUの性能なら、基数変換程度の計算ならシェルで動かしても
そんなに時間かからないと思ったんだけど、そうでもないのね。
148login:Penguin:2006/10/03(火) 07:31:25 ID:EZmi0NrE
敢えてbashismを犯してまでヤル作業でもないなぁ。と言う印象。
149login:Penguin:2006/10/03(火) 10:52:43 ID:/JDV4iux
>>148
適材適所なので自分ではやらないいけど、
無茶する香具師がshellを改良するとか、
別のソフト作ることを期待して止めはしない。
150login:Penguin:2006/10/03(火) 11:41:14 ID:i4ad2dwr
そこでzshですよ
151login:Penguin:2006/10/03(火) 13:56:04 ID:KeekA4F/
いや、ここはscsh
http://www.scsh.net/
152login:Penguin:2006/10/04(水) 18:13:19 ID:nvODb2Cn
bashコンパイラを書けば解決さw
bashってのは完全にプログラマの為の道具。
プログラマって人種が極度のキータイプ嫌いでものぐさな事を如実に示しているのがbash。
通常は最も手軽に動かせる言語で、だから初心者も使うんだけど非常に迷路じみて無愛想な言語。
適材適所で言うなら初心者には最も不適な部類の言語だと思う。
153login:Penguin:2006/10/04(水) 19:30:49 ID:K3dljP7/
rcがいちばん。
154login:Penguin:2006/10/04(水) 22:38:44 ID:FNsr3Nih
inittabインタプリタが切に欲しい。
155login:Penguin:2006/10/04(水) 23:15:48 ID:sl6UHG36
>>152
じゃあ初心者にはなにがいいのよ?
156login:Penguin:2006/10/05(木) 23:25:36 ID:zAfJdDDf
csh
157login:Penguin:2006/10/07(土) 10:34:31 ID:81nNYwVr
氏ね
158login:Penguin:2006/10/09(月) 23:35:33 ID:9KuWHWOZ
二つのsort,uniqされたファイル

file1
a
b
c

file2
c

があったとして、file1-file2>file3

file3
a
b

みたいことやりたいんですが、何てコマンド使えば良いんでしょうか?
159login:Penguin:2006/10/09(月) 23:41:56 ID:9la7eu6H
>>158

grep -v -f file2 file1 > file3
160login:Penguin:2006/10/10(火) 00:48:52 ID:j7TWTFqG
>>159
ありがとうございます!
すごく助かりました。
161login:Penguin:2006/10/10(火) 01:11:18 ID:34A8UKNC
そういえばgrepで除外を意味する-vの由来は何だろう。
校正記号の「トル」?
162login:Penguin:2006/10/10(火) 01:20:55 ID:lcIpK0vW
--invert-matchのvじゃね。
163login:Penguin:2006/10/10(火) 04:16:52 ID:j7TWTFqG
2000バイト以上のファイルを削除したい場合、どうしたら良いでしょうか?

findと組み合わせればよいのは分かるのですが、-sizeの使い方が良くわかり
ません。宜しくお願い致します。
164login:Penguin:2006/10/10(火) 04:21:26 ID:j7TWTFqG
すいません。
自己解決しました。

find . -size -2000c
165login:Penguin:2006/10/10(火) 04:43:41 ID:j7TWTFqG
ちょっと不親切でしたので、再投稿します。

find . -size +2000c -exec rm {} \;

で解決出来ました。お騒がせしました。
166 ◆Zsh/ladOX. :2006/10/10(火) 23:29:53 ID:2MRSIVzd
vetoジャマイカ
167login:Penguin:2006/10/11(水) 02:58:14 ID:JyuHWbkO
>>166
む、納得しちゃいそう。
168login:Penguin:2006/10/13(金) 11:56:24 ID:Mn/ZCEtt
>>155
cでしょうに。
ただcから入るとc++で頭切替えるのが大変になる。
c++てcを書いてる人が多い。
169login:Penguin:2006/10/13(金) 12:14:19 ID:yGdobEUM
>>168
あえてネイティブで動かす必要のあるものを作る場合を除けば、いまどきCやる必要なんてないでしょ。
Rubyとかのスクリプト言語でサッと書いてサッと使ってサッと捨てる。
170login:Penguin:2006/10/13(金) 12:59:32 ID:Mn/ZCEtt
>>169
初心者向けの言語って意味だから。
プログラミング入門はcが王道でしょ。
いきなりrubyは高級すぎて何がすごいのかも理解できないと思うし。
まず単純で質素なcで学んでからの方がいい。
ちなみにおじさんはアッセンブラからやらされた。
その時はくだらないと思ったがcの過程でポインタや配列を即理解できてやっててよかったと思ったよ。
171login:Penguin:2006/10/13(金) 13:05:42 ID:i+BkCOk3
スレ違いの話はその辺で切り上げてくれないかな。
172login:Penguin:2006/10/13(金) 13:07:20 ID:Mn/ZCEtt
ついでに言えばアッセンブラとcは極論すれば書き方が違うだけで同じだった。
だがcとc++は根底が違う、見た目が一緒だから厄介。
>c++てcを書いてる人が多い。
の一人だったよ。
rubyの根底を理解するには基準としてcをやっておいて損はないと思う。
命令や文法だけ暗記しても無意味だから。
ちなみにperlはおおげさなものは何もない。
cの次にperlを初心者向け言語の候補に上げよう。
だらしないコードを書くようになる危険があるが。
173login:Penguin:2006/10/13(金) 23:31:27 ID:w5YU+1sG
>だがcとc++は根底が違う、見た目が一緒だから厄介。

マルチパラダイム言語という名の元、構造化プログラミングと言う枯れた手法を用いることもまた合法。
174login:Penguin:2006/10/14(土) 02:26:44 ID:4wDWWWIQ
【sed】シェルスクリプト総合@LINUX Part2【awk】
175login:Penguin:2006/10/14(土) 11:42:14 ID:awFbXLqQ
tccでスクリプト書けば最強ということでFA?
いや実際ツールコマンド化されてないシステムコール叩けて便利だけど。
176login:Penguin:2006/10/14(土) 13:43:44 ID:aJtsd/OF
「○○しますか?[Yes]/[No]」
と言うダイアログを表示させて、その後の処理を選択したとおりに分岐させたいのですが
コマンド一覧などでは見つかりませんでした。

参考になるサイトなどがあれば教えて下さいm(_ _)m
177login:Penguin:2006/10/14(土) 15:20:50 ID:ZNsxMjW/
>>176
gnomeならzenityってのがある。
178login:Penguin:2006/10/14(土) 15:30:22 ID:vHgMANEE
>>177
ありがとうございます。早速逝って来ます
179login:Penguin:2006/10/14(土) 15:44:47 ID:pcLZXe+4
>>176
dialog とか。
180塩水 ◆1FrMT.vzQQ :2006/10/14(土) 20:07:07 ID:alqqP7TT
おもに計算はfortranでやって、ファイルの処理をシェルスクリプトとかでやってる。
計算終わってはかれたログを整理したりgnuplotで描画できるようにデータを変換したりする。
だいたいシェルスクリトプトとsedとawkで処理できるかなと思ってたけど、ちょっとした
計算に不都合があった。シェルスクリプトだと少数が含まれる計算や割算のやりかたが
よくわからない。awkは引数としてファイルを指定して、そのファイルの中身をいじくるのは
スムーズなんだけど、第一引数と第二引数に直接値を指定して、その引数同士で
計算させるというのが案外難しい。引数の定義をawk側でごにょごにょしないといけないみたい。
その点perlはARGVで直接ひっぱってきてささっと計算できた事をもってして、
ああ、perlも便利なものだったんだなって思えた。
これからperlも勉強してみようと思うんだけど、Rubyのああ、やってて便利だなと
実感できる強みみたいなモノってあるのかな。オブジェクト指向になってて、開発してて
楽しいスクリプトだという概観みたいなモノは把握したんだけど、まだいまいち実感がわかない。
まずオブジェクト指向なるものがそれほど理解できてないからかもしれないけど。
だんだんスレタイからずれてきた…

るびらーの人がいたらおもしろそうな魅力をちょこっと教えてほしいな。
181login:Penguin:2006/10/14(土) 20:18:30 ID:iEFH5wj3
>>180
て言うかなげぇよ。
182塩水 ◆1FrMT.vzQQ :2006/10/14(土) 20:38:03 ID:alqqP7TT
ごめん。
スクリプトは遅いって言われてるけど、そこまで動作速度に不満を感じることなんて
ほとんどと言っていいほど無いんですよね。コンパイルという作業をかましてまで
速度を向上したいというようなプログラムは私的な状況の改善くらいでは特に感じない。
商品開発したり、いろんなマシンでも動くようなプログラム作ったりするのに
コンパイルするようなプログラムが必要なのかな?でもperlなら大概のマシンで動くし。
科学技術計算はさすがにスクリプトじゃ無理だけど、身近な問題の改善なら
スクリプト言語でじゅうぶんだと思った。と、懲りずに長文感想文。
183login:Penguin:2006/10/14(土) 20:40:02 ID:iEFH5wj3
>>182
2行だけ読んだ。それに関しては激しく同意。
184login:Penguin:2006/10/14(土) 21:58:28 ID:vHgMANEE
>>179
ありがとうございます。
早速これも調べてみます
185login:Penguin:2006/10/15(日) 17:26:52 ID:hHCRRLT3
>>176

gtkというアプローチも。XでGUIプログラミングに便利かも。

手早い選択肢としては、179のdialogに同意。
186login:Penguin:2006/10/15(日) 20:04:48 ID:Dk9VntiV
dtkshとか。
187login:Penguin:2006/10/19(木) 20:47:24 ID:FQ6Ui9I8
すいませんが教えてください

/old の全ファイルを /new にコピーを行いたいのですが、
もし /new に同名のファイルがあれば、そのファイルはコピーしない
というのをやりたいです

教えてスレではないと思うのですがよろしくお願いいたします
188187:2006/10/19(木) 20:48:09 ID:FQ6Ui9I8
あ、すいません bash です
189login:Penguin:2006/10/19(木) 21:02:16 ID:rKeC8zcr
>>188
cp をうまく使えばできないかい。
$ man cp
cp -u とか
190login:Penguin:2006/10/19(木) 21:03:31 ID:up7gNFzc
>>187
自分ではどこまでできたの?
191login:Penguin:2006/10/19(木) 21:04:10 ID:O9X2awX6
>>188
ちゃんとmanよめよ。

>>189
この場合だと-iでいいんじゃないかな。
192login:Penguin:2006/10/19(木) 21:06:45 ID:rKeC8zcr
>>191
.bashrc に alias で指定してあると思うが、じゃあ
cp でいいな。
193login:Penguin:2006/10/19(木) 21:43:51 ID:tD+4Ba/E
rsync が一番適切なんじゃないの?
194login:Penguin:2006/10/19(木) 21:46:20 ID:bIjdLPn3
>>193
たぶんそれが一番だと思う。
195login:Penguin:2006/10/19(木) 23:16:23 ID:LdXdiqxq
yes no | cp -ia ...
196login:Penguin:2006/10/20(金) 00:27:54 ID:txS6575E
tar -C old -cf - . | tar -C new --keep-old-files -xvf -
197login:Penguin:2006/10/20(金) 14:30:44 ID:lljI9Z8i
すみません。findコマンドで
find ~ -name '*.sh' -exec rm -f {} \;

みたいなコマンドを良く見掛けるんですけど、後ろの「{} \;」って
どういう意味があるのでしょうか?
198login:Penguin:2006/10/20(金) 15:03:24 ID:jcp0YpyW
>>197
まず、findの-execスイッチは、「-exec command ;」という形式をとるの。
というところまではわかってる?まずこの点findのman読んで復習して。

{}の意味については、やっぱりfindのmanの-exec...の項を読むとみつかるはず
だから探してみて。

\;は、元々は-exec...;の最後の;。
なんだけど、シェルが;をコマンドの区切りとみなしちゃう(findの-execスイッチの
一部分だとはシェルには解釈しない&できない)から、それを防止するために
エスケープして\;と書くの。
199login:Penguin:2006/10/20(金) 15:37:04 ID:lljI9Z8i
>>198
あ、エスケープの「\」だったんですね。
manを読んでみます。

検索しても使いかただけとか、{}で検索しても良いページがでなかったもので。
200login:Penguin:2006/10/20(金) 15:53:46 ID:lljI9Z8i
'*.sh'でヒットしたファイルをカウンターにして
forのようにまわして、{}にその引数の中身を展開して実行してるみたいですね。

for i in (ファイルのあるPATH)/*.sh ; do
rm -f $i
done

みたい。
201login:Penguin:2006/10/20(金) 20:51:18 ID:sPhZqjis
http://vine.ic.sci.yamaguchi-u.ac.jp/
の自動更新スクリプトも核はsedで書かれているらしい。
202login:Penguin:2006/10/25(水) 17:04:32 ID:N8gV8hQo
あるディレクトリを作成、その下にディレクトリツリー(movieとかaudio、更にそのmovieやらaudioディレクトリの
下に01、02〜の様な)を 作成してツリーの大元に戻って大本のフォルダをリネームをしたいのですが
最後の対話式でリネームする部分が難しくてうまい事作動してくれません。どなたか救いの手を…
203login:Penguin:2006/10/25(水) 17:15:20 ID:tU4cUr/G
>>202
今どこまで書けたの?
204login:Penguin:2006/11/04(土) 14:41:24 ID:8GhdlUfe
質問です

通常シェルスクリプトを書くとき,シグナルを受け取った時の
処理をシグナル毎に書くと思うのですが,逆に
どのシグナルが送られてきたか調べる方法はありますでしょうか?
205login:Penguin:2006/11/04(土) 21:47:32 ID:WxZzepoe
ないんじゃない。

myhandler () {
  local sig="$1"
  ...
}
trap "myhandler 1" 1
trap "myhandler 15" 15

とかじゃだめ?
206login:Penguin:2006/11/05(日) 11:33:47 ID:wGRiE4/g
>>205
やっぱりひとつひとつ調べないと無理ですか...(´・ω・`)ショボーン

あざーす
207login:Penguin:2006/11/05(日) 13:28:09 ID:RXI70RMP
誰か暇な人解いて

引数付(1〜5)で実行したshellが何を引数として入力
  したかを,switch文を使って表示させたい。

【その1】引数無し、もしくは引数が1〜5以外の場合
% ./test.sh
Invalid number.
%

【その2】引数が1〜5の場合
(5を入力した場合)
% ./test.sh 5
You have imput 5.
208login:Penguin:2006/11/05(日) 13:37:45 ID:i3mgyo4j
switch文なんてないから不可能だな。
209login:Penguin:2006/11/05(日) 13:41:46 ID:2kXaFaWm
揚足取り乙
210login:Penguin:2006/11/05(日) 13:45:34 ID:6dyarNgd
宿題は自分で。
211login:Penguin:2006/11/05(日) 14:56:58 ID:swozWI3K
マルチかよ…
212login:Penguin:2006/11/06(月) 00:02:57 ID:q5pzIs6H
お勉強中の素人です。

rsh 許されていないサーバとのやりとりを絡めた処理を
やらせる為 , 一部 expect を使おうと思っています。

で , expect の send は実行したいコマンドを " で括りますが
" 自体をコマンドで使いたい場合はどうすればいいのか
ワカランです。

教えてくだされ。
213login:Penguin:2006/11/07(火) 18:02:42 ID:uIiz0qVx
お舞らちょっと漏れの愚痴を聞いて下さいませんか。

今GNU findを使ってディレクトリツリーのファイル一覧を出力したんだが、
日本語(EUC-JP)の名前が付いたファイルが上手く表示されねぇ。

以前は同じ
$ find . -ls
なんかで、ちゃんと表示されてたのに。

仕方ねーから、man findをじっくり読んでみた訳よ。

 UNUSUAL FILENAMES
          :
   -ls, -fls
      Unusual characters are always escaped. White space, backslash,
      and double quote characters are printed using C-style escaping
      (for example '\f', '\"'). Other unusual characters are printed
      using an octal escape. Other printable characters (for -ls and
      -fls these are the characters between octal 041 and 0176) are
      printed as-is.

非ASCII圏は無視ですか。そーですか。
version 4.2からこんな仕様になっていたとわ… orz
214login:Penguin:2006/11/07(火) 18:07:07 ID:pP57+mqL
>>213
find . | nkf -e
でもしとけ。
215login:Penguin:2006/11/07(火) 18:16:17 ID:3/rl4qfJ
less なら文字化けしないんだけどね。
216login:Penguin:2006/11/07(火) 18:24:34 ID:uIiz0qVx
>>214
いや、だからfindが出力するファイル名自体が、既にASCIIで
\213\245\216\270...
になってるんですって。UNUSUALにされてしまうのです。

愚痴るだけではあれなので…
>>212
expectって結局はtclだから、\でエスケープ出来ない?
"command" なら "\"command\"" みたいに。
217213:2006/11/07(火) 18:32:30 ID:uIiz0qVx
上レス番号付け忘れますた。

>>214>>215
確かに-print系では、出力が端末以外なら、そのまま表示できますが、
-lsで一気に詳細情報まで得ようとすると、どうやっても勝手に変換と。

一々-exec ls -l {} \;とか-printfで指定してやらにゃならんのか… o...rz
218login:Penguin:2006/11/07(火) 18:36:55 ID:3/rl4qfJ
>>216
find に文句がいいたのですね。
「find でリストを作るのに nkf 噛ませないと行けないなんて find は使えねーな。」
ってことでしょうか。
219login:Penguin:2006/11/07(火) 20:06:37 ID:TyjbxAWs
>>218
nkf噛ませてもダメだから困ってるんじゃないの?
220login:Penguin:2006/11/07(火) 21:01:30 ID:3/rl4qfJ
>>219
nkf 噛ませれば問題ないよ。
221login:Penguin:2006/11/07(火) 22:05:32 ID:pP57+mqL
>>217
ああ -ls option の問題なのか。
いつも省略してた(-print が使われる)から分からなかった。
確かにASCIIになっちまうな。

これpatchないのかな?
222login:Penguin:2006/11/09(木) 22:18:47 ID:hxGsWwCw
patchつーかバグレポ対象だろ、これ。
少なくともlocale見て動けYO!位はいっていいんじゃない
223login:Penguin:2006/11/09(木) 23:07:28 ID:Fy+EWKU1
>>222
>patchつーかバグレポ対象だろ、これ。

バグレポートだけよりパッチつきで報告してくれるほうがはるかに有意義だ。
224login:Penguin:2006/11/18(土) 17:28:51 ID:IVoEU4qc
シェル変数$tstvar1がwhileループ内で局所されて?しまいます。
ループの外で参照するにはどうしたらいいですか?
ちなみにforループで違う感じにまわしてみたのですが$tstvar2は
局所されなかったとです。んん?
$ cat tst.sh
#!/usr/bin/env bash

seq 1 $1 | while read line ;do
tstvar1=$line
done

for i in $(seq 1 $1);do
tstvar2=$i
done

echo while loop last num is $tstvar1
echo for loop last num is $tstvar2
#=====================================

$ ./tst.sh 5
while loop last num is
for loop last num is 5
225224:2006/11/18(土) 17:32:22 ID:IVoEU4qc
m(_ _ )m
× 局所
○ 局所化
226login:Penguin:2006/11/18(土) 18:02:59 ID:6vMNnicg
zsh使え
227224:2006/11/18(土) 18:20:24 ID:IVoEU4qc
bashでおねがいしますm(_ _)m
228login:Penguin:2006/11/18(土) 22:20:15 ID:BOjrTH30
$ cat test.sh
#!/usr/bin/env bash

seq 1 $1 > /tmp/hogehoge.tmp
exec 3<&0 </tmp/hogehoge.tmp
while read line; do
tstvar1=$line
done
exec 0<&3 3<&-

echo while loop last num is $tstvar1
$ ./test.sh 5
while loop last num is 5

リダイレクト or パイプだとサブシェルが起きちゃうからファイルに落とさないとむりぽ.
229224:2006/11/18(土) 22:28:24 ID:IVoEU4qc
そかー、サブシェルになっちゃってたんですねえ。
すっきり&たすかりましたm(_ _)m
230login:Penguin:2006/11/18(土) 23:17:36 ID:dOjBUY29
ど初心者の質問で申し訳無いんだけど、単語を2列ずつにする
のってどうすればいいんですか?↓こんなファイルを

apple
but
chance
data
e-mail
funny

↓このようなファイルに変えたいんだけど、、、

apple but
chance data
e-mail funny
231login:Penguin:2006/11/18(土) 23:27:29 ID:qmA4jFhb
>>230
sed -ne 'N;s/\n/ /;p'
232login:Penguin:2006/11/18(土) 23:41:43 ID:qEn0qBZD
>>230
column -c 16 ファイル
はだめなんだろな。。。
233login:Penguin:2006/11/18(土) 23:42:31 ID:2K6k+fAl
paste - -
234login:Penguin:2006/11/18(土) 23:43:40 ID:KEL72rWc
>>224
bsh系で挙動が違うものの代表格だな。

kshだと、局所化されない。
bsh(V7やSolarisなど)は、局所化される。
bashも局所化される。

一方↓の場合、
while read hoge
do

done < fugafile

bsh(V7やSolarisなど)は、局所化される。
ksh、bashだと、局所化されない。

235login:Penguin:2006/11/19(日) 01:07:47 ID:75ySYxGK
>>231 >>233
ありがとうございます!めっちゃ感動しました

>>232
実はCygwinでやってるのだけれどcolumnコマンドが入ってなくて・・・
236login:Penguin:2006/11/19(日) 11:08:03 ID:PNiLk3lU
>>233
その手は知らなかった。
237login:Penguin:2006/11/21(火) 17:25:32 ID:RPVTOsSL
シェル関数について質問なのですが、シェル関数実行時に標準出力をファイル等にリダイレクトした場合には、
その関数はサブシェルで動作するとなっているのですが、何度試してもカレントシェルでの動作になります。
これは正常な動作なのでしょうか?
それともシェル関数をサブシェルで動作させるには他に何か条件があるのでしょうか?
因みにシェルはbashを使っています。
238あほ初心者:2006/11/22(水) 00:12:00 ID:IxrPWlIp
すいません
while文を使用したループで[条件1]もしくは[条件2]の場合ループを抜けるという
or条件を指定したいんですけど、
やり方が判らないです。。。。


どなたか教えてください。
↓↓↓の条件の[ $a -lt 3 ]に[&b_flg = "OFF"]というor条件を追加したい感じです。


-----------------
#!/usr/bin/

a=1

while [ $a -lt 3 ]
do
a=`expr $a + 1`
done
239login:Penguin:2006/11/22(水) 00:14:15 ID:bnqD2I+t
while [ $a -lt 3 -o b_flg = "OFF" ]

man test
240login:Penguin:2006/11/22(水) 00:16:08 ID:Q3Q+e0H3
whileで指定するのは、ループを「続ける」条件。
241login:Penguin:2006/11/22(水) 00:22:03 ID:bnqD2I+t
>>240
裏を取れば終了条件。
応用力0すか?
242login:Penguin:2006/11/22(水) 00:31:45 ID:8zJkxMvj
単に訂正しただけっしょ。
243login:Penguin:2006/11/22(水) 00:32:08 ID:JDMO7VWz
初めまして。突然失礼します。
学校の課題なのですが・・・

「ディレクトリ、/usr/binにある全ての実行可能ファイルのman一行出力をテキストファイルに書き出す。ファイルの数は膨大なので、スクリプトを書いて処理すること。」

このシェルをつくらないといけないんですけど
どなたか教えてください><
244login:Penguin:2006/11/22(水) 00:47:21 ID:2GKTJH4U
そりゃいかんだろ。しかも、何にも知らない学生に出すような課題じゃないし、せいぜい悪あがきすることだ。
245あほ初心者:2006/11/22(水) 00:49:03 ID:IxrPWlIp
レス有難うございます。

>>239
これやってみたら無限ループしちゃいました(泣)

>>240

カウンターが3未満の場合、かつフラグが"OFF"の間ループさせたいのです・・・・。
246login:Penguin:2006/11/22(水) 00:57:36 ID:jTQUwjrV
>>243
その課題、前にどっかのスレで見たな。
過去に同じ質問をしたおバカな先輩がいるみたいだな。w
247login:Penguin:2006/11/22(水) 01:29:46 ID:tazRDaIV
>>243
シェルって言うな。
教えてやんない。
248login:Penguin:2006/11/22(水) 01:48:04 ID:hxP9MaWC
>>243
ls /usr/bin | (while read f ; do whatis $f ; done) > shell_tte_iuna_baka.txt
249login:Penguin:2006/11/22(水) 09:10:37 ID:+iDbTTrl
>>239
×b_flg = "OFF"
◯$b_flg = "OFF"
でしょ。

>>245
>かつフラグが"OFF"の間
"かつ"ならor条件じゃなくand条件でしょ。
while [ $a -lt 3 -a $b_flg = "OFF" ]
250login:Penguin:2006/11/22(水) 09:55:53 ID:V6McRbrX
自分がスクリプト書くときは、繰り返す場合いっつもforつかいます。
それは、なんらかのバグがあったときにforならあるところまでで必ず止まるという
安心感があるからです。

ところが、このスレではwhileを使っている人を結構見掛けるのですが、
どういう時に繰り返し処理をwhileで書こうと考えているのでしょうか?
251login:Penguin:2006/11/22(水) 10:23:48 ID:UPqdXOUd
>>250
なんだなんだ?確認するが「シェル」スクリプトの話でいいんだよね?

forとwhileじゃ意味がずいぶん違うじゃん。whileは変数を束縛しないでしょ。
それと、実行前に範囲が決まらない処理なんていくらでもある。
252login:Penguin:2006/11/22(水) 10:27:53 ID:V6McRbrX
>>251
例えばtest1、test2...みたいなファイルを消す場合は

for i in `seq 1 1 9`; do rm test$i ; done
rm -f test??

みたいな感じでシェルスクリプト書いてるんですよ。
なんかバグってwhileで意図しないファイルまで消されてしまうような気がして、
あんまりwhileを使いたくないんです。気分的に。

ただ、whileならではの利点みたいなものが見えれば、whileを勉強する意欲が
湧くかなって思ったので、そのwhileの魅力みたいなモノがあれば教えていただければ
と思いました。
253login:Penguin:2006/11/22(水) 10:29:59 ID:hxP9MaWC
>>250
for(i = 0; i < MAX; i++) {
    printf("infinite loop\n");
    $i = 0; /* this code is fatal bug */
}

上記の通り、バグで止まるかどうかという意味ではforも同じです。
使い分けは、ループの意味で分けるのが可読性の観点で好ましいかと。
一定回数カウント、もしくはイテレータで繰り返してループするものにforを、
回数不定で特定の条件を満たすまでループするものにwhileを、というのが
一般的かと思われ。
254login:Penguin:2006/11/22(水) 10:38:06 ID:hxP9MaWC
ごめんCのこと書いた。
255login:Penguin:2006/11/22(水) 10:40:40 ID:V6McRbrX
>>253-254
なるほど、whileの使い分けとしては回数で止めるか、条件で止めるかということですか。

でもなんだろう、この自分の中の漠然としたwhileに対する不安感は、やっぱり
使ったことが無いからなのかもしれないですね…
whileの練習もかねて意識して使うようにしてみます。
ありがとうございましたm(_ _)m
256login:Penguin:2006/11/22(水) 14:15:34 ID:pcMmUayC
変数に"/"が入っている文字列を"/"部分だけ
"\/"にしたいのですが、
sedでできません。
誰か良い方法をご存知でしょうか?

test=test1/test2
sed "s/\//$test/g"

【実行結果】
sed: 1: "s/\//test1/test2/g": bad flag in substitute command: 't'
257login:Penguin:2006/11/22(水) 14:45:17 ID:o0UyRkyX
一番手っ取り早いのは、
sed "s|/|$test|g"
258login:Penguin:2006/11/22(水) 20:58:02 ID:/ICllq1f
誰も突っ込まないのは…釣り?
259login:Penguin:2006/11/22(水) 21:47:57 ID:bnqD2I+t
>>258
アホか。
260login:Penguin:2006/11/22(水) 22:14:13 ID:o0UyRkyX
しまった。つられた。

test=$(echo $test | sed "s/\\//\\\\\//g")
バッククォートなら、
test=`echo \$test | sed "s/\\\\//\\\\\\\\\\//g"`
261login:Penguin:2006/11/23(木) 00:05:41 ID:cxW9On4t
折角のLinux板なので
${test//\//\\/}
なんつーbash限定の方法は如何?
262login:Penguin:2006/11/23(木) 07:59:05 ID:CuFvrJz+
sugeeeeee
263login:Penguin:2006/11/23(木) 17:33:38 ID:RM/e3Lly
ぜんぜんすごくない。
典型的なキモい拡張の代表格じゃん。
264login:Penguin:2006/11/23(木) 18:51:01 ID:CuFvrJz+
>>263
別にお前がすごいと思おうが思わないだろうが関係ないよ。
俺がすごいと思っただけだから。
265login:Penguin:2006/11/23(木) 21:37:51 ID:9rWiEH/g
>>264
そして、そんなお前を俺はダセェと思ったんだ。
266login:Penguin:2006/11/23(木) 21:45:03 ID:i/t/5yj6
bash 限定なら便利だよね。
267login:Penguin:2006/11/24(金) 15:37:53 ID:QetvQUTA
こんにちは。

19/Nov/2006
19/Nov/2006
20/Nov/2006
21/Nov/2006
21/Nov/2006
22/Nov/2006

なファイルがあり、それぞれ数えて

19/Nov/2006 2
20/Nov/2006 1
21/Nov/2006 2
22/Nov/2006 1

としたいのですが、どすればいいでしょうか?ヒントでも良いので
お願いします!

268login:Penguin:2006/11/24(金) 15:50:58 ID:q4M0kGa+
uniq -c
269login:Penguin:2006/11/24(金) 15:56:39 ID:QetvQUTA
>>268
こんなに早く解答を頂いて、本当にありがとうございます!
とても助かりました。
270login:Penguin:2006/11/24(金) 18:24:46 ID:oYJh4kFu
test="A<タブ>B<タブ>C"
echo "$test" | while read in line
do
echo "$line"
done

を実行すると、
B<タブ>C
となってしまいます。

A<タブ>B<タブ>C
と得るにはどうしたらよいでしょうか?
271login:Penguin:2006/11/24(金) 19:13:41 ID:ZfQxSWxT
>>270

1. while read line

2. echo "$in<タブ>$line"

3. IFS='
'

好きなの使え
272あほ初心者:2006/11/25(土) 00:30:44 ID:PS7K2G+h
>>249

返事遅れてスイマセン。。。。
書いてある条件でやったらできました。-aや-oの指定方法理解できました。

有難うございました
273login:Penguin:2006/11/26(日) 05:31:22 ID:AL6bt30h
sedはignorecaseでのマッチングはできないんでしたっけ?
274login:Penguin:2006/11/26(日) 08:58:39 ID:pXTU5C4T
>>273
/regexp/I
とか
s/regexp/replacement/I
とか
275login:Penguin:2006/11/26(日) 12:59:06 ID:AL6bt30h
>>274
どうも。GNU拡張だったみたいですね。
276login:Penguin:2006/11/26(日) 13:11:11 ID:FneAj50i
sed、awk、tar、cpioはgnu版が一番。
277login:Penguin:2006/11/26(日) 13:14:41 ID:LjpahU1Z
GNU 版以外になんかあったっけ。
278login:Penguin:2006/11/26(日) 16:06:21 ID:bXQDH3xo
awkはgawkだよね < 正式名称(?)
tarもgtarだ

sedとcpioは?
279login:Penguin:2006/11/26(日) 20:31:37 ID:gEHgbYsL
>>278
gsedとicpo
280login:Penguin:2006/11/27(月) 00:15:49 ID:UE44ZgMS
>>278
http://www.gnu.org/software/tar/
別に gtar が正式名称ってわけじゃない。
OS 標準の tar が別にある場合に
それと区別するために
gtar というコマンド名でインストールされることがある、
ってだけ。

sed も cpio もそのまんま。
http://www.gnu.org/software/sed/
http://www.gnu.org/software/cpio/
281login:Penguin:2006/11/27(月) 01:47:31 ID:bWyCbzl1
ggrep …ぐぐれっぷ。
282login:Penguin:2006/11/27(月) 02:14:33 ID:B8mdaK4S
BSD系はGPL汚染を避けるために独自のunix toolそろってるよね。
今でも完璧にGPLフリーなの?
283login:Penguin:2006/11/27(月) 02:24:39 ID:UE44ZgMS
>>282
C コンパイラは gcc 使ってなかったっけ。
まぁ、詳細は UNIX 板で聞いてくれ。
284login:Penguin:2006/11/27(月) 02:25:13 ID:UE44ZgMS
GPL 汚染を避けるためってより
元からあるのを使い続けてるだけ。
285login:Penguin:2006/11/27(月) 02:46:22 ID:cP0Kjc7q
sedでもなんでもいいですけど、
ABC
DEF
GHI
という改行入りの文字列を
ABCDEFGHI
としたいのですが、
231 を真似て、
sed -ne 'N;s/%\n//;p'
としてみましたが、
ABC
と一行の場合は、空白になってしまいました。

どうすれば実現できますか?
286login:Penguin:2006/11/27(月) 03:00:07 ID:OelJATmM
>>285
while read line;
do
echo -n "$line"
done <<END
ABC
DEF
GHI
END

echo
----
とかではあかんの?

#>>285さんもお仕事中ですか?
#私の方は目途が付いたのでそろそろ仮眠入ります(=.=)
287login:Penguin:2006/11/27(月) 07:10:55 ID:Jc9GP2Cc
> 280さん
そうなんだ
正式名称ってわけではないのっすね
Solarisでびっくりした記憶が

むぅ
ねむい
288login:Penguin:2006/11/27(月) 07:50:47 ID:bqAw+xNf
>>285
tr -d "\n"
289login:Penguin:2006/11/27(月) 22:38:33 ID:0CtuQywK
アホな初心者なんだけど教えて!

$Aと$Bにはそれぞれ時刻が(xx:xx:xx)の形式で格納されているんだけど
これを$Aと$Bの比較を行いそれぞれ条件分岐で表現させたいんだが
どうすればいいだろう?

if文でずっと考えていたんだが
文字列と数列演算の比較しか調べても出てこなかった。
290login:Penguin:2006/11/27(月) 22:54:05 ID:Bw+6GoCc
>>289
$A と $B を date コマンドで変換して比較するとか。

date -d "$A" '+%s'
291login:Penguin:2006/11/27(月) 23:06:21 ID:Gl6W36sR
xxの部分が必ず二桁であるなら、言い換えれば、コロン除いて必ず6桁であるならば、

[ "`echo \$A|sed \"s/://g\"`" -eq "`echo \$B|sed \"s/://g\"`" ]
とか。

bash依存でいいなら、
[ ${A//:} -eq ${B//:} ]

292login:Penguin:2006/11/27(月) 23:09:28 ID:bqAw+xNf
>>289
:を削除すればいい
293login:Penguin:2006/11/28(火) 00:06:04 ID:9U2/5wlL
感動した
294login:Penguin:2006/11/28(火) 00:23:02 ID:fFcPBnEd
あるファイルの一部(何行もある)を違うファイルに書き換えるのはどうやるの?
例えば、

aaa aaa aaa
aaa aaa aaa
abc 1 2
abc 3 4
bbb bbb bbb

というファイルを

abc 1 10
abc 3 20

と言うファイルを使って

aaa aaa aaa
aaa aaa aaa
abc 1 2 10
abc 3 4 20
bbb bbb bbb

にしたいんだけど。。
どえらく行があって普通にsedの置換する行を書かせて実行したら
一日で終わらないくらい時間がかかってしまって。。。
もしくは、行単位で置換じゃなくて、数行単位で置換は出来ないのでしょうか?

偉い人教えてください。
295login:Penguin:2006/11/28(火) 00:37:14 ID:ve7hOhUi
sed -e 's/abc 1 2/abc 1 2 10/gc' -e 's/abc 3 4/abc 3 4 20/gc' <input.txt
とか。
296login:Penguin:2006/11/28(火) 00:54:27 ID:S83lGj9/
>>295
そのabc 1 2ってところがファイルの内容によって変わるから-eでは指定できなくて
困ってんじゃないの。

俺ならperlに逃げるが、...
どうしてもsedでやるなら、「2番目のファイルから>>295のようなsedスクリプトを
生成する」というスクリプトをsedなりawkなりで書くんだろうな。
297login:Penguin:2006/11/28(火) 01:38:28 ID:hlMS5leM
294だけどそれを数だけ書いて実行したらどえらく時間がかかってしまって…
298login:Penguin:2006/11/28(火) 02:13:27 ID:S83lGj9/
マルチ。
ttp://pc8.2ch.net/test/read.cgi/tech/1112553783/

速度向上の話はシェルスクリプトの話というよりアルゴリズムの話なのでは。
そっち方面のスレの方が相手にしてもらえる。

遅いだろな。>>296-297の話だと「1番目のファイルの行数×パターンファイルの行数」
回だけパターンマッチを繰り返すんだからさ。

パターンが正規表現じゃなく固定文字列&対象フィールド固定でいいみたいだから、
ハッシュ表の応用が吉。2番目のファイルのパターン指定部分をkeyとして、
dbmとかRDBとかいろいろ速い方法がある。
299login:Penguin:2006/11/28(火) 07:24:19 ID:tF5D3BVE
タグで抽出してからいじれ
300login:Penguin:2006/11/28(火) 15:20:17 ID:OR43oAVg
いずれにせよ行指向なシェルスクリプト+αにゃ不向きだな。
置換したい行の位置が変わってもよければまだなんかありそうだが。
301login:Penguin:2006/11/30(木) 15:18:39 ID:qADJb4/Z
シスログなどのファイルからエラー項目を取り出して、
対象となるデーモンをリスト化したファイルとマッチさせて
対象があれば正という処理をしたいんですが
参考となるスクリプトを掲載したHPはありますか?

考えられるキーワードでググっても出てこないので
困ってます。
302login:Penguin:2006/11/30(木) 15:29:18 ID:VjTlzCpk
grepで済むと思うが
303login:Penguin:2006/11/30(木) 15:48:37 ID:qADJb4/Z
で、問題はこれを5分間隔でやっているので
その間に発生したエラーログのみ監査対象が限定されるのです。

シスログの日付とlocaltimeを比較しないとダメなんです。
304login:Penguin:2006/11/30(木) 19:53:42 ID:5H/Ib3vS
ならdateとgrepで済むと思うが
305login:Penguin:2006/11/30(木) 20:45:11 ID:bn6C4MA9
>>303
最近のsyslogdなら、名前付きパイプに対応してる。
FIFO経由で順次処理の方が良いんじゃね?
306login:Penguin:2006/12/01(金) 19:53:40 ID:gsraXxcw
ところで、シスログなどのファイルをリストとして読み込むには
皆どう処理してる?
307login:Penguin:2006/12/01(金) 23:24:27 ID:+exVUFbt
>>294
awkで書いて見た。久しぶりに使ったけど便利だな。
BEGIN{
while( getline p < ARGV[1] >0){
split(p,a," ")
word[ a[1] + a[2] ] = a[3]
}
ARGV[1] =""
}
{
if( word[ $1 + $2 ] != "" ) {
print $0 " " word[$1 + $2]
} else print $0
}
308login:Penguin:2006/12/02(土) 11:18:13 ID:MFbNlyXD
>>307
ちょっとだけ修正
word[$1 + $2]は
word[$1 + " " + $2]の方がいいかも
word[$1 + $2]だと "abc" + "1"が"abc1"になるので
"abc" + "1"と"ab"+"c1"が両方とも"abc1"になってしまう。
>>294のように文字数が一定なら問題ないけど。
まあ実用にするんだったらもっとあちこちいじらないとダメだな。
309login:Penguin:2006/12/02(土) 14:12:26 ID:9wM9eGR+
>>307,308
それマルチ
http://pc8.2ch.net/test/read.cgi/tech/1112553783/448
http://pc8.2ch.net/test/read.cgi/tech/1112553783/453-456

つーかよく仕様を読み取ったな。
あっちのスレで追加ヒントを出されたけど
全く法則性をつかめなかった。IQ低いんだな>オレ
310login:Penguin:2006/12/02(土) 15:15:50 ID:IOXyzmke
一万行あったら終らない。
311login:Penguin:2006/12/02(土) 16:40:12 ID:h1TrJh+k
スクリプトでなんともできない量なんだったら、
いっそCで組むなりDBにいっぺんつっこんでなんかで処理するなりしたほうが。

>>303
1. いっぺんログ(a)を全部コピる(b)
2. 5分たったら(b)の行数分だけ(a)からはじいて更新行だけ抜く(wcなりtailなりdiffなり)
3. 抜いたものに処理かまして1.に戻る
312login:Penguin:2006/12/02(土) 17:04:04 ID:6y2Ykjot
以下のような配列から

20061201120000 **** ***** ****
20061201130000 **** ***** ****
20061201132000 **** ***** ****
20061201132100 **** ***** ****

while文で上のリストを読み込んだときに
左1番目の日付記録と現在の記録を比較して
5分以内のみを取り出して別のファイルに読み込ませる
ということを行いたいです。

whileとifの組み合わせでうまくいかないんですが
皆さんならどう書きますか?
313login:Penguin:2006/12/02(土) 17:28:33 ID:h1TrJh+k
まずは自分がどう書いたかだ。
314308:2006/12/02(土) 18:00:30 ID:RMFwKrIK
>>308
おおボケかましてた。
>word[$1 + $2]だと "abc" + "1"が"abc1"になるので
"abc" + "1" は 1 だった。
+を抜いて word[$1 " " $2]こうしないと
BEGIN{while(getline < ARGV[1]) word[$1 " " $2] = $3; ARGV[1] = ""}
{ if(word[$1 " " $2]){ $4 = word[$1 " " $2]
#ここも追加
}else delete word[$1 " " $2];
print $0
}

END{for( s in word) print s "=" word[s];}
これで見るとif(word[$1 " " $2])の時にwordに追加されるようで
でかいファイルでやってたらメモリが足りなくなる。でdelete を追加。
>>294のデータでのテストならちゃんとした結果が出るが
実際のデータでやってたらおかしな結果になったんだろうな。
危ない危ない。もうない事を祈ってorz
315login:Penguin:2006/12/02(土) 18:08:46 ID:HEbI++rQ
ふつーに word[$1, $2] でいいのではないかと。
多次元配列のように見えるけど、実体は word[$1 SUBSEP $2] という
組み込み変数 SUBSEP で連結しただけの1次元配列。
316login:Penguin:2006/12/02(土) 21:01:28 ID:6kGljnD5
こんな感じかな?

gawk 'BEGIN{ filt=strftime("%Y%m%d%H%M%S",systime()-300) } $1>=filt{ print }'  < 元ファイル > 新ファイル名
317login:Penguin:2006/12/03(日) 00:26:39 ID:A8uHmA87
>>312
(d=`date -d -5min +%Y%m%d%H%M%S`; while read l r; do if [ "$l" -gt "$d" ]; then echo "$l $r"; fi; done) < list > other
318312:2006/12/03(日) 13:51:58 ID:N72hre3c
>317
ありがとうございます。

私は今こんなスクリプトで書いていますが検討もつきません。


cat /var/log/errlog | sed -e "s/Jun/1/g" | sed -e "s/Nov/11/g" | sed -e "s/://g" | awk '{print $1$2$3}'

これらをwhileでまわしてどう比較させるのか、まったくわからん・・
319login:Penguin:2006/12/03(日) 14:14:55 ID:73paMa8k
>>312と違うじゃねーか
320login:Penguin:2006/12/03(日) 14:16:41 ID:73paMa8k
ああ現在の記録の方か
321login:Penguin:2006/12/03(日) 14:28:51 ID:0bKgPd66
質問です。

a.aaaa.aaaa.aaaa.a
b.b
cccccc.c.c.cc.ccccc

のような内容のファイルがありまして、最後の.から右側だけを取り出したいのですが、
sedだとどうやるんでしょうか。

$ sed -e '/^(.*)\.(.*)/\2'

のようなやり方だと、後方参照の数字が分からないで困ってます。
322login:Penguin:2006/12/03(日) 15:45:30 ID:Wi7dHq2/
\.([^\.]+)$
323login:Penguin:2006/12/03(日) 16:23:52 ID:/7urMGDU
それ何てAA?
324login:Penguin:2006/12/03(日) 16:24:47 ID:Wi7dHq2/
\.([^\.]+)$ プギャー
325login:Penguin:2006/12/03(日) 17:48:15 ID:/7urMGDU
>>324
ご本人殿、馬鹿に付き合ってくれてありがとう
326321:2006/12/03(日) 17:50:37 ID:0bKgPd66
>322
ありがとうございます。

しかし、

$ cat list | sed -e 's/\.\([^\.]+\)$/\1/'
a.aaaa.aaaa.aaaa.a
b.b
cccccc.c.c.cc.ccccc

となってしまいます。何故だろう。
327login:Penguin:2006/12/03(日) 17:56:48 ID:Wi7dHq2/
>>326
括弧をエスケープしている理由は?
328login:Penguin:2006/12/03(日) 17:59:35 ID:73paMa8k
sed 's/^.*\.//g'
329login:Penguin:2006/12/03(日) 18:00:43 ID:73paMa8k
あgいらんわ
330login:Penguin:2006/12/03(日) 18:24:02 ID:wqiGXln8
foreach line (`cat file`)
foreach> echo $line:e
foreach> end

とかいう技がある。csh/zsh だけどね。
331login:Penguin:2006/12/03(日) 23:38:29 ID:tvcBgjra
IFS=.
while read line
do
set set ${line}
eval "echo \"\$$#\""
done

POSIX な sh なら動くと思われ。
取り敢えず、ash/ksh/bash それと emulate sh/emulate ksh な zsh では確認。
332login:Penguin:2006/12/04(月) 16:05:09 ID:+d1incKQ
cut -d\. -f2- list
が最短?
333login:Penguin:2006/12/04(月) 17:04:06 ID:CaDaOOn9
>>332
課題を勘違いしているんじゃない?
ピリオドの個数は不定。おれなら
>>328だな。

334321:2006/12/04(月) 17:16:11 ID:IolELO07
>328
すげー。ありがとう。
335login:Penguin:2006/12/05(火) 17:59:40 ID:IE2lurje
>>333
> ピリオドの個数は不定。
だから -f 2- なんだと思うが
336login:Penguin:2006/12/05(火) 18:03:00 ID:IE2lurje
あ、ごめん「最後の.から」か
337login:Penguin:2006/12/05(火) 19:48:57 ID:W6tEWDj4
rev | cut -d. -f1 かな。
338login:Penguin:2006/12/05(火) 23:19:56 ID:wgUuRSHI
いろいろ覚えるの面倒だからなんでもawkでやってしまう。
jgawk -F. "{print $NF}"
339login:Penguin:2006/12/06(水) 00:12:40 ID:CvZE1xbv
\.([^\.]+)$ プギャー
340login:Penguin:2006/12/06(水) 11:42:56 ID:F61ky2gC
>>339
うわっ、勉強になる。
341login:Penguin:2006/12/08(金) 21:51:15 ID:OUKkAuJR
カレントディレクトリにあるflvをflv2mpeg4を使ってaviに変換するために
以下のようなスクリプトを書いています。
#!/bin/sh
for file in `ls`
do
case "$file" in
*.flv)
flv2mpeg4 $file `echo $file|sed -e "s/\.flv$//"`.avi
;;
esac
done

しかし、flvのファイル名にスペースがあると(cat vs dog.flvみたいな)
dog.flvというファイルを変換しようといてしまいます。空白を含むファイル名
も正常に変換するにはどのように書けばよいのでしょうか?
初歩的な質問かと思いますが宜しくお願いします。
342login:Penguin:2006/12/08(金) 22:45:09 ID:K296GRSh
てか、なんでcase "$file"と自分からquoteしておきながら、
flv2mpeg4 $fileの方はquoteせんのんのん?不思議や。
343login:Penguin:2006/12/08(金) 23:15:36 ID:0k4TWnD+
>>341
for file in *.flv
do
flv2mpeg4 "$file" `basename "$file" .flv`.avi
done
344login:Penguin:2006/12/08(金) 23:56:18 ID:ssJkS4Av
>>343
`…` もクオートせんと、単語分割されるかと。
"$(…)" を使うか、可搬性をあげたいなら
basename=`…` と、一旦変数に格納するか。

ま、俺だったら
for file in *.flv
do
flv2mpeg4 "$file" "${file%.flv}.avi"
done
だな。
345341:2006/12/09(土) 00:39:41 ID:1jyOluzm
うほっ出来ました。
目的のことよりもたくさんの知らないノウハウを得ることが出来ました。
皆さん本当にありがとうございました。
346login:Penguin:2006/12/10(日) 00:18:58 ID:Mc1jnefY
画像とかで名前だけ違って中身が同じファイルがあることがよくあるので
ファイルのサイズが同じファイルがあれば表示するようなのを
つくろうと思っているんですが、可能ですよね?
347login:Penguin:2006/12/10(日) 00:23:09 ID:UGTkob0M
>>346
ls -lなりstatなりでサイズを取得しつつ、
sort (適当なフィールド) |uniq -d とかすればいいんじゃね。

サイズ同じで実は違うファイルって言うレアケースも、
md5とかのハッシュ使えば判別できるだろ。
348login:Penguin:2006/12/10(日) 00:45:09 ID:Mc1jnefY
>>347
サイズをうまいこと受け取ることができるか不安ですが
ありがとうございます。やっぱりできそうですね。

重複を自動で消すのもかんがえましたが手違いがあったら恐いので
サムネイルでも確認しながら手動で消すことにします。
349login:Penguin:2006/12/10(日) 06:51:16 ID:MWK4NznI
>>348
サムネイルで確認すると言うことは画像ビューアを使うと言うことだよね?
それなら、重複画像検索機能つきの画像ビューアを使った方がはやいかも。
重複画像判定アルゴリズムを再発明する必要はないと思う。
350login:Penguin:2006/12/10(日) 07:04:36 ID:b4TTam1n
cmp では何か問題ある?
351login:Penguin:2006/12/10(日) 07:21:30 ID:MWK4NznI
>>350
>>346に書いているだけの内容ならcmpで十分だと思うけど、Exifを削除しただけで
同じ画像にもかかわらず違うファイルと判定されるので、>>346はすぐに限界に気が
つくと思う。
352login:Penguin:2006/12/10(日) 19:07:23 ID:PO4Qw5VE
>>346
つ findimagedupes
353login:Penguin:2006/12/11(月) 13:41:55 ID:lI3TknAe
>>352
おぉぉぉ、これは便利そうな。
精度と速度のバランスがどれくらいか分からないけど、Shellスクリプトから使える
のは何よりもありがたい。
354login:Penguin:2006/12/12(火) 00:25:50 ID:as9nLGl7
>>353
md5sum位取ったほうがいいと思う。
355login:Penguin:2006/12/12(火) 17:31:57 ID:o5CvLJw/
「夜23時からから朝の7時以外ならcommand実行」
というスクリプトを書きたいのですが、いい方法ないでしょうか?
356login:Penguin:2006/12/12(火) 17:34:12 ID:RcAGTw46
>>355
`date +%H` を比較。
357login:Penguin:2006/12/12(火) 18:50:49 ID:RHWRLnjb
>>349 >>351
わかりました。
そのような既存のソフトは結構あるようなので
そういうのを使います。
358login:Penguin:2006/12/12(火) 20:23:22 ID:IQmW0Qdp
>>355

 #!/bin/sh
 test `date +%H -d '+ 1 hour'` -gt 8 || exit
 ...

359login:Penguin:2006/12/12(火) 20:24:26 ID:IQmW0Qdp
>>358 はウソ。あまり考えずに書いてしまった。スマソ
360355:2006/12/13(水) 00:12:01 ID:0m8saZaP
>356
>358
ありがとう。

>359
参考になりますよ
361login:Penguin:2006/12/13(水) 00:28:02 ID:wD1iJX11
あるディレクトリにファイルが沢山入っていて、
更新時間が早いファイル順に並べて(ls -t)、そのうちの上から20%のみを移動させたい
のですが、いい方法はないでしょうか?

それt、lsって絶対パスでファイル名を表示させるオプションはないでしょうか?

362login:Penguin:2006/12/13(水) 00:37:26 ID:HWFZg9B3
>>361
for i in `find .`;do `pwd`/$i;done
363login:Penguin:2006/12/13(水) 00:43:43 ID:+9i4LQPP
>>362
なんで全ファイルを実行してるのかよくわからんが
素直に find `pwd` でよくね?
364login:Penguin:2006/12/13(水) 00:59:38 ID:oKdbScyz
>>355
case文使うとすっきりと書けるかも。まぁ、書き方次第だけど。
ttp://www.tsden.org/takamiti/shText/shText040.html#H445

>3 の 参考リンクに入ってないのね。
Bourne Shell 自習テキスト
ttp://www.tsden.org/takamiti/shText/shText.html

>>361
> 上から20%
ls -t | head -n $((`ls -1 |wc -l`*20/100))

> 絶対パスでファイル名を表示させる
ls じゃないけど。
alias fullpath='find "$PWD" -maxdepth 1 -iname '
とか。
365login:Penguin:2006/12/13(水) 01:28:13 ID:2eV8BPJU
>>384
「Bourne Shell 自習テキスト」は、リダイレクトのところが誤解を与える説明になっている。
というか、間違っている。
366361:2006/12/13(水) 13:04:20 ID:9APFlcGm
ありがとう
367login:Penguin:2006/12/14(木) 00:30:25 ID:QtGEecw2
ディレクトリに多くのファイルが入っていて、とある日付より前のファイル、
例えば「最終修正時刻が2006年12月01日より以前のだけを抜き出す(表示)」
ということをしたいのですが、シェルスクリプトで何とかならないでしょうか?
368login:Penguin:2006/12/14(木) 00:57:03 ID:QOHqlL4t
touch -t 200612010000 /tmp/hoge.$$ && find /dir \! -newer /tmp/hoge.$$ && rm /tmp/hoge.$$
369login:Penguin:2006/12/16(土) 19:09:54 ID:bwKTijT0
>>367
こんなのみつけた
ttp://d.hatena.ne.jp/bonlife/20061130/1164879026

つーか、もれも今日の日付-1日をcp rm したいww
370login:Penguin:2006/12/16(土) 19:35:09 ID:bwKTijT0
date --date '1 day ago' +%Y%m%d

なんだよ!あるんじゃん!計算しそうになったよウワァァァァァァヽ(`Д´)ノァァァァァァン!
371login:Penguin:2006/12/17(日) 00:03:59 ID:XYESYa/3
GNU date は超便利。
man をじっくり読んでみることを勧める。

ttp://www.linux.or.jp/JM/html/GNU_sh-utils/man1/date.1.html
372login:Penguin:2006/12/17(日) 15:45:21 ID:waTrWC3J
【やりたい事】
2ちゃんねる過去ログの任意のレス番カキコを手動あぼーんしたい。

【やりかけている解決法】
2ちゃんねるログは1行1レスの書式なので、まずあぼーんしたいレス番をファイルdeathnoteに
書き連ね、それを読み込んで指定行ごとに置き換え処理をするスクリプトabonerを作る。

ファイルAの中身(例:
1
3
5
---------------------------------

スクリプトabonerの中身:
#!/bin/bash
INS="deleted<> <> <> <>"
for i in `cat $1`
do
sed -i.bak -e "${i}s:rst:${INS}:" $2
done
----------------------------------

$ ./aboner deathnote xxx.dat
これで一応望みの結果は得られるのだが、どうもスマートじゃない。
実際処理時間は、300kB程度の1000到達ログの400件あぼーん処理を
Athlon3000+で約10秒。
sed以外(awk,perl)は使えません。
forで毎度sedを呼び出さず、sed一度で済む方法があれば教えてください。
373login:Penguin:2006/12/17(日) 16:02:41 ID:ma/9yUXs
sed 's/$/s:rst:deleted<> <> <> <>:/' dethnote | sed -f- xxx.dat

rst って文字列を置換してるようなのでそうしてるけど、rst って何だ?
374372:2006/12/17(日) 16:37:55 ID:waTrWC3J
>>373
即レス感謝です。
すいません。rstはテスト用の適当な文字列で無意味です。


一行で出来るとは素晴らしい。処理の負荷も格段に減らせそうです。
提示していただいた式をヒントに、自分の目的を完全に満たすように更に詰めて。
後でまた報告します。

重ねてありがとうございました!
375login:Penguin:2006/12/17(日) 19:07:29 ID:kFxhwkRU
OS X のdateは、GNU date じゃないので注意....

自分で作ったものだとPerl で timelocal 使って計算しているな〜
376login:Penguin:2006/12/17(日) 19:22:38 ID:BBDLOkoZ
この板で他の OS の話持ち出されても。
377login:Penguin:2006/12/17(日) 19:56:17 ID:+OjoWrzp
>>375のようないかにもLinuxしか知りませんてのはこの板だから許されるんだから
おおめに見てやろうや。
378login:Penguin:2006/12/30(土) 19:13:34 ID:adXoO7Rz
bashのスクリプトで
ファイルの容量が一定以上の場合指定の処理を行う
という記述はどのようにすればいいでしょうか
わかるかたいましたらお願いいたします。
379login:Penguin:2006/12/30(土) 19:36:50 ID:4fg7i+ry
>>378
du 見るとか?
380login:Penguin:2006/12/30(土) 20:02:13 ID:P/BrJqjU
>>378
find使うとか?
381login:Penguin:2006/12/30(土) 20:06:52 ID:YV5QCFu5
>>378
expr使うとか?
382login:Penguin:2006/12/30(土) 20:55:02 ID:NVlno1NV
>>378
stat してみるとか?
383login:Penguin:2007/01/01(月) 02:35:15 ID:gGttB+5K
>>378
duの出力を見るとか?
384login:Penguin:2007/01/02(火) 18:40:10 ID:Y0JKQGy+
標準エラー出力は 2>/dev/null とかで捨てることができます。
でもシェル内部コマンドだとこれが有効でないようです。
echo aaa > test.txt
chmod 000 test.txt
echo aaa > test.txt
bash: test.txt: 許可がありません
echo aaa > test.txt 2>/dev/null
bash: test.txt: 許可がありません

echo の場合も標準エラー出力を捨てたいのですが、
なにか方法はありますか?
385login:Penguin:2007/01/02(火) 18:48:22 ID:KMUyfSJk
それ、echoじゃなくてbashのエラーだと思われ。
386login:Penguin:2007/01/02(火) 21:09:23 ID:yDyfLOy+
exec 2>/dev/null
387login:Penguin:2007/01/03(水) 01:24:17 ID:Ox0JiAuq
>>384
なぜ chmod 000 ?
388login:Penguin:2007/01/03(水) 01:29:25 ID:WLOPTjPE
>>384
外部コマンドでもいっしょだよ。
/bin/echo aaa >test.txt 2>/dev/null
とかやってみ。
389login:Penguin:2007/01/03(水) 01:43:53 ID:/NxK5E4v
内部、外部関係ないですね。
シェルでリダイレクトする部分でエラーになるんですね。

chmod 000 の意味はとくになくて、"w"のビットを
落としたかっただけです。

横着せずに echo する前に適切に chmod することにします。
390login:Penguin:2007/01/03(水) 01:43:57 ID:OuzmBlen
>>388
?
391login:Penguin:2007/01/03(水) 01:45:03 ID:OuzmBlen
>>389
>>386無視かよ。一生正月休みのない仕事やってろ
392login:Penguin:2007/01/03(水) 01:49:23 ID:WLOPTjPE
>>390
何?
393login:Penguin:2007/01/03(水) 01:54:26 ID:/NxK5E4v
>>386,391
すんません、exec 2>/dev/nullでうまくいきますね。
サンクス。
394login:Penguin:2007/01/03(水) 08:39:41 ID:OuzmBlen
>>392
おかしなこと言ってるな。と思って。
395login:Penguin:2007/01/03(水) 08:46:01 ID:WLOPTjPE
>>394
どこがおかしい?
396login:Penguin:2007/01/03(水) 08:49:12 ID:OuzmBlen
>>395
>>389の序盤に全て書いてある。
397login:Penguin:2007/01/03(水) 08:57:26 ID:WLOPTjPE
>>396

>>389
> 内部、外部関係ないですね。
> シェルでリダイレクトする部分でエラーになるんですね。
のこと?
まさにこれを言いたかったんだけど。
398login:Penguin:2007/01/03(水) 09:07:53 ID:OuzmBlen
>>397
399login:Penguin:2007/01/03(水) 09:40:15 ID:Ox0JiAuq
>>398
内部 - bash 組み込みコマンドのecho
外部 - /bin/echo
400login:Penguin:2007/01/03(水) 09:42:36 ID:OuzmBlen
>>399
ああ、思い出した。
何検討違いなこと言ってんだ。と言うお話だった。

401login:Penguin:2007/01/05(金) 00:43:02 ID:SpssQH6A
質問です。

ファイル名が1行につき1つリストアップされているファイルfilelistが
あって、for文でそれを処理したいとき、以下のようにするとスペースを
含むファイル名のものをうまく処理できません。
何か良い回避方法ありますか?

for i in `cat filelist`
do
ファイルに対して何か処理
done

引数として渡した場合は「"$@"」を使えばいいんですけど・・・
402login:Penguin:2007/01/05(金) 00:57:47 ID:SePWUXtZ
>>401
for i in "`cat a.txt`"
do
echo "$i"
done
とか?
403login:Penguin:2007/01/05(金) 10:08:32 ID:J9H1NsPK
>>401
(
while read filename
do
"${filename}" に対して何か処理
done
) < filelist
404login:Penguin:2007/01/05(金) 10:11:34 ID:lTMToYro
IFS いじるとか。
405login:Penguin:2007/01/05(金) 20:17:26 ID:KSH0pMyZ
>>403
対象がファイル名ならあまり心配はないかもだけど一応
read -r filename
406login:Penguin:2007/01/05(金) 20:21:02 ID:dDYuFLde
while read line
do
python youtube-dl "$line"
done < "$@"

こんな感じのは?
俺がyoutubeからリストで落とすときに使ってるやつw
407401:2007/01/06(土) 03:01:07 ID:Gq/KqTu1
すいません遅くなりました。

>>402
これだと1回で一度にa.txtのすべての行を処理するようです。
ただ、引数として改行を渡す方法は始めて知りました。
これはこれで後で使わせていただきます。

>>404
おっしゃりたいことは分かるような気がするのですが、実現できず。
精進します・・・

>>403,405,406
なるほど。readを使うのは考えつきませんでした。
これで意図したとおり動作しました。

みなさんありがとうございます。
408login:Penguin:2007/01/09(火) 17:23:42 ID:EYsJqTIr
今初めてShell Scriptを作成しています。
バックアップ用のShell Scriptなのですが、

フルバックアップディレクトリ内のファイルとバックアップ対象ディレクトリ内のファイル群を比較し、
  1. 変更前の古いファイル(差分)を抽出して「昨日の日付名のディレクトリ」に追い出し、
  2. 変更後の新しいファイル(新規作成ファイルを含む)をフルバックアップディレクトリに追加して、最新の状態にしたいです。

更新されたファイルをチェックして、古いものを昨日のディレクトリへ移し、最新のファイルを最初に作成したバックアップディレクトリに追加するという処理をしたいです。
最新のファイルが存在するバックアップディレクトリは、バックアップが実行されるたびに、その実行日名にリネームします。

で、今こんな感じなのですが、ご助言を頂けないでしょうか?

#/bin/sh
back=backup
kyou=$(date '+%y%m%d')
kinou=`date --date '1 days ago' '+%y%m%d'`
mkdir /$back/$kyou
if test -d /$back/$kinou -a -e /$back/$kinou ; then
#mv /$back/$kinou/* /$back/$kyou/
rsync -vrpogtu --delete /data/ /$back/$kyou
else
rsync -vrpogtu --delete /data/ /$back/$kyou
fi

1.バックアップ元とバックアップ先のファイル群を比較する方法が分かりません。
2.比較の結果の変更前の古いファイル(差分)だけを抽出して昨日のディレクトリにコピー
する方法が分かりません。
3.変更後の新しいファイル(新規作成も)をフルバックアップに追加して最新の状態にする
方法が分かりません。
よろしくお願いします・・・
# 当方本当にシロウトです。
409login:Penguin:2007/01/09(火) 19:23:46 ID:pUBkJWsW
>>408
rsyncとかbontmiaでぐぐると幸せになれると思う。

410login:Penguin:2007/01/09(火) 20:08:36 ID:EYsJqTIr
>>409
rsyncもpdumpfsも知っているのですが、このbontmiaって言うのは何ですか?
ググったのですが、「これさえあれば他のバックアップツールはたぶんいらない」とか
「まさに rsync + pdumpfs なバックアップツール」とかそんな事しか書いてないので
具体的にどういう動作をするのか分かりません。
それから、2007/01/08/data みたいな深い階層がイヤで
070108 みたいなフォルダに差分抽出更新バックアップをかけていきたいのです。
そういうソフトが無いのでShell Script書くしかないと思っています・・・
411login:Penguin:2007/01/09(火) 20:10:49 ID:EYsJqTIr
>>409
Archive structure
The archives is placed in a directory structure like this:

2003/05/06/04:00/
2003/05/07/04:00/
2003/05/08/04:00/
2003/05/08/05:00/
2003/05/08/06:44/

これはひどい・・・・時間まで入ってさらに階層が深くなってるOTL
412login:Penguin:2007/01/09(火) 20:19:26 ID:EYsJqTIr
Windowsにはこれと同等の事をしてくれるソフトウェアがあります。

Fabre
http://hp.vector.co.jp/authors/VA004777/fabre.html
です。
これと同等の事をLinuxのShell Scriptでやりたいのですが、
お力をお貸し頂けないでしょうか?
413login:Penguin:2007/01/09(火) 20:47:25 ID:WQQJu8++
>>412
希望する仕様の詳細が不明だけど、
1. diff -rq sourcedir backupdirで変更されたファイル一覧を作成
2. 1 の出力から、sourcedirだけに存在するものをのぞけばファイルリストができるから、
それらを cp -p で backupdir2 にコピー
3. rsyncでbackupdirを最新版のバックアップに
4. ディレクトリ名は適当にリネーム
414login:Penguin:2007/01/09(火) 21:22:06 ID:EYsJqTIr
>>413
アドバイスありがとうございます。
[root@host root]# mkdir test
[root@host root]# cd test/
[root@host test]# mkdir dir1 dir2
[root@host test]# touch dir1/a.txt dir1/b.txt dir2/a.txt dir2/c.txt
[root@host test]# diff -rq dir1/ dir2/
dir1/だけに発見: b.txt
dir2/だけに発見: c.txt
[root@host test]#
このようになるわけですが、b.txtを除くわけですよねぇ。しかし
"dir2/だけに発見: "という文字列が邪魔で、その出力結果を例えば・・・
# tmp=`diff -rq dir1/ dir2/`
# cp -p $tmp backupdir2
のような事が出来ません。(それプラスに、1レコードずつ処理させる方法が・・・)
ん〜と、1レコードずつ処理させるには・・・ファイルに落としてしまって・・・
# diff -rq dir1/ dir2/ > list.txt
# for i in `cat list.txt` ; do cp -p dir2/$i backupdir ; done
ってやるんですかねぇ・・・?1レコードずつ処理させる方法がコレであってるなら
後は邪魔な文字列を消す方法をお願いします・・・
415login:Penguin:2007/01/10(水) 01:54:14 ID:LIhvffG+
>>414
こんな感じか
LANG=C
DIR1="dir 1"
DIR2="dir 2"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done
リストにはディレクトリも出てくるから cp には -r もつけた方がいい
416login:Penguin:2007/01/10(水) 01:58:50 ID:yw0ncsb2
>>408
いまいち仕様がよくわかんないんだけど、
rsync の --copy-dest とか --link-dest あたりじゃだめ?
417login:Penguin:2007/01/10(水) 17:27:06 ID:schDu+VD
>>415
わけがわからないですが、とりあえずコピペして実行してみます。

>>416
pdumpfsと同じような動作をするようですのでダメです。
pdumpfsがなぜいけないかというと
1.ディレクトリが深すぎる。 2007/01/08/ のように掘るのではなくて
070108/ と1個作ってくれるとありがたいです。
2.全てのファイルが各日付フォルダの中にある。
ココが一番困るところで、更新したファイルのみが過去のフォルダに残っていってくれると
この日にこのファイルを更新したのだと分かりやすくていいのですが・・・
ハードリンクで更新したファイルも更新してないファイルも全部残っているでしょう?
それがまずいんです。
もしよろしければ
Fabreの仕様
http://hp.vector.co.jp/authors/VA004777/report/fabre2.html
をお読みくださいませんか?
私の方からも簡単に説明いたしますと・・
まず一回目実行した時にLinuxのdateコマンドの # date '+%y%m'で得られる形式の
フォルダが作成され、そこにバックアップ対象フォルダ内のファイル及びフォルダが
全てコピーされます。最初の1回だけはタダのコピーです。
その後2回目の実行(1日過ぎて)で、また日付フォルダが作成されます。
一回目が070110(今日)なら、二回目は070111フォルダが作成され、
バックアップ元の更新されたファイル、追加されたファイルが070110フォルダに
追加され、070110の中身が全て070111(明日)フォルダに移動されて、当日更新した
ファイルの、更新前の古いファイルのみが070110(今日)フォルダに残ります。
そして明後日実行した時に、070112フォルダが作成され、070111フォルダに
バックアップ元の更新されたファイル(差分)のみが追加され、070111の内容が全て
070112フォルダに移動され、明日更新したファイルの更新前の古いファイルのみが
070111(明日)フォルダに残ります。以後この繰り返しです。
ココの方が分かりやすいかも http://www.vector.co.jp/magazine/softnews/030806/n0308062.html
ちょっと説明が難しいですかね・・・私の口から言うよりサイトを見て頂いた方が分かりやすいかもです。
418login:Penguin:2007/01/10(水) 17:33:20 ID:yw0ncsb2
>>417
1はスクリプトの組み方しだい。
2は、いわば --move-dest みたいな機能があればいいのかね。
rsync ソースいじってみたら?
開発元に送ったら組み込んでくれるかもよ。
419login:Penguin:2007/01/10(水) 17:58:29 ID:XxKrpdwb
>>417
日本語メッセージは扱いにくいのでロケールをCにして英語メッセージにする
diff -rqの出力は3種類。DIR1だけにあるファイル、DIR2だけにあるファイル、両方にあって内容が異なるファイル。
2番めと3番めのパターンだけを抽出して、sedの正規表現で望む形式に変換

特に難しいことはない。あと数行足せばやりたいことが完結するはず
420login:Penguin:2007/01/10(水) 19:26:20 ID:schDu+VD
>>418
既に完成されたソフトウェア(pdumpfs)なので、それを改造するなんてそんなスキル
ありません。--move-dest とは?
http://www.google.com/search?num=50&hl=ja&safe=off&q=move-dest&lr=lang_ja
rsyncのソースをいじるなんてとんでもない。C言語を少しかじった事がある程度ですよ?
そんな人間がそんな事してるときっと破壊するwwww
>>419 なるほど、それで>>415様がLANG=Cしてるのね。ちなみにsed使った事ありませんし、正規表現も全く知りませんので不可能です。
で、自分なりに書いてみたスクリプトがこれ!
backup.sh
#/bin/sh
kyou=`date '+%y%m%d'`
kinou=`date --date '1 days ago' '+%y%m%d'`
list=`date '+%y%m%d'-list`
mkdir -p /backup/$kyou
if test -d /backup/$kinou -a -e /backup/$kinou ; then
./list.sh >> ./$list
mv -f /backup/$kinou/* /backup/$kyou/
for targ in `cat ./$list` ; do mv /backup/$kyou/$targ /backup/$kinou/ ; done
rsync -av /data/ /backup/$kyou/
else
rsync -av /data/ /backup/$kyou/
fi
同じディレクトリ内に list.sh
#/bin/sh
LANG=C
DIR1="/data/"
DIR2="/backup/`date --date '1 days ago' '+%y%m%d'`"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done  どうですか?(行数の制限で改行がきつい^^;)
421login:Penguin:2007/01/10(水) 20:36:43 ID:8kc1szcz
>>420
pdumpfsの階層が深いとは自分も思う。
ので、それを改造した版を数年実運用しています。
ハードリンクの方もどうにかなるんじゃないかと。
422login:Penguin:2007/01/10(水) 21:23:12 ID:schDu+VD
[root@vine backupset]# ./backup.sh
mv: ``/backup/070111//backup/070110/PineNet.txt'' を stat できません: そのようなファイルやディレクトリはありません

となっちゃいました。あと少しで完成なのにっ 惜しい!!!!
PineNet.txtだけを更新して、dateコマンドでシステムの日付を明日にして
シェルスクリプトを実行してみたところ、その更新したファイルのファイル名はとれてる
のですが、どうやらディレクトリ、フルパスが余計なようです?多分。。

恐れ入りますが、ファイル名だけを取得するにはどのように改良すればよろしいのでしょうか?
もう少しで完成しそうなのでお付き合い頂けるとコレに勝る喜びはありません。
423login:Penguin:2007/01/10(水) 21:28:34 ID:KG4OWone
>>422
basename
424login:Penguin:2007/01/10(水) 22:33:04 ID:schDu+VD
>>423
ありがとうございます!コレで完成!と思ったのですが・・・
[root@vine backupset]# ./backup.sh
mv: ``/backup/070111/070111-list'' を stat できません: そのようなファイルやディレクトリはありません

backup.sh
#/bin/sh
kyou=`date '+%y%m%d'`
kinou=`date --date '1 days ago' '+%y%m%d'`
list=`date '+%y%m%d'-list`
mkdir -p /backup/$kyou
if test -d /backup/$kinou -a -e /backup/$kinou ; then
    ./list.sh >> ./$list
    basename ./$list > ./$list
    mv -f /backup/$kinou/* /backup/$kyou/
    for targ in `cat ./$list` ; do mv /backup/$kyou/$targ /backup/$kinou/ ; done
    rsync -av /data/ /backup/$kyou/ >> ./$kyou-rsync.log
else
    rsync -av /data/ /backup/$kyou/
fi

同じディレクトリ内に list.sh
#/bin/sh
LANG=C
DIR1="/data/"
DIR2="/backup/`date --date '1 days ago' '+%y%m%d'`"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done
もうちょぃ〜とで完成なんですが、何が悪いんでしょうか?よろしくお願い致します。
425login:Penguin:2007/01/10(水) 22:37:59 ID:schDu+VD
おっと、操作手順は
まず backup.shを実行
これは正常に成功して、/backup/070110/ の中に /data/の内容がrsyncでフルコピー
されました。
そして
# date 011122052007
とかやって、明日の日付にシステムを変更しました。
さらに、/data/PineNet.txt ファイルを修正して上書き(つまり更新)しました。
その状態で
# ./backup.sh
を実行すると上記のようになりました。
426login:Penguin:2007/01/11(木) 05:58:05 ID:Wc2SZsMb
>>424 なんかぐちゃぐちゃだな・・・
ちゃんと試してないから責任は持たんけどこんな感じだろ。
backup.sh:
#/bin/sh
DATADIR=/data
BACKUP_BASEDIR=/backup
KYOU=`date '+%y%m%d'`
KINOU=`date --date '1 days ago' '+%y%m%d'`
BACKUPDIR_KYOU=${BACKUP_BASEDIR}/${KYOU}
BACKUPDIR_KINOU=${BACKUP_BASEDIR}/${KINOU}
BACKUP_TMPTAR=${BACKUP_BASEDIR}/${KYOU}-tmp.tar
CWD=`pwd`
if [ -d ${BACKUPDIR_KYOU} ]; then
echo Backup directory for today ${BACKUPDIR_KYOU} already exists. Aborting.
exit -1
fi
427login:Penguin:2007/01/11(木) 05:59:01 ID:Wc2SZsMb
if [ -d ${BACKUPDIR_KINOU} ]; then
echo Saving changes from yesterday...
mv -f ${BACKUPDIR_KINOU} ${BACKUPDIR_KYOU}
mkdir -p ${BACKUPDIR_KINOU}
rm -f ${BACKUP_TMPTAR}
touch ${BACKUP_TMPTAR}
cd ${DATADIR}
${CWD}/list.sh ${BACKUPDIR_KYOU} . | while read i; do
tar uf ${BACKUP_TMPTAR} "$i"
done
cd ${BACKUPDIR_KINOU}
tar xvf ${BACKUP_TMPTAR}
cd ${CWD}
rsync --delete -av ${DATADIR}/ ${BACKUPDIR_KYOU}/ >> ./${KYOU}-rsync.log
else
echo First-time to run the script. Making a full backup...
mkdir -p ${BACKUPDIR_KYOU}
rsync -av ${DATADIR}/ ${BACKUPDIR_KYOU}/ >> ./${KYOU}-rsync.log
fi
echo Done.
428login:Penguin:2007/01/11(木) 05:59:45 ID:Wc2SZsMb
list.sh:
#/bin/sh
LANG=C
if [ $# != 2 ]; then
exit
fi
DIR1="$1"
DIR2="$2"
diff -rq "${DIR1}" "${DIR2}" | while read i; do
echo $i | grep -e "^Only in $DIR2\:" | sed "s/^Only in \(.\+\): /\\1\//"
echo $i | grep -e "^Files" | sed "s/Files .\+ and \(.\+\) differ/\\1/"
done
429login:Penguin:2007/01/11(木) 07:12:51 ID:Yy3UVr2t
>>426
rsyncは--deleteしない方がいい。でないと、削除されたファイルがどこにも残らない。
それか、削除されたファイルも前日のバックアップに含める方がいい。
430login:Penguin:2007/01/11(木) 15:11:14 ID:HFTeqEfF
技術のない奴程、ディレクトリが深いとか文句を言い、
技術のある奴程、あまりいじらず、そのまま想定された使い方をする
431login:Penguin:2007/01/11(木) 15:32:58 ID:jLeCsuJN
ちゃんとチェックしてないけどこんな感じ?
`find ...` ってあふれるとマズいんだっけ。

#/bin/sh
BACK=/backup
KYOU=`date '+%y%m%d'`
KINOU=`date --date '1 days ago' '+%y%m%d'`
mkdir $BACK/$KYOU

if [ ! -d $BACK/$KINOU ]; then
rsync -v -a /data/ $BACK/$KYOU
else
rsync -v -a --link-dest=$BACK/$KINOU /data/ $BACK/$KYOU
cd $BACK/$KINOU
for i in `find . -type f`; do
[ $i -ef ../$KYOU/$i ] && rm $i
done
for i in `find . -depth -type d`; do
rmdir --ignore-fail-on-non-empty $i
done
fi
432login:Penguin:2007/01/11(木) 15:54:52 ID:Zf+fVL9G
>>431
へえ、rsync --link-destってそうやって使うのか、勉強になった。俺の長いスクリプト無駄orz
Linuxのハードリンクの利点も生かせるし、無理に元の仕様にあわせずrsync --link-dest
そのまま使った方がいいな。検索したらそのままのがあった。
ttp://slashdot.jp/~ruto/journal/362588

for i in `find ...`はファイル名に空白があるときおかしくなるっぽい。
find ... | while read で回してるのはそのため。
433login:Penguin:2007/01/11(木) 15:59:24 ID:jLeCsuJN
>>432
あぁ、空白があったか。
このくらいなら find の -exec に押し込んじゃってもいいかも。
434login:Penguin:2007/01/11(木) 17:16:55 ID:XF9G0sx9
特殊ファイルのことを考えてないけど
rsyncを使わずに素直に書いてみた。

#!/bin/bash
src=${1%%/}
dst=${2%%/}
today=`date +%y%m%d`
yesterday=`date -d 'yesterday' +%y%m%d`
mkdir -p "$dst/$today"
find "$src" -type f | while read i; do
name=${i##$src}
tn=$dst/$today$name
yn=$dst/$yesterday$name
td=`dirname "$tn"`
if [ ! -e "$td" ]; then
mkdir -p "$td"
fi
if [ ! -e "$yn" ]; then
cp -p "$i" "$tn"
elif [ "$i" -nt "$yn" ]; then
cp -p "$i" "$tn"
else
mv "$yn" "$tn"
fi
done
435login:Penguin:2007/01/11(木) 17:26:23 ID:jLeCsuJN
>>420
> --move-dest とは?
rsync -v -a --move-dest=$BACK/$KINOU /data/ $BACK/$KYOU
で済んだらいいのにな、って話。
開発元に投げたら作ってくれるかもよ。
http://samba.anu.edu.au/rsync/bugzilla.html

>>432
> 俺の長いスクリプト無駄orz
「俺」が誰かわからんからどのスクリプトのことかわからん。
436424:2007/01/11(木) 22:00:07 ID:qzcPBdsk
>>426
初めてシェルスクリプトと言うのをほとんど無学で書いたので、そりゃーぐちゃぐちゃですよ。
可能な限りトレースしてみましたが、
if [ -d ${BACKUPDIR_KYOU} ]; then
echo Backup directory for today ${BACKUPDIR_KYOU} already exists. Aborting.
exit -1
で、1日2回以上実行した場合は最新に更新しないんですね。1日に1回しか実行できないと。
それより1日に何回でも実行できますが(基本的には1日に1回しか実行しないけど)、
その実行をするたびに/dataディレクトリの状態を${KYOU}ディレクトリへ反映した方がいいかな。

${CWD}/list.sh ${BACKUPDIR_KYOU} . | while read i; do
ここらへんも良く分からないOTL。

>>429
そうですそうです。前日のバックアップディレクトリに含めるんです。

>>430
お恥ずかしい限りです。精進します・・・

>>431>>434
もう全然分からないOTL

>>435
そのコマンド一発で一気に出来てくれると助かりますねぇ。
しかし開発元に投げるって、そんな事したことが無くて全然投げ方とか分かりません。
それに英語で書く必要があるんですよねえ。英語できなくて・・・。
もっとシェルスクリプトの書き方、各コマンドを知るって事をしないとダメですね。
$kyou とか私は記述していますが、 ${KYOU}のように皆さんは記述されていますね。
{ } で囲んだ方が見やすいとは思いますが、大文字にしないといけないのでしょうか?
しなくてもいいなら ${kyou}でもいいと思うのですが、見易さの観点から大文字ですか?
437login:Penguin:2007/01/11(木) 22:05:53 ID:jLeCsuJN
>>436
たとえば $kyou の直後に空白を入れず x と表示したいときに
echo ${kyou}x と書かなきゃいけない。
変数名を大文字にするのは、まぁ、慣習だ。

だれでも最初ははじめてだよ。
438login:Penguin:2007/01/11(木) 22:19:57 ID:jLeCsuJN
>>436
> それより1日に何回でも実行できますが(基本的には1日に1回しか実行しないけど)、
> その実行をするたびに/dataディレクトリの状態を${KYOU}ディレクトリへ反映した方がいいかな。
そうなるとだいぶ話が変わってくるな。
からっぽのディレクトリを作ってそこにコピーするのと
内容が入ってるディレクトリを更新するのとでは
やり方はかなり違う。
そういう仕様は先に言ってほしい。

> >>431>>434
> もう全然分からないOTL
どこがわからない?
439login:Penguin:2007/01/11(木) 22:36:21 ID:ryWqaD7B
だから素直に pdumpfs を改造すれば良いのに。
440424:2007/01/12(金) 00:33:12 ID:LG5Wdg1W
>>437
なるほどなるほど、って事はこれからは${KYOU}って書きますね〜ありがとうございます。

>>438
http://hp.vector.co.jp/authors/VA004777/fabre.html
ぶっちゃけこのソフトと同じ動きをしようと思っているんですが・・・
私一人の力ではsedとか正規表現とか分からなくて、アルゴリズムもそんなに強くないので
協力をお願いしています。仕様・・ん〜・・このサイト見ても詳しい事は分からないのかな・・

分からないところは聞いて教えてもらうようなところではないほど基本的なところなので
自分で学びます。具体的にはrmdirのオプションとかrsyncの--link-destの動きとか・・・。
で、
name=${i##$src}
src=${1%%/}
dst=${2%%/}
↑これは教えていただけませんかねぇ・・・調べにくそうなので・・

ん〜細かいところ分からないところ多いですが、もっとシェルスクリプトを学んでから
質問しないと皆様に悪いです。あまりにも私のレベルが低すぎるので。それも聞かなくても
自分で解決できるところも多々あります。時間を見つけて学びます。
C言語のfor文やif文、while文とは勝手が違って困惑しております^^;
基本的なコマンドをまずは知り尽くさないとダメですね。

シェルが分かったらLinuxに明るくなれそうな気がしたもので・・・。
ただ専門学校の勉強(情報専門学校ですw)もあって時間がなかなか微妙なので
まとまった時間が欲しい〜。資格試験の勉強とかでシェルスクリプトの勉強する時間が・・
441login:Penguin:2007/01/12(金) 00:59:54 ID:2F+P/e1j
>>440
> name=${i##$src}
> src=${1%%/}
> dst=${2%%/}
man bash で ## とか %% で検索すれば出てくるよ。
具体的には Parameter Expansion のとこ。

身の上話には興味ありません。
442login:Penguin:2007/01/12(金) 01:02:30 ID:GSHPBNFo
学生ほどまとまった時間がとれる身分はないのにみすみす逃すとは何ぞな
443login:Penguin:2007/01/12(金) 01:22:18 ID:ovCGtQUd
>>436
>それより1日に何回でも実行できますが(基本的には1日に1回しか実行しないけど)、
>その実行をするたびに/dataディレクトリの状態を${KYOU}ディレクトリへ反映した方がいいかな。
それをすると例えば、今日の1回目と2回目の実行の間に削除されたファイルは
${KINOU}にも${KYOU}にも残らなくなる。いくつかシナリオ考えてみるといい。
一日一フォルダの仕様をやめれば自然に解決できるけど。
Fabreっていうソフトで一日に複数回バックアップを実行するとどうなるの?
444login:Penguin:2007/01/12(金) 01:34:25 ID:U4rFYhBs
シェルスクリプトの中でsedで置換したファイルを作成したいんだけど、

#!/bin/sh

sed -e "s/abc/ABC/" testfile > testfile1


こうしてもtestfile1の内容はtestfileのままになってしまいます。
プロンプトから実行すればうまくいくのですが。。

解決策おしえてください。
445login:Penguin:2007/01/12(金) 01:55:54 ID:ovCGtQUd
>>444
sed -i
446444:2007/01/12(金) 02:02:45 ID:U4rFYhBs
うーん。自己レスします。何故かRedhat9だと普通にできて
ES3だとできない。
447login:Penguin:2007/01/12(金) 02:28:57 ID:2F+P/e1j
>>444
なんかの環境変数が違うのかな。
それかカレントディレクトリが違うとか。
448login:Penguin:2007/01/12(金) 02:44:04 ID:GSHPBNFo
まさか改行コードとか
449424:2007/01/12(金) 03:25:37 ID:LG5Wdg1W
>>441
教えてくださりありがとうございます、読んでみます。

>>442
うちの専門学校は忙しいんですよ。

>>443
Fabreで1日に複数回実行した場合は・・・
まず1回目実行した場合は
070112A
というフォルダが作成されて、フルバックアップ
次は 070113A 070114A と言う風になるのですが
1日に複数実行すると
070113A 070113B 070113C のようにアルファベットがドンドンついていきます。
このアルファベットは分かりにくいし1日のバックアップをそんなに残す必要は無いので
やめて、070113フォルダを最新に更新し続けるって事でいきたいなと。
450login:Penguin:2007/01/12(金) 04:26:45 ID:P1PDcxdt
>>449
>1日に複数実行すると
>070113A 070113B 070113C のようにアルファベットがドンドンついていきます。
そうなってる理由の一つが>>443なんだろう。元の作者は考えて作ってるんだから、
そこだけ勝手に変えたら破綻するだけ。
なぜ破綻するかはシェルプログラミングの問題じゃなく設計の問題。
仕様を先に決めろと言われてるのはそういうことだ。
451424:2007/01/12(金) 08:09:02 ID:LG5Wdg1W
>>450
なるほど。
学校でも設計やりますが、ぶっちゃけ仕様書を書くより先にプログラムを作って
それから仕様書を書きたくなりますが、そうじゃなくてしっかり仕様を決めて、それから
って事ですか・・。
と言う事はつまり、やっぱりA、B、Cと作っていかないと1日のうちに削除されたファイルが
バックアップするのを日をまたげば残されますが、日をまたがずに複数回バックアップした
場合に消滅しちゃうって事ですね・・・。しかし日付を取得するだけでも精一杯なのに
順番にA B Cと取得って・・・
for targ in A B C D E F G ・・・ Z ; do hogehoge ;
ってやるんですかねぇ・・・
452424:2007/01/12(金) 08:14:11 ID:LG5Wdg1W
書き忘れましたが、もう1つ勝手に変えてるところがあります。

Fabreではバックアップする際、ディレクトリ構造ごとバックアップします。
つまり/data/foo/var/hoge/hoge.xls
が更新された場合は
/backup/foo/var/hoge/hoge.xlsと保存されると言う事ですが
私が書いたシェルスクリプトだと
/backup/hoge.xls
とディレクトリ構造が消滅します。まぁ単純にディレクトリ構造を保持する方法が
分からなかったのと、ディレクトリまで掘らなくてもいいんじゃない?と
思ったからなんですが・・・。

それから、WindowsXPのデフォルト設定だとファイルを「更新してない」のに
開くだけで更新日付が変わってしまい、内容が同じなのにタイムスタンプが違う
というだけでバックアップ対象に含まれちゃうんですが、Fabreではこういうことが
おきないみたいです。この辺のこともどういうアルゴリズムなのか分かる方
いらっしゃいますか?
453login:Penguin:2007/01/12(金) 11:35:37 ID:ovCGtQUd
>>451
一日に26回以上実行したらどうすんの?
>>452
>ディレクトリまで掘らなくてもいいんじゃない?
バックアップ対象に同名のファイルが複数あったらどうすんの?
>Fabreではこういうことがおきない
タイムスタンプでなく内容を比較してるのでは?知らんけど。

他の人が貼ってるやつで十分動くから、実用に使いたいだけならそれ使えば?
勉強のためにやってるならいいトレーニングになるかもね。
454login:Penguin:2007/01/12(金) 12:32:47 ID:qjap1L0P
>>453
Z→AAだろ。
なんにせよ、発想もやり取りも場当たり的だね。破綻するよ。
バックアップは確実に取れてなんぼ。
455login:Penguin:2007/01/12(金) 12:35:12 ID:2F+P/e1j
CVS とかその手のやつの方が要求満たしたりしないかな。

アリモノを上手く使う方法を考えた方がいいよ。
スキルないのにいろいろやりすぎ。
456login:Penguin:2007/01/12(金) 12:38:26 ID:qjap1L0P
そうそう。
ディレクトリの階層が深いと言われているけど、それも理由があるよ。
毎回のバックアップディレクトリが全て同じ階層に並んだら
後々、色々と面倒なことが起こるんだよ。
457login:Penguin:2007/01/12(金) 12:47:35 ID:qjap1L0P
>>456
なんか Fabre とやらを見てみたけど、どうなの?
最新のバックアップフォルダが消えたらほぼ全滅じゃん。
458login:Penguin:2007/01/12(金) 13:35:16 ID:GSHPBNFo
いますごい自演を見た
459login:Penguin:2007/01/12(金) 14:12:44 ID:qjap1L0P
? どこがどう自演なのかさっぱり
460login:Penguin:2007/01/12(金) 16:00:36 ID:C3zXrohG
自作自演というより、多重人格だなw
461login:Penguin:2007/01/12(金) 16:18:33 ID:XHaWtrFv
459は、456なのかな、457なのかな。
精神科医さん、よろしく診断おながいします。
462424:2007/01/12(金) 16:35:41 ID:LG5Wdg1W
>>453
>一日に26回以上実行したらどうすんの?
はっ! と思ったけど>>454がZ→AAでなるほどっ!と思ったw。
っていうか一日にそんなにたくさん実行しないと思いますけど・・・。
>バックアップ対象に同名のファイルが複数あったらどうすんの?
すっかり抜けていました。確かに、同名のファイルが他のディレクトリにあった場合は
おかしくなりますね、下手したら上書き。片方消えちゃいますね。。。あちゃー
だからFabreは階層も保存対象なんだ・・・。なるほどなるほど。抜けだらけですね。
>タイムスタンプでなく内容を比較してるのでは?知らんけど。
内容を比較する事はdiffコマンドで出来ますか?
>他の人が貼ってるやつで十分動くから
どれが一番いいですかねぇ・・・ぶっちゃけ完璧にトレースする事が出来ないので
どれを選んでいいか分からないです・・・。まぁ勉強のためでもありますけど、
とりあえずは動く事が急務かな・・・。
>>456
>後々、色々と面倒なことが起こるんだよ。
面倒な事とは?少し具体的な例をあげて教えていただけ無いでしょうか?
その場合はバックアップ元に最新の全データが残っているので大丈夫です。
しかしバックアップ元と最新のバックアップフォルダの両方が同時に消えるって事は・・・
そうそうないと思うんですが・・・それを言ったらミラーリングだって同時に消えたら?
って事になるわけで・・・。

とりあえず皆様の話から
1.階層を省いてバックアップは不可能、階層付でバックアップする
2.一日に複数回実行した場合はバックアップ先の${KYOU}のディレクトリを最新に更新する
つまり1日に複数回実行した場合、その日のうちに更新したファイルは残らない事になるけど
ぶっちゃけそこまで細かい単位で残す必要は無い(1日単位で十分)ので。

となると、1個問題が・・・ list.shで出力されるファイルリストからファイル名の部分を除いた
そのファイルまでのパスのみを抜き出したtempファイルも出力して
# mkdir ${temp}
を実行しないといけませんよねぇ・・・。となるとまだsedとか正規表現が・・・分からないOTL
463424:2007/01/12(金) 16:38:37 ID:LG5Wdg1W
>>462
>その場合はバックアップ元に最新の全データが残っているので大丈夫です。
以下は
>>457
>最新のバックアップフォルダが消えたらほぼ全滅じゃん。
へのレスです。抜けてましたすみません。
464login:Penguin:2007/01/12(金) 17:09:04 ID:qjap1L0P
自演の意味が分かった。アンカーミスくらいスルーしてくれ。

>>462
一つのディレクトリに大量のファイル・ディレクトリがあると
ファイルシステムにもよるが、パフォーマンスがすこぶる悪くなる。
それと、スクリプトで * なんて指定しようものなら、
引数が長過ぎって怒られることもしばしば。
cugwin の方が顕著に起こるね。

また、バックアップディレクトリとオリジナルが同時に消えても
pdumpfs なんかだと大丈夫でしょ。
465424:2007/01/12(金) 18:23:13 ID:LG5Wdg1W
>>464
なるほど・・・そういう理由があるんですか・・・
でもそれはLinux系OSを使う場合ですかねぇ?
私がバックアップするファイルはWindowsのファイルなんですが、
LinuxのSambaで
backup data の二つを見えるように設定して
backupはSambaからだとRead Only。dataは自由に書き換えてOK
Windows版のrsyncでバックアップしてもいいし、"ばっちり同期"っていうソフトを使って
バックアップしてもいいし、とにかくWindows側からLinuxのSambaサーバに毎日
自動的にdata ディレクトリと同期を取る。
後はLinuxサーバが自動的にdataディレクトリの中をbackupディレクトリへ
毎日差分で保存していくと。そういう使い方をしますが、それでも、やっぱりパフォーマンスが
すこぶる悪くなるんですかねぇ。
466login:Penguin:2007/01/14(日) 03:43:28 ID:hrd0bfGL
ディレクトリ内で「rm *」と入力すると「rm: `.' や `..' は削除でき
ません」と表示されるんだけど、表示させないようにするにはどうすればいい?
467424:2007/01/14(日) 04:09:06 ID:xucnhoE2
>>466
# rm -rf *
って実行したらそれ表示されないけど・・・・
468login:Penguin:2007/01/14(日) 04:27:28 ID:TnmlbjBR
# rm -rf /
じゃないの?
469424:2007/01/14(日) 04:44:18 ID:xucnhoE2
シェルスクリプトって、C言語のfor文みたいな命令は無いのですか?
例えば、ある一連の処理を50回実行したいとかいった場合に
for(i=0;i<50;i++){
一連の処理
}
と言う具合に出来ないでしょうか?
470login:Penguin:2007/01/14(日) 05:07:50 ID:ceP06q+s
471424:2007/01/14(日) 05:35:44 ID:xucnhoE2
>>470
ありがとうございます。

#/bin/sh
for i in `seq 1 100`;
do
/root/backup.sh
date --set '1day';
done

で、出来ました。1日に1回実行するから、最初は1日ずらしてはbackup.shを
実行していたのですが、手間がわずらわしくなって、シェルスクリプトでこれも
やっちゃえるんじゃない?とか思ったので。
シェルスクリプトって凄いですね。これ人間の手で手動で100回やってたら
途方も無い労力・・・・
472login:Penguin:2007/01/14(日) 09:36:48 ID:+7O9gpFP
>>469
for ((i=0;i<10;i++)); do echo $i; done;
がつかえる。
473424:2007/01/14(日) 12:40:25 ID:xucnhoE2
>>472
おおお!まさにこれ!こっちの方がC言語しか知らない私にはあってます!
ありがとうございます。
ところで、最後の done の後には ; はいらないんじゃ?無くても動きましたよ。

こういう風にした方がseqコマンドに依存しないんだ・・・
474login:Penguin:2007/01/14(日) 12:42:11 ID:/t47kKMl
でも bash 依存なので、#!/bin/sh じゃなくて #!/bin/bash と書こうね。
475424:2007/01/14(日) 12:44:40 ID:xucnhoE2
>>474
いや、#/bin/sh で動作しましたよ
って書こうと思ったけど
/bin/sh は /bin/bashへのシンボリックリンクでした。なるほどです。
476424:2007/01/14(日) 13:57:05 ID:xucnhoE2
家の掃除が面倒です。毎回決まった作業をします。
シェルスクリプトで出来ませんか?
477login:Penguin:2007/01/14(日) 14:11:44 ID:ceP06q+s
>>476

#!/bin/bash
rm -rf ~

これを毎日cronで回せばいい。
478424:2007/01/14(日) 14:20:44 ID:xucnhoE2
>>477
wwww
家→homeディレクトリ
だからhomeの掃除→homeディレクトリ内のファイルを全削除
だからそうなるのか・・・w いや、冗談に付き合ってくれてありがとうw
479login:Penguin:2007/01/14(日) 15:49:54 ID:aKEUOG0O
>>473
tcshの方が合ってるんじゃないか?
480login:Penguin:2007/01/14(日) 16:38:34 ID:+7O9gpFP
>>473
じゃあ、操はもらった。
481424:2007/01/14(日) 20:24:17 ID:xucnhoE2
>>480
はぁ?w
482login:Penguin:2007/01/14(日) 21:34:39 ID:+7O9gpFP
C言語しか知らない私
483424:2007/01/14(日) 21:45:06 ID:xucnhoE2
>>482
面白い事を言っているのかもしれませんが、ネタの意味が分かりません。
なので笑えません。申し訳ない。
484login:Penguin:2007/01/14(日) 22:46:33 ID:OBZ/18Sv
カスが
485login:Penguin:2007/01/18(木) 07:40:47 ID:TIv0wXG8
Fedoraを使用してシェルの勉強をしています
文字列関連でわからないところがあり 行き止まってしまいましたのでお力を貸していただけないでしょうか

質問なのですが
testディレクトリの中に存在しているファイルの名前をExistenceFile.txt
に吐き出してあげようと思っています
testディレクトリにある多くのファイル名は 「xxxxx ffffff rrrrrr」 というように半角スペースが所々に入ってしまっております
その状態で下記を実行しますと

#!/bin/sh
FILE=`find /test -typef`
for I in $FILE
do
FILE_NAME=`basename "$I"`
echo $FILE_NAME >> ExistenceFile.txt
done

結果が
20060712
backup
file
等とスペースがあるところで改行されてしまいます
これを 改行なしで1行でExistenceFile.txtに吐き出す方法はありませんでしょうか
486login:Penguin:2007/01/18(木) 07:53:50 ID:8c0Vf/8/
find /test -type f | while read I; do
487login:Penguin:2007/01/18(木) 07:57:51 ID:olwbHUJd
>>485
find /test -type f -printf '%f\n' >>ExistenceFile.txt
488login:Penguin:2007/01/18(木) 08:15:38 ID:TIv0wXG8
ありがとうございます
findの後にいろいろつけたらいけそうな気がしてきました
489login:Penguin:2007/01/18(木) 09:54:27 ID:XQRzhywB
>>487
findの -printf ってすげぇ便利だね。
初めて知った。
490login:Penguin:2007/01/21(日) 02:21:35 ID:ghTDpHMf
xxxx from xxx.xxx.xxx.xx(xxxはIP)
hoge
tcp/ip
とかこんなのがたくさん書かれてあるファイルがあります。
その中から xxx.xxx.xxx.xxのIPの部分だけを抽出したいのですが
それをやるにはsedでどのようにすればよいのでしょうか?
1レコードずつ取り出してfor文で回して処理したいのです。
491login:Penguin:2007/01/21(日) 03:05:34 ID:9+Sse8vK
>>490
sed でのやり方はわからないけど
awk 使うと簡単だと思う。
492login:Penguin:2007/01/21(日) 03:37:59 ID:BjKyxjKB
sed -e 's/^.*from //g'
493login:Penguin:2007/01/21(日) 04:29:07 ID:lWHcz2jx
grep -o -P '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

GNU grep 限定。
範囲チェックはしてない。
494login:Penguin:2007/01/21(日) 13:47:55 ID:iD0A2i+i
マルチに答える奴かっこわるい
495login:Penguin:2007/01/21(日) 16:19:44 ID:ghTDpHMf
マルチじゃないですよ。
496login:Penguin:2007/01/23(火) 01:28:07 ID:hmxMcsrh
はわわ〜
497login:Penguin:2007/01/23(火) 22:52:57 ID:yZ01wUCk
いやそっちのマルチじゃなくって。

ダウンを5名勧誘すると
問屋になれてダウンの売り上げの18%が
懐に入るようになるやつの方。
498login:Penguin:2007/01/24(水) 00:09:06 ID:1/cr3eFo
>>497
他人のボケを潰してまで言いたいボケかね。
499login:Penguin:2007/01/29(月) 15:30:34 ID:qD+Ol7pJ
UNIX板の方から来ました。

797 :名無しさん@お腹いっぱい。 :sage :2007/01/29(月) 14:38:20
若干スレ違い気味な気もしますが

(p)ttp://x68000.q-e-d.net/~68user/unix/pickup?iconv

> 入力ファイルに無効な文字 (-f で指定した文字コードと矛盾するようなデータ) が
> 含まれていた場合、iconv はエラーとして終了する。FreeBSD の iconv では
> -c オプションを指定することで、無効な文字を無視して無視して続行することができる。
> 他の iconv では必ずエラーで終了してしまうようだ。

Linux で、変な文字を無視しつつ文字コードの変換をしたいときにはどうするのがベストでしょうか。
(個人的に馴染のある言語の) php で iconv//IGNORE をする、という手は思いついたのですが。

これ、相談させてください。

とりあえず今は
~/php/bin/php -r 'while (($line = fgets(STDIN)) != NULL) { echo iconv("Shift_JIS", "UTF-8", $line); } '
としてしのぎました。
500login:Penguin:2007/01/29(月) 15:33:59 ID:0RsnjQyh
>>499
Linux の iconv にも -c あるみたいだけど
それじゃだめなん?
501login:Penguin:2007/01/29(月) 16:16:33 ID:qD+Ol7pJ
うわまじだ、できました。
man iconv だけ見て実際に試してませんでした。
お騒がせしました。
502login:Penguin:2007/02/01(木) 10:23:06 ID:c0AyEF+O
ある空のディレクトリを複数用意してそこにユーザが自由にユーザが
ファイルをUPするとします。ファイルが何も入っていないディレクトリを
抽出するようなスクリプトを作りたいのですが、

if [ ! -f /TESTDIR/* ];then

こんな感じで書いていたら最初はうまくいってたのですがファイル数が
多くなったらtoo many arg...のエラーでてうまくいかなりました。

何か良い方法ありますか?
503login:Penguin:2007/02/01(木) 10:29:45 ID:7FjmZE6L
>>502
find /TESTDIR -maxdepth 0 -type d -empty
504login:Penguin:2007/02/01(木) 10:31:16 ID:7FjmZE6L
>>503
ちょっと違うか。
でもまぁ、find で空ディレクトリ一覧は出せるよ。

空のディレクトリのみ削除したいなら
いきなり rmdir しちゃうとか。
505login:Penguin:2007/02/01(木) 10:32:56 ID:7FjmZE6L
>>502
> if [ ! -f /TESTDIR/* ];then
これだと /TESTDIR/.test なんてファイルがあったらだめだな。
506502:2007/02/01(木) 13:37:30 ID:c0AyEF+O
>>505
そうでした。うかつです。
>>503
-maxdepth 0をつけるとなぜかファイルが入ってるディレクトリも
抽出されたのでfindで出来るというレスをヒントに

find /TESTDIR -type d -empty

で一見うまくいってるかも?です。少し様子見します。
ありがとうございます。
507502:2007/02/01(木) 13:53:02 ID:c0AyEF+O
と、思ったら失敗しました。

TESTDIRの下にディレクトリa,b,c,d...と初期にこちらで用意した
ディレクトリがありその初期ディレクトリで空のもののみを抽出した
かったのですが、ディレクトリaの下に通常のファイルの他に
空ディレクトリとか作られると

find /TESTDIR -type d -empty

でやるとディレクトリaの下の空ディレクトリも抽出されてしまいます。。
508502:2007/02/01(木) 14:48:33 ID:c0AyEF+O
自己レス
find /TESTDIR -maxdepth 1 -type -d
でうまくいきました。ありがとうございました。
509login:Penguin:2007/02/01(木) 14:50:50 ID:S77RcpST
find /TESTDIR -prune -type d -empty
510login:Penguin:2007/02/01(木) 21:48:28 ID:sTUB8jxJ
du
511login:Penguin:2007/02/01(木) 23:28:13 ID:ZVcHJobk
>>510
多分だめ(な場合がある)だろ。

LinuxのFS(たとえばext3)って、ファイルがないディレクトリのサイズは「必ず」0なのか?

他のUNIXでよくあるのは、いっぱいファイルを作った(当然ディレクトリのサイズ増大)後で、
ファイルを全部削除しても、ディレクトリ自体はすぐにはtruncateされない場合がある
ってな実装戦略なんだが。(この戦略は決してサボリじゃなく合理的理由がある)
512511:2007/02/01(木) 23:56:02 ID:ZVcHJobk
>>511みたいな複雑なケース以前にもっと単純に...

>>510
duだと、サイズ0のファイルが存在しても、それはないものとして数えられちゃうよね。

やっぱduのようにサイズを計るツールでファイル数を計るのは無理あるんじゃね?
513login:Penguin:2007/02/02(金) 03:11:38 ID:9L/PFxQe
find でやるのが正解だと思うけれど ls -A も使える。

for dir in /TESTDIR/*/ /TESTDIR/.*/ ;
do
count=`ls -A "$dir" | wc -l` ;
if [ $count -eq 0 ] ;
then echo "$dir": empty ;
fi ;
done

/TESTDIR/.*/ だと /TESTDIR/. と /TESTDIR/..
もマッチしちゃうけど。
514login:Penguin:2007/02/02(金) 07:25:12 ID:3bXppBjS
duで最小サイズのディレクトリを見付けfindする。
515login:Penguin:2007/02/02(金) 17:41:07 ID:DTfUN+wD
hogeを5秒後に起動したい

#!/usr/bin/sh
sleep 5 && hoge
516login:Penguin:2007/02/02(金) 18:05:04 ID:8alDMpKt
>>515
誤爆か?

3分後にカップラーメンを食べたい

#!/usr/bin/sh
sleep 3m && play /usr/share/sounds/login.wav
517login:Penguin:2007/02/02(金) 23:21:43 ID:DTfUN+wD
じゃあこれでいい?

3秒後にhogeを起動したい

#!/usr/bin/sh
sleep 3s && /usr/bin/hoge
518login:Penguin:2007/02/02(金) 23:25:24 ID:/lWC69nr
お前らatを知らんのか。
519login:Penguin:2007/02/02(金) 23:43:39 ID:tuwscbyy
atは許可されないと使えないわけだが。
520login:Penguin:2007/02/02(金) 23:59:13 ID:WEnZhawj
atd 動いてないかもしんないし。
521login:Penguin:2007/02/03(土) 00:00:23 ID:Lfu3L5NI
指定した時刻に電源がオンになるようなのはできますか?
522login:Penguin:2007/02/03(土) 01:40:12 ID:fL2Na2GQ
シェルスクリプトで、という意味?
普通はbiosとかの役割だと思うけど。
523login:Penguin:2007/02/03(土) 11:12:20 ID:6nwwXG2H
>>521
Wake On Ringコネクタにキッチンタイマーをつなげ。
524login:Penguin:2007/02/04(日) 01:35:42 ID:LvsFC69b
つ nvram-wakeup
これで次起きたい時刻をセットしてマシン落とせば(もしくはサスペンドすれば)おけ。
525login:Penguin:2007/02/12(月) 13:31:38 ID:SMeHWOZn
7za x *
というふうに*(ワイルドカード)が使用できないので
なんとかスクリプトで出来ないかとやってみたがダメ。
今いるディレクトリにある.7zすべてを展開したいけど
なして?
#!/bin/bash
for i in $*
do
7za x $i
done

$ ./7za.sh '*.7z'
Incorrect command line
526login:Penguin:2007/02/12(月) 13:38:29 ID:CD7jXCIx
シングルクオートで括ってるから?
527login:Penguin:2007/02/12(月) 22:43:07 ID:fALdmZ2l
だな
528login:Penguin:2007/02/14(水) 21:07:43 ID:kfyu3aZW
シェルスクリプトの練習のために、ftpでrsyncの様な事をする(つもりの)ものを書いてみました。
添削、助言などいただけると嬉しいです。定数定義等は省略してあります。

SERVER_FILE_LIST=$( ftp -n "${SERVER_ADRESS}" << END 2>>${LOGFILE_NAME}
user ${FTP_USERNAME} ${FTP_PASSWORD}
cd ${SERVER_DIR}
ls -l
END
)

SERVER_FILE_LIST=$(echo "${SERVER_FILE_LIST}"| awk '{print $9}')
UPFILE_LIST=$( ls -1 |sed "/^${LOGFILE_NAME}$/d" )

for SERVER_FILE in ${SERVER_FILE_LIST}
do
UPFILE_LIST=$(echo "${UPFILE_LIST}" |sed "/^${SERVER_FILE}$/d" )
done

for UPFILE in ${UPFILE_LIST}
do
ftp -i -v -n ${SERVER_ADRESS} << END >>${LOGFILE_NAME}
user ${FTP_USERNAME} ${FTP_PASSWORD}
cd ${SERVER_DIR}
bin
put ${UPFILE}
quit
END
done
529login:Penguin:2007/02/14(水) 21:48:24 ID:/I11T7H/
じゃあ俺も。ようつべからflvを拾ってくるスクリプト(要wget)。
パラメータは http://www.youtube.com/watch?v=XxXxXxXxXxX みたいなのをつける

#!/bin/sh
if [ "$1" = "" ] ; then exit 1 ; fi
YTURL=`echo $1|grep http://www.youtube.com/watch`
if [ -z $YTURL ] ; then exit 1 ; fi
VIDEOID=`echo $YTURL | cut -d = -f 2`
if [ -z $VIDEOID ] ; then exit 1 ; fi
INDEX=`mktemp YouTube.XXXXXXXX`
wget -q "$YTURL" -O $INDEX
if [ -s $INDEX ] ; then
YTURL=`grep "/player2.swf?" $INDEX | \
cut -d \" -f 2 | \
cut -d ? -f 2 `
wget "http://www.youtube.com/get_video?$YTURL" -O $VIDEOID.flv
fi
rm -f $INDEX
530login:Penguin:2007/02/15(木) 04:53:05 ID:Hg/Fwxgo
>>529
youtube-dl便利だぞ
531login:Penguin:2007/02/15(木) 08:15:32 ID:gox/9ooE
ようつべよりぐぐるの動画を……
532login:Penguin:2007/02/15(木) 08:20:07 ID:gox/9ooE
なんかちょっとgoogleっぽいIDが出た。
533login:Penguin:2007/02/15(木) 10:12:16 ID:IJ3FcxR6
GUIが好きならDemocracyPlayerオススメ。
534528:2007/02/15(木) 12:45:31 ID:w0BybIhd
タイムスタンプファイルサイズも比較しないレベルの低いのはヌルーっすかwww

変なことは書いていないと肯定的に考えるべきか…
535login:Penguin:2007/02/15(木) 13:24:50 ID:LfPH5BoW
つーか読むのめんどい。
多少汚くても
自分がやりたいことが実現できてるなら
それでいいんじゃね?
どっかわからない・うまく動かないとこがあるなら言ってよ。
536528:2007/02/15(木) 14:19:37 ID:w0BybIhd
>>535
それはそうですね。一応、使えてるのでOKかも。
mputがうまくいかなかった理由(ファイル名を”で囲う)がわかったのでforも一個減らせたし。
さて次はタイプスタンプでも取得するか。
537login:Penguin:2007/02/15(木) 14:59:35 ID:1HhpQr6V
du -a /usr/local/bin | gawk '{printf "%s\n", $0}'

コマンドラインから 動作。

ファイルに書いて、ファイルを実行すると gawkで
gawk: cmd. line:1: {printf "%s\n", $0}
' in expression:1: ^ invalid char '

エロ意人おしえてください
538528:2007/02/15(木) 15:06:03 ID:w0BybIhd
>>537
エロくない人だけど動きましたよ
539login:Penguin:2007/02/15(木) 15:28:35 ID:ooDXnCch
printf("%s\n",$0) にしてみるとか
540login:Penguin:2007/02/15(木) 15:49:24 ID:1HhpQr6V
>>538
>>539
レスさんきゅ。

gawk: cmd. line:1: printf ("%s\n", $0)
' in expression:1:             ^ invalid char '

いやぁ、動作しないのがおかしいんだけどね・・・。
おかしいなぁ。

いい忘れたが
元はといえば、Solaris HPで動作したシェルスクリプトがまったく動作しない。

ソラリス、HP:OK

CentOS4.4:NG
541540:2007/02/15(木) 16:24:13 ID:1HhpQr6V
自分のCentOS4.4では 動作しないが
実際動作させる環境(RHEL)で動作したから、クローズです。

gawk awkが違うってことだな。
542login:Penguin:2007/02/15(木) 16:49:04 ID:zT9bgmHM
たぶん改行コードが腐ってる。awk のせいではない。
543login:Penguin:2007/02/15(木) 21:15:18 ID:gox/9ooE
シェルが腐ってて''の中の\nを解釈しちゃうのかね。
544login:Penguin:2007/02/16(金) 09:20:41 ID:+PZTEw3U
違う。改行コードが CR+LF になっているので、awk の引数が
{....} ではなく {.....}CR になって構文エラーになる。
545login:Penguin:2007/02/16(金) 22:12:22 ID:/EU/hyDk
YouTubeとかGreasemonkeyで良いじゃんって思うんだけど
w3mで見れないし
546login:Penguin:2007/02/22(木) 00:04:52 ID:8/cpZrIn
初めてのシェルスクリプトです。自信ないけど見てください。
mktempで作成した一時ファイルは削除した方がいいのでしょうか。エラー処理とかよくわかりません。

使用例
echo 'http://shupoxxx.2.dtiblog.com/?page=0' | ./urlcollector.sh '/\?page=[0-2]' | grep 'jpg$'

#!/bin/sh
# urlcollector.sh
REGEX=$1
TMPFILE=`mktemp /tmp/urlcollector.sh.XXXXXX`
DL_FILE=`mktemp /tmp/urlcollector.sh.XXXXXX`

download() {
    while read LINE; do
        if grep `echo "$LINE" | sed -e 's/?/\\\\?/'` $DL_FILE; then
            :
        else
            echo "DEBUG:$LINE" 1>&2
            echo "$LINE" >> $DL_FILE
            lynx -dump -image_links "$LINE" | grep -o 'http://.*$' |
            tee -a $TMPFILE | grep -E "$REGEX" | download
        fi
    done
}
download # let's do it!
cat $TMPFILE | sort -u
547login:Penguin:2007/02/22(木) 01:32:51 ID:I6i5DnCh
エラー処理は

 set -e
 trap '...終了時の掃除処理...' 0 1 2 3 14 15

あたりを冒頭にかくよろし。
548login:Penguin:2007/02/22(木) 10:19:06 ID:PGB0Kf4J
>>547
urlcollector.sh: line 1: ...終了時の掃除処理...: command not found

trap 'echo ...終了時の掃除処理...' 0 1 2 3 14 15

549login:Penguin:2007/02/22(木) 17:37:30 ID:IB5Lfolq
>>546
それだと相対パスのリンク取れないけどそれでいいならいいか。
俺なら手抜きでこうやる。

URL=http://hogehoge.jp

wget -nv -nd -r -w1 --delete-after $URL 2>&1 | awk '{sub("^URL:","",$2); print $2;}'

550login:Penguin:2007/02/28(水) 03:56:45 ID:KugGv7KW
if文で「(AかつB)またはC」を条件にしたい時
if [ ( A -a B ) -o C ] という構文は
解釈してくれないようなのですが、どのように
表現したらいいのでしょうか?
とりあえず
if [ A -a B ] ; then
...
elif [ C ] ; then
...(同じコマンド)
としているのですが・・・。
551login:Penguin:2007/02/28(水) 07:40:43 ID:gjXTuKQD
>>550
if [ A -o C ]; then
if [ B -o C ]; then
...
fi
fi
552login:Penguin:2007/02/28(水) 10:06:56 ID:J/P3bKEE
>>550
解釈する。

ただし、ほとんど全てのシェルで括弧はサブシェルを意味するから、
if [ \( A -a B \) -o C ]; then
と書く必要があるよねえ。
553550:2007/02/28(水) 19:31:48 ID:KugGv7KW
>>551
>>552
ありがとうございます。勉強になりました!
554login:Penguin:2007/03/01(木) 20:53:35 ID:7aN7LiNz
pingを使用し実行結果によって失敗した場合"NG"の文字が書き込まれるスクリプトを作りたいと思ってます。
どのように作ったらいいでしょうか?お願いします。
555login:Penguin:2007/03/01(木) 22:52:27 ID:08JSMW9W
仮に192.168.0.1があるとする

ping -c 2 192.168.0.1 | grep error | awk '{print $7}'
無表示

192.168.0.2はないので
ping -c 2 192.168.0.2 | grep error | awk '{print $7}'
error← これがでる

あとはGoogle先生に聞いてみ
556login:Penguin:2007/03/01(木) 23:00:23 ID:7aN7LiNz
>>555
ありがとうございます。試してみます。
557login:Penguin:2007/03/01(木) 23:25:05 ID:ION7xCTo
>>554
if ping -c 1 -q 192.168.0.1 > /dev/null
then
echo OK
else
echo NG
fi
558login:Penguin:2007/03/02(金) 00:13:15 ID:eLbGjXrV
>>555
>>557
ありがとうございます。まだ使いなれてないから助かります。
559login:Penguin:2007/03/02(金) 00:56:16 ID:mhRNhPgc
>>557 やさしいなw
>>558 Ping1発ってのはちょっとやばいかも
560login:Penguin:2007/03/02(金) 01:26:33 ID:eENYHLYp
var/log/messagesを以下のように整形したいんだけどどうしたらいい?

***************************
Mar 1 01:20:24 SrvName messages1
Mar 1 01:20:24 SrvName messages1 messages2 messages3 messages
Mar 1 02:32:26 SrvName messages1 messages2
***************************

***************************
"Mar","1","01:20:24","SrvName","messages1"
"Mar","1","01:20:24","SrvName","messages1 messages2 messages3 messages4"
"Mar","1","02:32:26","SrvName","messages1 messages2"
***************************
messages部分のスペース区切りの個数が不定で堂処理していいかわかんね
561login:Penguin:2007/03/02(金) 01:40:39 ID:DluxQ0ua
messageが、5列目から行末まででひとつ、というように決まっていたらawkで簡単にできる希ガス。
そこが変化するとしたら、多少難しくなるけど。
562560:2007/03/02(金) 01:51:37 ID:eENYHLYp
>messageが、5列目から行末まででひとつ、というように決まっていたらawkで簡単にできる希ガス。
それ教えて欲しい
563login:Penguin:2007/03/02(金) 03:02:52 ID:ZIoLVn00
sedだけじゃだめか…
564login:Penguin:2007/03/02(金) 04:24:06 ID:qr6854Xw
perl -lane 'print "\"@F[0]\" \"@F[1]\" \"@F[2]\" \"@F[3]\" \"@F[4..$#F]\""' /var/log/messages
565login:Penguin:2007/03/02(金) 04:39:37 ID:qr6854Xw
こっちの方が簡単か
perl -pe 's/^(.+?)\s(.+?)\s(.+?)\s(.+)$/"$1" "$2" "$3" "$4"/' /var/log/messages
sedって最小マッチないの?
566login:Penguin:2007/03/02(金) 06:42:30 ID:IowIaKgF
sed -e 's/\([^ ][^ ]*\)/\"\1\",/g' -e 's/,$//'
567login:Penguin:2007/03/02(金) 13:35:12 ID:fGxwGi3m
awk '{printf("\"%s\",\"%s\",\"%s\",\"%s\",\"",$1,$2,$3,$4)}{for (n=5;n!=NF;n++){printf("%s ",$n)}}{printf("%s\"\n",$NF)}' /var/log/messages
568login:Penguin:2007/03/02(金) 13:50:58 ID:UPZ4cbP+
perl -ne 'chomp;print join(",",map{"\"".$_."\""}split(/\s+/, $_, 4)),"\n"'
ruby -ne 'chomp;print $_.split(/\s/,4).map!{|i|"\""+i+"\""}.join(","), "\n"'
569login:Penguin:2007/03/02(金) 16:15:48 ID:L37+spPG
ぜんぜん関係無いけど
もれクォーテーション1つ抜けてでアワワアワワしちゃうんだよなww
上のスクリプト見てると神にみえるww
570login:Penguin:2007/03/02(金) 20:29:27 ID:IowIaKgF
クォートとエスケープはいつもなやましいよなぁ。
実際上のいくつかでも、messageに"だの'だの入ってたらどうしようとか、
"",区切りにしてエスケープどうなってんだとか、悩みどころはあったりw
571560:2007/03/03(土) 00:14:45 ID:iiaDHPL3
遅くなりましたが結局こうする事にしました。

CSVの規約に従うため「"」エスケープ⇒行頭に「"」追加⇒行末に「"」追加⇒項目1と項目2の間の「 」に「","」
追加⇒項目2と項目3の間の「 」に「","」追加⇒項目3と項目4の間に「","」追加⇒項目4と
項目5の間に「","」追加

sed -e 's/"/""/' -e 's/^/"/' -e 's/$/"/' -e 's/ /"\,"/' -e 's/ /"\,"/' -e 's//"\,"/' -e 's/ /"\,"/'

>>567の人のスクリプトに似てるのかな?
どうもありがとう
572login:Penguin:2007/03/03(土) 01:32:37 ID:edELaDd0
サーバ・ユーザごとのログインログアウト履歴を作りたいんだけどどうしたら良いだろう

整形前
日付,サーバ名,ユーザ名、ログイン時刻、ログアウト時刻、区分
**********************************************************
"2007/02/16","SrvName1","USER1","2007/02/16 00:10:00","",1
"2007/02/16","SrvName1","USER2","2007/02/16 00:20:00","",1
"2007/02/16","SrvName1","USER1","","2007/02/16 01:00:00",6
"2007/02/16","SrvName1","USER3","","2007/02/16 01:20:00",6
"2007/02/16","SrvName2","USER1","2007/02/16 00:10:00","",1
"2007/02/16","SrvName2","USER1","","2007/02/16 00:20:00",6
"2007/02/16","SrvName2","USER1","2007/02/16 01:00:00","",1
"2007/02/16","SrvName2","USER1","","2007/02/16 01:10:00",6
**********************************************************

区分「1」はログイン、「6」はログアウト

整形後
日付,サーバ名,ユーザ名、ログイン時刻、ログアウト時刻
**********************************************************
"2007/02/16","SrvName1","USER1","2007/02/16 00:10:00","2007/02/16 01:00:00"
"2007/02/16","SrvName1","USER2","2007/02/16 00:20:00",""
"2007/02/16","SrvName1","USER3","","2007/02/16 01:20:00"
"2007/02/16","SrvName2","USER1","2007/02/16 00:10:00","2007/02/16 01:10:00"
**********************************************************
573login:Penguin:2007/03/03(土) 01:33:20 ID:edELaDd0
>>572 続き

1行目 SrvName1,USER1は「ログイン、ログアウトともにある」ので全ての項目があり
2行目 SrvName1,USER2は「ログインのみ」なのでログアウト時刻なし
3行目 SrvName1,USER3は「ログアウトのみ」なのでログイン時刻なし
4行目 SrvName2,USER1は複数回のログインログアウトなので一番早いログインをログイン
時刻、一番遅いログアウトをログアウト時刻

複数回のログインログアウト時の「ログインのみ」「ログインログアウトともにあり」
「ログアウトのみ」の考え方は
ログイン回数>ログアウト回数⇒「ログインのみ」
ログイン回数=ログアウト回数⇒「ログインログアウトともにあり」
ログイン回数<ログアウト回数⇒「ログアウトのみ」

あ、あと「サーバ名」、「ユーザ名」は事前にはわからない(整形前のデータから持って
くる)という前提



これをBourne sh(awk,sed)でやりたいんだけどどうすれば良いと思う?
574login:Penguin:2007/03/03(土) 01:34:20 ID:edELaDd0
>>573 続き

考え方としては
1.サーバ名,ユーザ名、ログイン時刻、ログアウト時刻でソート
**********************************************************
"2007/02/16","SrvName1","USER1","2007/02/16 00:10:00","",1
"2007/02/16","SrvName1","USER2","2007/02/16 00:20:00","",1
"2007/02/16","SrvName1","USER1","","2007/02/16 01:00:00",6
"2007/02/16","SrvName1","USER3","","2007/02/16 01:20:00",6
"2007/02/16","SrvName2","USER1","2007/02/16 00:10:00","",1
"2007/02/16","SrvName2","USER1","2007/02/16 01:00:00","",1
"2007/02/16","SrvName2","USER1","","2007/02/16 00:20:00",6
"2007/02/16","SrvName2","USER1","","2007/02/16 01:10:00",6
**********************************************************

2.サーバ・ユーザ一覧の作成(SQLのDISTINCTのイメージ)して
サーバ名,ユーザ名
**********************************************************
"SrvName1","USER1"
"SrvName1","USER2"
"SrvName1","USER3"
"SrvName2","USER1"
**********************************************************
575login:Penguin:2007/03/03(土) 01:35:11 ID:edELaDd0
>>574 続き

3.サーバ・ユーザごとの単位でログイン回数の取得、ログアウト回数の取得
サーバ名,ユーザ名、ログイン回数、ログアウト回数
**********************************************************
"SrvName1","USER1",1,1
"SrvName1","USER2",1,0
"SrvName1","USER3",0,1
"SrvName2","USER1",2,2
**********************************************************

4.ログイン回数、ログアウト回数の比較により処理の分岐
ログイン回数>ログアウト回数⇒最初に現れるログイン行を「区分」をはずして出力
ログイン回数=ログアウト回数⇒最初に現れるログイン行から日付,サーバ名,ユーザ名、
ログイン時刻、最後に現れるログアウト行からログアウト時刻を出力
ログイン回数>ログアウト回数⇒最後に現れるログアウト行を「区分」をはずして出力

だと思うんだけどどう記述していいかさっぱりわからない。
部分的にでもいいから教えてくれると助かる。
576login:Penguin:2007/03/03(土) 01:57:39 ID:nNlZIkVJ
awk --field-separator , '{print $2 "," $3}' filename | sort -t , -k 1,2 | uniq | while read i; do echo $i; done
echo $iの部分を書き換えて3,4をやればいい。grep $i filename | ...

577login:Penguin:2007/03/03(土) 02:01:18 ID:RU//CQO2
お題が長すぎて読む気にならないw

ところで、
>sed -e 's/"/""/' -e 's/^/"/' -e 's/$/"/' -e 's/ /"\,"/' -e 's/ /"\,"/' -e 's//"\,"/' -e 's/ /"\,"/'
こういう書き方は、行が多いときにすごく時間がかかるような気がするんだが、どうなんでしょ。
まあ、一個一個の置換がごく単純だから実際に動かすと大したことないのかも知れんけど。
578login:Penguin:2007/03/03(土) 08:11:26 ID:r96zq1tk
>>577
579login:Penguin:2007/03/03(土) 09:06:54 ID:KAxXYkpS
>>578
580login:Penguin:2007/03/03(土) 09:51:33 ID:/H9/5Nw7
>>577
;で区切れ
581572-575:2007/03/03(土) 22:09:48 ID:qjCUufyU
>> 576 thx!

とりあえず >>575 の 「3.」までは出来た。
awk -F, '{print $2 "," $3}' filename | sort -t , -k 1,2 | uniq | while read i; do grep $i filename |
awk -F, 'BEGIN{i=0;j=0} {if($6=="1"){i+=1};if($6=="6"){j+=1}} END{print $1 "," $2 "," $3 "," i "," j}'; done

"2007/02/16","SrvName1","USER1",1,1
"2007/02/16","SrvName1","USER2",1,0
"2007/02/16","SrvName1","USER3",0,1
"2007/02/16","SrvName2","USER1",2,2

「4.」はどうすればいいのかなぁ?
582581:2007/03/04(日) 02:57:10 ID:1YavrZjg
とりあえず出来た
>>581 の結果をfilename2

ログイン回数>ログアウト回数
awk -F, '{if($4>$5){print $1 "," $2"," $3}}' filename2 | while read i; do grep $i filename |
awk -F, '{if($6=="1" && NR==1 ){print}}' ; done

ログイン回数>ログアウト回数
awk -F, '{if($4<$5){print $1 "," $2"," $3}}' filename2 | while read i; do grep $i filename |
awk -F, 'BEGIN{j=0} {if($6=="6"){j+=1}} END{if($6=="6" && NR=j ){print}}' ; done

ログイン回数=ログアウト回数
ログインをfilename3、ログアウトをfilename4として作成。キー部分の区切り文字変更「,」→「;」
awk -F, '{if($4==$5){print $1 "," $2"," $3}}' filename2 | while read i; do grep $i filename |
awk -F, '{if($6=="1" && NR==1 ){print $1 ";" $2 ";" $3 "," $4 "," $5}}'; done > filename3

awk -F, '{if($4==$5){print $1 "," $2"," $3}}' filename2 | while read i; do grep $i filename |
awk -F, 'BEGIN{j=0} {if($6=="6"){j+=1}} END{if($6=="6" && NR=j ){print $1 ";" $2 ";" $3 "," $4 "," $5}}'; done > filename4

filename3とfilename4をjoinして区切り文字を戻す。
join -j 1 -t, -o 1.1 1.2 2.3 filename3 filename4 | sed 's/;/,/g'
583login:Penguin:2007/03/04(日) 10:14:15 ID:rSFei0yO
>571
もう解決したようだがperlのsplitで個数制限した方が簡単じゃないのか。
bashのreadでもいいが。
cat log | while read mon day time host message
do
echo '"'$mon'","'$day'","'$host'","'$time'","'$message'"'
done
584login:Penguin:2007/03/04(日) 10:36:12 ID:rSFei0yO
>572
ぁぁ似たようなお題をsendmailログでやったことがある。

awkでやるならログインの時刻をlogin[server;user]って連想配列に記録して
ログアウトの行がでてきたらlogin[server;user]の有無をチェックすりゃいい。
あればログアウト時刻ともども整形して出力する。

エラーとして扱うものとしては
・ログアウトだけが先に出てきた場合
・ログインが重複した場合
・ログインだけでログアウトが無い場合。
先2つは配列チェックでわかるし、最後はログアウトが出てくるたびに
配列をdeleteしとけば、ENDで残ってる配列を出力すればいい。
585login:Penguin:2007/03/04(日) 14:20:37 ID:rSFei0yO
あ、すまん。
ちょっと早とちりしたな。
複数回のログイン/ログアウトがあるのと、最終時刻の処理があるんだな。
そうすっと、ログインでインクリメント、ログアウトでデクリメントする
カウンターで判別して、1→0になったときに出力するような処理になるな。
586login:Penguin:2007/03/04(日) 21:51:57 ID:2F8m6Ras
仕様がはっきりしないけど、多分そうじゃない気がする
一番早いログイン時刻と一番遅いログアウト時刻を記録したいのだろう
587login:Penguin:2007/03/05(月) 00:45:23 ID:OSYZNrW6
そうすると、すべてのログを読み込んでからでないと確定できないな。
それだと単純に、loginとlogoutの両方の配列を用意して、最小値と最大値で
更新すりゃいいだけになる。
ただ、この場合ログイン数が0になっても、ログイン中として扱うパターンが
あり得るんだが、いいのかなぁ。
588582:2007/03/05(月) 02:02:20 ID:tWB3mW28
ええと、仕様的には >>573 にあるように「サーバ名・ユーザ」単位でログイン・アウトを記録したいという内容。
複数回ログイン・アウトがあった場合はその日のログインログアウトの一番早いログイン時刻と一番遅いログアウト時刻を記録する仕様。
日またぎでログイン・アウトがあるとそれぞれの時刻が落ちて出力される。

なので
1日目 ログインのみ
2日目 1日目のログアウト 2日目のログイン 2日目のログアウト
だと
1日目の出力結果は「1日目ログイン時刻のみ」
2日目の出力結果は「2日目のログイン時刻 2日目のログアウト時刻」
という内容なんだけど…説明悪かったかな?

>>587
詳しく説明して欲しいかも
589582:2007/03/05(月) 02:14:35 ID:tWB3mW28
ごめん>>588訂正
なので
1日目 ログインのみ
2日目 1日目のログアウト 2日目のログイン 2日目のログアウト
だと
1日目の出力結果は「1日目ログイン時刻のみ」
2日目の出力結果は「2日目のログアウト時刻」

ついでに
1日目 ログインのみ
2日目 1日目のログアウト 2日目のログイン 2日目のログアウト 2日目のログイン2回目
3日目 2日目のログイン2回目に対応するログアウト
だと
1日目の出力結果は「1日目ログイン時刻のみ」
2日目の出力結果は「2日目のログイン時刻 2日目のログアウト時刻」
3日目の出力結果は「2日目のログイン2回目に対応するログアウト時刻」
590login:Penguin:2007/03/05(月) 12:02:30 ID:OSYZNrW6
>複数回ログイン・アウトがあった場合は

なら、問題なさそう。
1日に細切れでログイン/ログアウトを繰り返した場合に、実際の使用時間と
加工後のデータから得られる使用時間はまったく一致しないからね。
ただ、元データの方にttyなどのコネクションを識別できる情報があった方が
正確な情報は得られる。(多重にログインしたユーザーの積算使用時間も出せる)
ま、それは必要とする仕様かどうかによるけど。
591login:Penguin:2007/03/05(月) 18:29:49 ID:wAQNui7h
ファイルを日付で分類したいのです。
1) 2007-03-05のようにディレクトリをつくって
2) 200x-xx-xx のファイルは200x-xx-xxに分類したいです。

$ mkdir `ls -tl | awk '/^-/{print $6}'|uniq`
でディレクトリはつくりました。
強引に
mv ファイル名 日付
を大量に出力してそれを実行しました。

$ls -tl | awk '{print "mv -i "$8" "$6}' >mv.sh
$chmod +x mv.sh
$./mv.sh
で成功しました。
もっと効率のいい方法はありませんか?
592login:Penguin:2007/03/05(月) 20:03:29 ID:UjE4kCi3
>>591
ls -tl | awk '{print "mv -i "$8" "$6}' | sh
593login:Penguin:2007/03/05(月) 20:04:40 ID:WOM3rCQb
>>591
一発で全部やりたいならこんな感じかな。
何も変わってないじゃんって言われればそれまでだけどw

$ ls -tl \
| awk '{print "test -f \""$8"\" && mkdir -p "$6" && mv -i "$8" "$6}' \
| /bin/sh

594login:Penguin:2007/03/05(月) 20:34:09 ID:wAQNui7h
>>592
そうですよね。最後は |sh でいいですね。
>>593
一発でできて便利なので使わせていただきます。
595login:Penguin:2007/03/05(月) 21:15:15 ID:JzJRbxG3
for i in *; do a=`echo $i | cut -c 1-10`; [ ! -d $a ] && mkdir $a; mv $i $a ; done
596login:Penguin:2007/03/08(木) 01:54:56 ID:4C912WZA
シェルスクリプトの宿題スレって存在するの?
597login:Penguin:2007/03/08(木) 13:14:23 ID:TAQWLHvv
ddで長時間バックアップしてる間にプログレス表示としてよく見かける、
.......................
といった経過表示をddが終了するまで表示したいのですが、
何か簡単な方法はあるでしょうか?
子プロセスとしてddを立ち上げて、そのプロセスが終わるまで文字 . を表示する
という感じでできるかなと考えたのですが、実際スクリプトにしようとすると
よくわかりません。
よろしくお願いします。
598login:Penguin:2007/03/08(木) 13:22:28 ID:AYn96bmu
バックグラウンドで動かして、その直後に無限ループ、でいいんじゃね?
599login:Penguin:2007/03/08(木) 13:36:31 ID:j6P8g5xE
>>597
... じゃないけど
進行ぐあいなら USR1 送れば見れるよ。
man dd 参照。
600login:Penguin:2007/03/08(木) 14:17:46 ID:AYn96bmu
( ・∀・)つ〃∩ ヘェーヘェーヘェー
601login:Penguin:2007/03/08(木) 14:40:25 ID:TAQWLHvv
>>599
#!/bin/sh
(gzip -dc < /hda.gz | dd of=/dev/hda) &
pid=$!
kill -USR1 $pid; sleep 1
kill -USR1 $pid; sleep 1
kill -USR1 $pid; sleep 1
kill -USR1 $pid; sleep 1
kill -USR1 $pid; sleep 1

ためしに上のを実行すると

./t.sh: line 5: 5098 ユーザ定義シグナル 1 (gzip -dc < /hda.gz | dd of=/dev/hda)
./t.sh: line 6: kill: (5098) - そのようなプロセスはありません
./t.sh: line 7: kill: (5098) - そのようなプロセスはありません
./t.sh: line 8: kill: (5098) - そのようなプロセスはありません
./t.sh: line 9: kill: (5098) - そのようなプロセスはありません

kill -USR1 $pid でdd死んでしまいます(KNOPPOX501です)

それとやっぱり...というシンプルな表示がしたいです
602login:Penguin:2007/03/08(木) 14:48:13 ID:j6P8g5xE
>>601
それだとシグナルをサブシェルに送ってる。
dd に送らなきゃ。
603login:Penguin:2007/03/08(木) 15:40:43 ID:TAQWLHvv
>>602
どうしたら良いですか?
リダイレクトしてるので良くわからないです…
604login:Penguin:2007/03/08(木) 16:00:18 ID:AYn96bmu
名前付きパイプを使う手があるな。
mknod p hoge
gzip -d < /hda.gz >hoge &
dd if=hoge of=/dev/hda &

検証してないから、ちゃんと動くかどうか知らんけど。
605login:Penguin:2007/03/08(木) 16:01:58 ID:+LJ7KyQP
>>603
シェルスクリプト良く知らないけど、こんなのではだめ?
#!/bin/sh
$* &
PID=$!
while sleep 1;do
        if ps -p ${PID} >/dev/null; then
                echo -n "."
        else
                break
        fi
done
echo
606login:Penguin:2007/03/08(木) 16:06:52 ID:j6P8g5xE
>>603
pkill
607login:Penguin:2007/03/08(木) 16:08:05 ID:j6P8g5xE
>>601
> それとやっぱり...というシンプルな表示がしたいです
それだと進捗ぐあいじゃなくて
単に時間の経過しかわからないと思うんだけど
それでもいいの?
608login:Penguin:2007/03/08(木) 16:14:31 ID:j6P8g5xE
>>605
while ループはこれでいいかも。

while ps -p ${PID} >/dev/null; do
echo -n "."
sleep 1
done
609605:2007/03/08(木) 16:18:46 ID:+LJ7KyQP
>>608
はるかに分かりやすくなってる。ありがと。
610login:Penguin:2007/03/08(木) 16:30:03 ID:TAQWLHvv
>>605
素晴らしいです。
期待通り動きました。

ps -p というのが全く思いつきませんでした。

>>602
以下のサイトでサブシェルの意味わかりました。
ttp://x68000.q-e-d.net/~68user/unix/pickup?%A5%B5%A5%D6%A5%B7%A5%A7%A5%EB
括弧を取るとちゃんと動作しました。

>>607
今回は動いてる事がわかればよいので。
-USR1の出力はちょっと大げさすぎだと感じました。

皆様ありがとうございました!
611login:Penguin:2007/03/08(木) 19:24:56 ID:DcXuYWc6
bashのシェルスクリプトで質問があります。

シェルスクリプトでディレクトリを読み込んだら、(bash scriptname dirname)
ディレクトリの中に入っているファイル名一覧が表示され、その中にあるひとつひとつのファイルに対して
echo -n "このファイルを削除しますか?(y/n):"という質問が動いて、yを入力したらファイルの削除、
nを入力したら次のファイルへ... の繰り返しで、すべてのファイルに対し質問が終わったら自動終了といったスクリプトを組むにはどうすればいいのでしょうか?
612login:Penguin:2007/03/08(木) 19:35:34 ID:E8gENzoP
rm -i * じゃ駄目なの?
613login:Penguin:2007/03/08(木) 19:40:06 ID:yay+VEJ8
>>611
man bashくらい読め。

#!/bin/sh
ls
for f in $(ls)
do
read -p "$f: このファイルを削除しますか?(y/n)" yn
if [ $yn = 'y' ]; then echo "hoge"; fi
done
614login:Penguin:2007/03/08(木) 19:45:05 ID:mBi+fMQI
$ find . -type f -ok rm {} \;
615login:Penguin:2007/03/09(金) 23:25:10 ID:Ow5qpnt1
どう考えてもrubyで書いた方が楽だと言う結論に至った漏れ。orz
bashが入ってない環境も世の中には有るよ。
616login:Penguin:2007/03/09(金) 23:42:04 ID:vjvti0GD
>>615
この板で bash が入ってない環境って言ったら
組み込みとか 1FD Linux とか?
でもそんな環境で Ruby はあるの?
617login:Penguin:2007/03/09(金) 23:48:42 ID:bIj6wKte
Ubuntuはデフォルトでbash入ってないよ。びっくりした。
awkもgawkじゃない。
しかしインスコスクリプトにpythonを使ってるらしい
618login:Penguin:2007/03/10(土) 00:16:43 ID:XDgH9p6n
そしたら ubuntu のユーザーシェルは何使うようになってるの?zsh とか?
/bin/sh は NetBSD の sh(ash)とかよく使うよね。
awk は debian も mawk だね。
619login:Penguin:2007/03/10(土) 00:23:34 ID:83pOdsj9
dashだよ。Debianのシェルらしいけど、Debianもデフォルトはbashなのか。
620login:Penguin:2007/03/10(土) 01:38:10 ID:Rq1Ea8oP
>>617
ubuntuはbashでしょ?
621login:Penguin:2007/03/10(土) 11:11:25 ID:O1G3yuUF
bashでもdashでもkshでも動作するシェルスクリプトを書けば良くね?
622login:Penguin:2007/03/10(土) 23:31:55 ID:pXdmyjW7
↑天才現る。
623login:Penguin:2007/03/11(日) 03:50:50 ID:tKZgv+kr
>>615
そりゃあどう考えてもrubyで書いた方が楽だけど、bashが入ってない環境よりrubyが入ってない環境の方が多い
624login:Penguin:2007/03/11(日) 17:03:53 ID:CB+5C8Qy
sh互換でおk
625login:Penguin:2007/03/11(日) 18:55:25 ID:Qt6vb6Xc
perl ならまず入ってるよ(w
626login:Penguin:2007/03/11(日) 23:26:45 ID:yhYVVgbt
>>625
そうとも限らない。
627login:Penguin:2007/03/12(月) 19:34:19 ID:kzL27UFe
どういう意味だ。
perlはまず入ってない
と言いたいのだろうか。
628login:Penguin:2007/03/12(月) 22:18:16 ID:HFB6fGQj
ヒント:「まず入ってる」の否定は「まず入ってない」ではない。
629login:Penguin:2007/03/12(月) 22:42:07 ID:kzL27UFe
どういう意味だ。
「まず入ってる」の否定の一枝として「まず入ってない」はあり得ない
と言いたいのだろうか。
630login:Penguin:2007/03/12(月) 22:58:18 ID:uRSEAnpV
>>627
文字通りに受け取れよ。
631login:Penguin:2007/03/12(月) 23:36:15 ID:jlkf/zXh
で結局 >>615 はどんな環境のことを言ってたんだ?
632login:Penguin:2007/03/13(火) 02:35:04 ID:YI48y6FI
>>631
ウィンドウズにきまってるじゃないか!!!
世界のパソコンの90%いじょうにはbashなんてはいってないんだぞ!!!!!
633login:Penguin:2007/03/13(火) 02:38:16 ID:Ub0cVaTP
この板をどなたと心得る。
634login:Penguin:2007/03/13(火) 02:45:00 ID:HgbRL3Pw
bashでシェルスクリプトを組もうとしています。

今、hohogehoge.txtというファイルに、色んな文章に紛れて以下のような一文
があります。

内容 :IP=192.168.0.5(foo-bar-mona-giko)がおかしいよ。

「IP=」の後の<IPアドレス>はランダムに変わります。また()内のハイフンの
区切りについては、その数も値もランダムに変更するものとします。この中か
ら<IPアドレス>と()内の一つ目の項目(例の場合ならfooだけ)を抜き出して
copy.txtに出力する場合、どのような方法がありますか。出力時のフォーマット
はコンマ区切りです。

こんな感じです。
192.168.0.5,foo

自分なりに作ってみたんですけど、力不足でsedだけで何とかすることが出来
ず、苦肉の策としてawkを使ってしまいました。何かもっとスマートなやり方
があるような気がするのですが思いつきません。

grep '^内容' hogehoge.txt | sed -e 's/.*=\(.*\)(\(.*\)).*/\1,\2/' | awk -F'-' '{print $2}'> copy.txt

よろしくおねがいします。
635login:Penguin:2007/03/13(火) 09:25:17 ID:NP+i2vJc
perl -nle '/^内容:IP=([\d\.]+)\(([^\-]+)/ && print "$1,$2"' hogehoge.txt > copy.txt
636login:Penguin:2007/03/13(火) 13:20:46 ID:dcdSrFu2
>>634
awk -F '[=()-]' '{print $2 "," $3}' hogehoge.txt > copy.txt
637login:Penguin:2007/03/14(水) 01:40:54 ID:vdFheAbQ
>>635-636
「これでやる」と決めたらもう意地になってそれで通そうとするのが私の悪い癖ですね。
やっぱり意固地になっちゃ駄目ですね。

>>635
何もsedに拘る必要などはなく、perlで良かったんですね・・・。
そうすればもっと早く解決できたのかも知れません。
教えていただいたものの、正規表現は勉強になりました。
有難う御座います。

>>636
awkのこの使い方だと、デリミタに指定している文字が入る行全てに適用され
てしまうため、以下のようにするとうまく行きました。有難う御座います。
grep '^内容' hogehoge.txt awk -F '[=()-]' '{print $2 "," $3}' > copy.txt
638login:Penguin:2007/03/14(水) 05:11:36 ID:/GBkiaGW
bash.exeぐらいビスタ入れとけと思う。
639login:Penguin:2007/03/14(水) 05:37:07 ID:EOnMAlGF
シェル上からPCのMACアドレスを取得するにはどうしたらいいでしょうか?

#!/bin/sh
MAC=`ifconfig | grep eth0 | awk '{ print $4 }'`
echo "$MAC"

とかやれば一応出てきますが、eth0が有効になってないと
できないみたいなので、LANケーブルがささってない状態から
取得できる方法がないか探しています。
640login:Penguin:2007/03/14(水) 05:39:07 ID:uqh5+MR5
>>639
ifconfig eth0
641login:Penguin:2007/03/14(水) 05:56:43 ID:EOnMAlGF
いやそうじゃなくて…
642login:Penguin:2007/03/14(水) 06:25:15 ID:KrJXdLyy
dmesg | grep eth0 ならどう?
643login:Penguin:2007/03/14(水) 06:31:07 ID:EOnMAlGF
>>640
失礼しました、今確認したらLANケーブル繋がって無くても
ifconfig eth0でOKな様です。
でもダメな時があった様な…

>>642
dmesgにはMACアドレスは出てこないみたいなんですよね。
あの辺はデバドラが出してるんでしょうか。
eth0みたいな論理?デバイス名から取得するにはifconfigしかないのかな。
/proc配下探してもそれらしいのは無いし。
644login:Penguin:2007/03/14(水) 06:32:55 ID:l3YqpI0y
>>641
あってるだろ、やってみたのか?
645login:Penguin:2007/03/14(水) 06:38:46 ID:l3YqpI0y
>>643
そういうふうにやりたいなら cat /sys/class/net/eth0/address とか
ifconfig使った方がいいと思うけど
646login:Penguin:2007/03/14(水) 06:48:55 ID:EOnMAlGF
>>645
あ、たぶんそれです。
今2.6環境がないので/sys〜は試せませんけど、そういう事やりたかったのです。
ありがとうございました。
647login:Penguin:2007/03/14(水) 21:13:42 ID:GKPoWoKZ
>>638
なあ、おっちゃん。Windows mobileで動くbash.exeって無いかな?
648login:Penguin:2007/03/15(木) 05:29:51 ID:/H5IKm/o
awkやperlの前段で馬鹿の一つ覚えのようにgrepで絞り込んでる奴は池沼。
awkの基本構文 '//{ }'くらい覚えろ。
その上さらにgrep AAA | grep BBB とかgrepを多段接続してるやつはぬるぽ。
簡単な正規表現くらい覚えろ。
649login:Penguin:2007/03/15(木) 06:06:20 ID:lh1jvcnG
>>648
問題: grep AAA | grep BBB と等価なことをgrep一発で済ます正規表現を書いてみよう。
650login:Penguin:2007/03/15(木) 08:35:59 ID:mM6Oz18e
egrep 'AAA.*BBB|BBB.*AAA'

動作確認はしていない携帯なので
651login:Penguin:2007/03/15(木) 10:30:35 ID:zaZZgTcG
問題: grep AAA | grep BBB | grep CCC と等価なことをgrep一発で済ます正規表現を書いてみよう。

egrep 'AAA.*BBB.*CCC|AAA.*CCC.*BBB|BBB.*AAA.*CCC|BBB.*CCC.*AAA|CCC.*AAA.*BBB|CCC.*BBB.*AAA'
652login:Penguin:2007/03/15(木) 10:37:43 ID:AVM3TYSv
awk '/AAA/ && /BBB/ { print }'
awk '/AAA/ && /BBB/ && /CCC/ { print }'
653login:Penguin:2007/03/15(木) 11:14:02 ID:j9QZhZMZ
スクリプトって、人間性出るよね。

だからいい。
654login:Penguin:2007/03/15(木) 11:16:54 ID:LRqeft6l
grep -E [AB]{3} && kill `ps x | awk '{print $1}'`
655login:Penguin:2007/03/15(木) 11:21:54 ID:QboQ4vID
awk の pattern {action} で、action が print だけのときは {action} を省略できる。

awk '/AAA/&&/BBB/'
sed -n '/AAA/{/BBB/p;}'
656login:Penguin:2007/03/15(木) 11:22:42 ID:LRqeft6l
>>652が正解
657login:Penguin:2007/03/15(木) 11:49:36 ID:AVM3TYSv
省略できるの知らなかった
メモった
658login:Penguin:2007/03/15(木) 12:01:37 ID:hvylBZs+
>>652
すげー感動した。
俺は最近始めたばっかりだけどご多分に漏れずgrepの繰り返ししてた orz

>>655
更に感動した。

659login:Penguin:2007/03/15(木) 12:07:01 ID:3yceX1CJ
660login:Penguin:2007/03/15(木) 12:21:52 ID:bLhkgTOV
>>659 catで噴いたwww
661login:Penguin:2007/03/15(木) 15:54:25 ID:ZnxRwHjV
でもさあ、
grep AAA | grep BBB
の方が意図が伝わるしわかりやすいよね。
>>650以下は一週間ぐらいしたら忘れてそう。
略記法とか正規表現てバッドノウハウな気がするんだわ。
662login:Penguin:2007/03/15(木) 16:02:21 ID:fq2mANKU
>>661
grep AAA | grep BBB | grep CCC みたいにパイプパイプパイプなんてやると
巨大なファイル郡を処理させたときに、処理時間にとんでもない差がでる。

1プロセスでできる処理なら1プロセスでやったほうがいい場合もある。
663login:Penguin:2007/03/15(木) 16:52:57 ID:zaZZgTcG
>>661

 AAA なんとかかんとか BBB

だけが抽出対象の時は、正規表現なしのgrepの連結だけでどうやるの?
664login:Penguin:2007/03/15(木) 17:03:45 ID:Dz62NGII
パイプなんだから、1プロセスだろ。
665login:Penguin:2007/03/15(木) 17:07:24 ID:3yceX1CJ
>>664
どういう意味?
666login:Penguin:2007/03/15(木) 18:11:36 ID:d5mJrAII
>>663
grep  AAA |grep BBB
とか
意味取り違えている?
667login:Penguin:2007/03/15(木) 20:45:03 ID:yWYyWcjn
でもお舞ら、システムのブートスクリプトとか眺めてても、
「grepの多段パイプはけーん。書いた奴阿呆でーw」
とか言って、勝手にawkなんか使って書き換えるなよな。
668login:Penguin:2007/03/16(金) 00:06:55 ID:VW6b3qza
ま、パイプを増やすことによる負荷の増加は算術級数的にしか増えないが、
正規表現を増やすことによる負荷の増加は幾何級数的に増えるから、
何事もほどほどにな。
669login:Penguin:2007/03/16(金) 00:20:10 ID:AZ/Rsv/L
負荷を押さえた正規表現の指定ってのも重要。

awk使うくらいならruby呼ぶ。
670login:Penguin:2007/03/16(金) 00:38:26 ID:RidIExC4
if [ -d A* ] ; then rmdir A* ;fi

これだと A と AA がある場合のように A* に一致するものが複数あった時に
bash: [: A: binary operator expected
とエラーになるのですが
rmdir A AA を実行できるようにするには
[ -d A* ] の部分はどう書けばよいですか?
671login:Penguin:2007/03/16(金) 00:49:52 ID:tvCTgaGQ
>>670
for i in A*; do
[ -d "$i" ] && rmdir "$i"
done

空かどうかは見なくていいの?
672login:Penguin:2007/03/16(金) 00:52:20 ID:tvCTgaGQ
単にこれでもいいかも。
rmdir A* 2>/dev/null
673670:2007/03/16(金) 01:18:12 ID:RidIExC4
>>671-672
レスありがとうございます。
[ ] に渡す物が一個ずつになるように for でやってみます。

> 空かどうかは見なくていいの?
はい。大丈夫です。
674login:Penguin:2007/03/16(金) 05:36:28 ID:H7bTbCtv
rm -rf A*

じゃだめか?A*というファイルは消しちゃダメなの?
675login:Penguin:2007/03/16(金) 07:50:15 ID:ylLhCvWP
>>674
例ではAとされているが、実はその文字は . かも知れないじゃん。
676login:Penguin:2007/03/16(金) 07:58:15 ID:tvCTgaGQ
>>675
それは深読みしすぎでしょう。
677login:Penguin:2007/03/16(金) 16:37:18 ID:VcZCcuMK
awkで困っています。
スペース区切りで日付データが出力されるコマンド|awk '{print mktime("$1,$2,$3,$4,$5,$6")}'
とやってもmktimeの結果が−1と出力されてしまいます。
awkで分割した変数を組み込み関数の中で使うにはどうしたら良いのでしょうか?
678login:Penguin:2007/03/16(金) 17:28:00 ID:H7bTbCtv
>>677
echo '2007 03 01 10 10 11' | gawk '{print mktime($1" "$2" "$3" "$4" "$5" "$6)}'

でうまくいった。

echo '' | gawk '{print "$1 $2 $3 $4 $5 $6"}'

で調べたらわかったけど、awkはダブルクオーツの中身は変数展開してくれないみたいだな。
perlとチャンポンでやってると、混同しやすいな
679login:Penguin:2007/03/16(金) 17:38:38 ID:H7bTbCtv
>>677
ああ後mktimeはスペース区切りで日付が出力されるんじゃなくて、
スペース区切りのYMDHMを与えてエポック病に変換する関数みたいだぞ
680677:2007/03/16(金) 18:07:55 ID:VcZCcuMK
>>678
素早く的確な回答ありがとうございます!
助かりました。
きちんと動作する事を確認しました。
681login:Penguin:2007/03/16(金) 20:09:06 ID:MHjffA4d
>>680
echo '2007 03 01 10 10 11' | awk -F '_' '{print mktime($0);}'
682login:Penguin:2007/03/17(土) 08:15:03 ID:kZdD4YRT
【ITオワタ】2chを活用して大幅に開発効率をあげる日本のIT企業
http://news23.2ch.net/test/read.cgi/news/1174047192/
683login:Penguin:2007/03/19(月) 14:48:26 ID:IUKRR4N3
htmlのリンクをはずそうと思うのですが、

$ sed 's/<a href[^>]*>\([^<]*\)</a>/\1/g'
sed: -e 表現 #1, 文字数 30: unknown option to `s'

となります。
文字数30こえたらダメなのですか?
684login:Penguin:2007/03/19(月) 14:54:29 ID:IUKRR4N3
あ、わかりました。/ですね。失礼します。
685login:Penguin:2007/03/19(月) 17:21:57 ID:xynE05ZJ
これまた腐った日本語メッセージだなあ。
686login:Penguin:2007/03/20(火) 22:20:52 ID:OwvLXsox
リサイズ済みの同じサイズの画像が15あります。
その画像を 縦x横 3x5 で結合したいのです。
x x x x x
x x x x x
x x x x x
↑こんな感じにです。
順番はどんな順番でもかまいません。
これをコマンドラインでできませんか?
687login:Penguin:2007/03/20(火) 22:23:19 ID:kUce9Xll
convert とか ImageMagick のツールでできそう。
688login:Penguin:2007/03/20(火) 22:26:41 ID:GLNBvWq3
>>686
montage -tile 5x3
童貞大百科でも作るのか?
689login:Penguin:2007/03/20(火) 23:10:41 ID:OwvLXsox
>>688
ありがとうございます。
オプションとか使いこなせたら面白そうですね。
>童貞大百科でも作るのか?
そんな感じです。
いる部分だけ抜き出し、
まとめて1つの画像に残したいときに使わせてもらいます。
690login:Penguin:2007/03/26(月) 14:16:01 ID:4w79sb0R
質問させてください
Fortranのネームリストファイル(init.nml)からmax_Xとmax_Yの値を取り出し、
それをシェルスクリプトの変数(varXとvarY)へ代入して
gnuplotの描画範囲指定(xrangeとyrange)に用いるスクリプトを考えています。
awkでどのように書いたらいいのか教えてください。スクリプトは↓

awk '/???/{print;}' init.nml #*****←ここが分からない!*****
varX=??? #*****←ここが分からない!*****
varY=??? #*****←ここが分からない!*****
gnuplot << EOF
set terminal png
set output "$1img/${var2}.png"
set xlabel "X[m]"
set ylabel "Y[m]"
set xrange [0.0e0:${varX}]
set yrange [0.0e0:${varY}]
set title "Karman Vortex Street"
plot "$1/${var2}.dat" with vector
EOF
------------------------init.nmlの内容------------------------
 &karCar max_X = 2.0d0,
  max_Y = 2.0d0,
  div_a = 100,
  div_b = 100,/
691login:Penguin:2007/03/26(月) 14:36:26 ID:3JQLj/1k
>>690
var X で変数を定義するスクリプトって何?Pascal?
あと、$1と${var2}は何?シェルスクリプトの引数??
692login:Penguin:2007/03/26(月) 14:40:32 ID:4w79sb0R
すみません。行が足りなかったので消してしましました。↓です
#!/bin/sh
#awk '/&/{print;}' init.nml
#varX=
#varY=
for i in $1/*.dat
do
var1=${i:8} #Cut 8 letters at the begining of string
var2=${var1%.dat} #Cut ".dat"
gnuplot << EOF
set terminal png
set output "$1img/${var2}.png"
set xlabel "X[m]"
set ylabel "Y[m]"
set xrange [-0.10e0:2.1e0]
set yrange [-0.10e0:2.1e0]
set title "Karman Vortex Street"
plot "$1/${var2}.dat" with vector
EOF
convert $1img/${var2}.png $1img/${var2}.gif
rm $1img/${var2}.png -f
echo "["$i"] has drown."
done
693login:Penguin:2007/03/26(月) 14:44:57 ID:wX8v2Yz9
varX=`gawk '/max_X *= */ {sub("^.*max_X *= *",""); sub(",$",""); print}' init.nml`
varY=`gawk '/max_Y *= */ {sub("^.*max_Y *= *",""); sub(",$",""); print}' init.nml`
694login:Penguin:2007/03/26(月) 14:56:43 ID:wX8v2Yz9
>>693はinit.nmlの中身がダブってたりすると死ぬから、あくまでその場しのぎね。
ちゃんとやるなら、init.nmlを最後まで読み切ってからEND{}で一回だけ出力するとか
した方がいい。
あと.nmlファイルって知らんのだが、 max_X=2.0d0, max_Y=2.0d0, .... みたいな書き方されると、
これも死ぬ。perlなら

perl -nle '{/max_X\s*=\s*([^,]+)/ && print $1}' init.nml

とシンプルにいけるけど。
awkでも似たようなこと(マッチ&抽出)が出来たような覚えがあるが、漏れは(´・ω・`)
695690:2007/03/26(月) 15:17:36 ID:4w79sb0R
ありがとうございます!!こんなに早く返信があるとは思いませんでした。スゲ

ちなみに
gawk '/max_X *= */ {sub("^.*max_X *= *",""); sub(",$",""); print}' init.nml
は言葉でいうと
「『max_X』という言葉にマッチする行から、『max_X』と『,』を『』で消す」
という意味で良いのですか?

実際にやってみると二番目のsub()が効いていないのか、『,』が残ってしまいます。
むむむ...
696login:Penguin:2007/03/26(月) 15:25:32 ID:3JQLj/1k
awk -F'( = |,)' '/max_X/{print $2}' init.nml
697login:Penguin:2007/03/26(月) 15:30:36 ID:wX8v2Yz9
そりゃきっと、カンマの前後にスペースとかがついているんだな

gawk '/max_X *= */ {sub("^.*max_X *= *",""); sub(",.*$",""); print} ' init.nml

これでいけるはず。あとこれだと、行繋がりしていても正しく抽出できるだろう。
あと、ダブっていても最後のをひとつだけ抽出できるようにするなら、

gawk '/max_X *= */ {sub("^.*max_X *= *",""); sub(",.*$",""); v=$0} END{print v}' init.nml

あとはmax_Xの行がinit.nmになかった時の処理だが、このままだと/bin/shの側でsyntax errorで死ぬかも。
これは、sh側でチェックするしかない罠
698690:2007/03/26(月) 15:43:10 ID:4w79sb0R
perl -nle '{/max_X\s*=\s*([^,]+)/ && print $1}' init.nml
awk -F'( = |,)' '/max_X/{print $2}' init.nml
の両方でできました!ありがとうございます!!

フィールドセパレータを『=』か『,』にするという方法もあったのか。
699login:Penguin:2007/03/27(火) 15:13:21 ID:qCl9FI2v
頭の悪い俺に教えてくれ。

expectを使ってtelnetでログインして、コマンドを入力してやりたいんだが、
うまくいかないんだ。
例えばプロンプト$が出たときに、ls -lって打つようにやりたいんだけど
expect "$" ;
send "ls -l\r"
って、書いたらエラー吐き出して
$ expect: invalid option -- l
usage: expect [-div] [-c cmds] [[-f] cmdfile] [args]
って出ちゃうんだよな。

なんでorz
700login:Penguin:2007/03/27(火) 15:18:24 ID:EZkBcPNC
>>699
ssh ホスト名 'ls -l'
じゃだめなん?
701login:Penguin:2007/03/27(火) 15:50:58 ID:qCl9FI2v
>>700
最終的にファイルを作ってftpで送信してもらう、みたいな感じで
いろいろやりたいんだよな。
単体でlsとかだけならいけるんだけど、オプションつけるとなんかおかしくなる・・・。
702login:Penguin:2007/03/27(火) 15:56:15 ID:EZkBcPNC
>>701
その「いろいろ」を書いたスクリプトを向こうに置いときゃいいじゃん。
703login:Penguin:2007/03/28(水) 00:38:58 ID:HeDr0kdO
> expect "$" ;

これがまずいのでは。「$」を与えたいなら '$' で。
704login:Penguin:2007/03/29(木) 04:56:39 ID:gfauW22r
#!/bin/sh

#echo 'test'
LIST="list.url"

#URL="http://www.youtube.com/watch?v=9730SY-F8xE"
TMP="ahoaho"
BASEURL="http://youtube.com/get_video.php?"

while read LINE
do
if [ ! -e "$LINE" ]
then
URL="$LINE"
wget $URL -O $TMP
TTMP=$BASEURL`grep player2.swf $TMP | cut -d? -f2 | cut -d\" -f1`
NAME=`grep watch_fullscreen $TMP | cut -d\" -f4`

NNAME=`echo "$NAME"| sed -e "s/[^a-zA-Z0-9]//g"`

wget "$TTMP" -O temp.flv
ffmpeg -i temp.flv "$NNAME".avi < /dev/null
rm temp.flv
fi
done <"$LIST"

こんなん書いてみました。添削して下さい。
705login:Penguin:2007/03/29(木) 10:30:12 ID:Pt6e5Sbi
>>704
一部パクられた感じがするが…

テンポラリファイル名は固定しない方がいい。別々のファイルを拾うために、
同時に同一ディレクトリで複数のスクリプトを走らせたらどうなるか考えてみろ。

まあ>>529でも、同時に同一ファイルを拾いに行ったらおかしなことになるが…
706529:2007/03/29(木) 10:31:00 ID:Pt6e5Sbi
>>705を書いたのは>>529です。
707704:2007/03/29(木) 21:48:41 ID:gfauW22r
>>705-706
パクっちゃってすみません。ググって出てきたスクリプトを参考にしたら>>529のと同じようなスクリプトになってしまいました。
現状で
1)NNAMEでファイル名作っているのですが、ファイル名に使えない文字を省くための処理をしているのですが、
日本語のタイトルには使えないので、もっとスマートな方法を知りたいです。
2)ffmpegの行で< /dev/nullが無いとffmpegの処理が終わるとスクリプトが終了してしまう。
ためしに < /dev/nullを書いてみたら上手くいってしまったが、この動作について知りたいです。
708login:Penguin:2007/03/30(金) 13:33:20 ID:7K9+XkJ3
>>652
遅レスだけど

you は shock!
youはshock
you ha shock

みたいなのが検索対象のとき、どうするの?
709login:Penguin:2007/03/30(金) 13:37:52 ID:TjIXFywf
>>708
awk '/you *(は|ha) *shock/' you_ha_shock.txt
710login:Penguin:2007/03/30(金) 13:45:35 ID:IYfEQetc
>>708
>>709
grepの連結や、awkの&&では対処できない。「shockはyou」もマッチしてしまうからな
711login:Penguin:2007/03/30(金) 22:09:01 ID:MM+6SJ8s
>>710
連結する必要ないから。>>709で十分だから。
712login:Penguin:2007/03/31(土) 11:29:34 ID:H05pfK41
A
B \
C
D E \
F G \
H \

I

というファイルを \[改行] となっている箇所を結合したいんですが↓

A
B C
D E F G H
I

sed でどのように書けばうまく出来ますか?
713login:Penguin:2007/03/31(土) 12:06:07 ID:mbEWhniw
sed ':b;/\\$/{s/\\$//;N;s/\n//;bb}'

これでどうだろう。
714login:Penguin:2007/03/31(土) 18:38:55 ID:WWmuos7R
sedの質問です。

hoge
begin
fuga
end
geho

というデータがあった場合、begin..endで挟まれてるfugaを抜き出すのは
sedでどうやりますか?combineは知ってるのですが

sed -e '/begin/,/end/{/begin/d;/end/d;p}'

とパターンを2度書くダサい方法しか思いつけませんでした。

sed -e '/begin/,/end/{(1);(2);p}'

で(1)(2)でpattern space内の先頭「行」と終端「行」を切り落として
やるのが一番エレガントだと思うのですが、何か方法ないでしょうか?
715login:Penguin:2007/03/31(土) 21:33:55 ID:S5CQqyUG
>713
できました。ありがとうございます。
716login:Penguin:2007/03/31(土) 23:49:48 ID:ifE6Hzsr
大して、変わってないかも知れんけど、
sed -n -e "1,/begin/b;/end/q;p"
717login:Penguin:2007/04/01(日) 00:38:31 ID:CTvEh/g3
>>716
おーなるほど、bでスキップしてしまうのか。
パターン文字列が複雑なときは2回書くの手間なので、助かります。
まだまだsedを使いこなせてないなぁ>自分
718login:Penguin:2007/04/01(日) 08:34:29 ID:mqHVgu7l
>>712
sedなぞいらん。

(while read l; do
 echo "$l"
done) < file

でおk。
719login:Penguin:2007/04/02(月) 03:57:19 ID:rxqTL6+0
>>718
意味わからん
ちょっと説明してくれる?
720login:Penguin:2007/04/02(月) 08:11:11 ID:1+5A+Yoj
>>712
sedなぞいらん。cpp でおk。

…ホントかな。
721login:Penguin:2007/04/03(火) 22:28:25 ID:0APNSqPI
>>712-720

 v i で い い ん じ ゃ ね ?
722login:Penguin:2007/04/03(火) 23:15:37 ID:33EjDzRU
いいけど、このスレ的に駄目。
723login:Penguin:2007/04/04(水) 02:05:36 ID:8bqEa14S
関数で分からないことがあるので質問します。
指定したディレクトリに'.pid'という拡張子が附いたファイルが無ければNOと
表示し、個数を問わず存在すればexistと表示するスクリプトを作っているの
ですがうまく行きません。

OS:CentOS
シェル:bash

#!/bin/sh
PDIR=/home/test/pid
pid_count () {
local PIDCOUNT
PIDCOUNT=`ls $PDIR|grep '\.pid'`
[ x = x$PIDCOUNT ] && return 0
return 1
}

if [ pid_count ];then
echo 'no'
else
echo exist
fi

こんなんじゃ駄目ですか?
724login:Penguin:2007/04/04(水) 02:40:54 ID:upGN0x/T
grep -c
で、ヒット行数を出力させることができる。

また、ヒットする/しないだけでいいなら、出力じゃなくて終了コードで判断することも出来る。

if (ls $PDIR|grep '\.pid' >/dev/null 2>&1);then
echo exist
else
echo 'no'
fi
725login:Penguin:2007/04/04(水) 02:47:31 ID:upGN0x/T
ちなみに、
ls $PDIR|grep '\.pid'
の部分は
find -regex
を使う方がいいのかもしれんけど。
726login:Penguin:2007/04/04(水) 02:51:29 ID:8bqEa14S
>>724-725
ありがとうございます。
早速試してみます。

727723:2007/04/04(水) 03:15:49 ID:8bqEa14S
723です。

>>724-725
出来たよ!わあいわあい!
このようにしてうまく行きました。
ブラケットじゃなくて、パーレンで囲むんですね・・・
有難う御座いました。

pid_count () {
local PIDCOUNT
PIDCOUNT=`ls $PDIR|grep -c '\.pid'`
return $PIDCOUNT
}

if (pid_count);then
echo 'exist'
else
echo 'no'
fi
728login:Penguin:2007/04/04(水) 04:52:56 ID:upGN0x/T
>>727
いやいや、自分で言うのもなんだけど、( )でくくったのは全く意味がない。
なしでいいよ。
729login:Penguin:2007/04/04(水) 15:47:07 ID:h7ydsGVi
簡単なシェルスクリプトを作りたいのですが、
どうしても初心者1歩目の私には構成の仕方が思いつかないので下記の文章を簡単に作って頂いて自分なりに文章の構成の仕方を覚えたいのですが、どなたか行っていただける方おりましたら宜しくお願いします。


【fileA】に【/home/etc】の内容を書き写す。
↑のfileAをcrontabで時間指定して行うというような作業を最終的にしたいのですが
crontab -eの使い方は分かるのですが、上に記載したシェルスクリプトの構成がわかりません。

宜しくお願いします。
730login:Penguin:2007/04/04(水) 16:02:53 ID:fvQmhDmg
>>729
やりたいことがいまいちよくわからんが
cp /home/etc fileA
ってこと?
cron から呼ぶなら
先に cd しておくか
fileA はフルパスで書いた方がいいよ。
731login:Penguin:2007/04/04(水) 16:18:05 ID:8yE08Ir4
>>729
ls -a /home/etc > fileA
ってことか?
732login:Penguin:2007/04/04(水) 16:19:50 ID:h7ydsGVi
>>730 迅速なレスありがとうございます!

ちょっと自分でも理解できいるのがどの程度なのかわからず自分自身も頭を抱えているのですが
実際に細かいやりたい事をいわせて頂くと

AというファイルをBというファイルに週一(数値は適当で)バックアップするcronを作ってみたいというのが正確な言い方なのかもしれません;;

朝からテキスト等を見てチョコチョコ考えてみてるのですが定義の仕方やコマンドの書き方が頭の中でゴチャゴチャで煮詰まってしまいました。


もし>>730様のcp /home/etc fileA を直接cronに時間指定に後に打つとコマンドは有効なのでしょうか?
自分の中では【* * * * * cp /home/etc fileA】で *****(時間のとき)fileAに/home/etcの内容を書き写す。という解釈になっているのですがこれは間違いでしょうか?

733729:2007/04/04(水) 16:21:27 ID:h7ydsGVi
すみません>>731様もありがとうございます;;
考えながら書いていてトロクテ申し訳ありませんが皆様お力を貸していただけたら宜しくお願いします。
734login:Penguin:2007/04/04(水) 16:25:52 ID:fvQmhDmg
>>732
「* * * * *」はもちろん必要。
でもそれはシェルスクリプトの話ではない。

もうちっと自分で調べたり試したりしてから質問しに来なよ。
735login:Penguin:2007/04/04(水) 16:36:40 ID:k+6C2L7p
なんで ID:h7ydsGVi は

linux総合初心者スレッド
http://pc11.2ch.net/test/read.cgi/linux/1166206183/808-

でのやり取りをわざわざ隠すんだろう……
736login:Penguin:2007/04/04(水) 16:37:00 ID:f9uH4ju1
737login:Penguin:2007/04/04(水) 16:40:11 ID:fvQmhDmg
なんだ、マルチか。
738login:Penguin:2007/04/04(水) 16:48:51 ID:k+6C2L7p
マルチっちゅうか、 ID:h7ydsGVi はまるっきり逆なんだよな、訊く場所と内容が
739login:Penguin:2007/04/05(木) 02:00:36 ID:tW/x3cMg
cshで1行づつ読み込んで処理を行いたいのですが、
下記のソースでは行内にスペースが入っていると期待する結果になりません。
良い方法があれば教えて頂けないでしょうか。
宜しくお願い致します。

foreach line (`cat input.txt`)
【$lineに対して行単位の処理】
end
740login:Penguin:2007/04/05(木) 09:13:44 ID:DrC+Ex0I
foreach line ( "`cat /etc/hosts`" )
 echo "[$line]"
end
741739:2007/04/06(金) 00:52:17 ID:6RGj1rOS
>>740
早速のレスに感謝です!
今日の仕事を無事に終えることが出来ました。
m(_ _)m
742login:Penguin:2007/04/06(金) 08:02:13 ID:fNWyAXso
>>741
遅くまで大変だなww
743login:Penguin:2007/04/08(日) 16:00:59 ID:yBTNwZ2a
便乗です。

shだったらどうやるのでしょう。

うまくいかないので、こうする?
while read line
do
 echo $line
done < /etc/hosts
744login:Penguin:2007/04/08(日) 16:54:34 ID:FgPsXoOH
>>743
ベター
745login:Penguin:2007/04/08(日) 20:54:29 ID:yBTNwZ2a
>>744

そーいわずに。。。forを使いたいのです(ただの興味なんですが)。

こういうスクリプトならうまくいきそうです。
#!/bin/sh

ORGIFS=$IFS
IFS='
'
for i in `cat /etc/hosts`
do
echo $i
# echo aaaaa
done
IFS=$ORGIFS

あんまりキレイじゃないですね。
746login:Penguin:2007/04/08(日) 21:00:11 ID:FgPsXoOH
>>745
それ雅にぶんだんされるパターン
747login:Penguin:2007/04/11(水) 02:51:11 ID:6zJ/wfDs
>>745
foreach line ( "`cat /etc/hosts`" )
 echo "[$line]"
end

もそうだけど、ファイルを読み込んで、一旦配列(メモリ)に読み込むから。
748739:2007/04/12(木) 02:15:39 ID:VOD0EPIg
先日はありがとうございました。
また質問させてください。

cshで複数の処理をバックグラウンドで起動してwaitで待ち受けた後、
個々が正常終了か異常終了かを判別するにはどうすれば良いでしょうか?


#!/usr/bin/csh

./a.csh &
./b.csh &
./c.csh &
wait

exit【a,b,cがすべて正常なら0、それ以外なら1を返したい】
749login:Penguin:2007/04/12(木) 19:49:52 ID:B35LOPtm
細かい事を聞かせてください。
このスレを [/bin/sh]で抽出してみたのですが、皆さんシェルスクリプトの一行目
#!bin/sh
#bin/sh
と二通りの方がいらっしゃいます。どちらが正解なのでしょうか?
確かCGI等では
#!/usr/local/bin/perl
って書いてたような。
750login:Penguin:2007/04/12(木) 19:56:18 ID:8tcwdaq1
細かいことを言えばどちらも違う。#!/bin/sh だw
まあ ! が抜けてるのは単に忘れてるだけだろ。
751login:Penguin:2007/04/12(木) 20:04:11 ID:srakSzLq
>>749
スクリプトの一行目の#!はそのスクリプトがどのコマンドによって実行されるかを
記述するための仕掛けです。
正しくは #! /bin/sh とスペースも入りますが、最近はそうしないと正しく動作しない
シェルを使ってる人はいないでしょう。

#!/bin/sh ならば二行目以降を/bin/shの標準入力に流し込みます。
#!/usr/local/bin/perl ならば二行目以降を/usr/local/bin/perlの標準入力に流し込みます。

ちなみに追加オプションとかも記述することができます。 (例: #!/bin/sh -v)
752login:Penguin:2007/04/12(木) 21:42:18 ID:B35LOPtm
うひょー、お二人ともありがとうございます。
なんて親切なんだ。

という事で、私は今後シェルスクリプト書くときは
#! /bin/sh
って書くようにします。
動くといってもやっぱりなるべく正しく書きたいのが日本人ってもんです。
753login:Penguin:2007/04/12(木) 21:50:11 ID:Mn3sDzWa
何かの寸劇みたいな締め方だなw
754login:Penguin:2007/04/12(木) 23:02:01 ID:G4YqmW8y
>>748
% cat a.csh
#!/bin/csh

sleep 2
exit 1
----------------------------
% cat test.csh
#!/bin/csh

./a.csh
echo '$status='$status

./a.csh &
wait
echo '$status='$status
----------------------------
% test.csh
$status=1
[1] 1945
[1] 1で終了しました ./a.csh
$status=0
%

・・・という具合に、バックグラウンド起動なしなら$statusにexitコードは入るが、
裏に回すと、単にwaitの実行結果(wait成功?)としての0しかとれないみたいだな。
「[1] 1で終了しました ./a.csh」とかいうメッセージを無理やり拾ってここからexitコードを
取り出すか、さもなくばファイルかなんかでやりとりするしかないんじゃないのかな?
755login:Penguin:2007/04/12(木) 23:44:51 ID:478yYjXe
bashなら...

#!/bin/bash

./a.sh &
pida=$!
./b.sh &
pidb=$!
./c.sh &
pidc=$!

wait $pida
exitcodea=$?
wait $pidb
exitcodeb=$?
wait $pidc
exitcodec=$?

if [ $exitcodea == 0 -a exitcodeb == 0 -a $exitcodec == 0 ]; then
exit 0
else
exit 1
fi
756login:Penguin:2007/04/13(金) 01:06:06 ID:PX922Nw1
>#!/bin/sh ならば二行目以降を/bin/shの標準入力に流し込みます。

違う。
スクリプトファイル名自体を引数にして1行目に書かれたコマンドを実行する。
だから、標準入力を受けつけないコマンドでも使えるし、
コメントが # でないスクリプト言語では使えない。
逆に、コメントが # でありさえすればスクリプト言語でなくても使える。

たとえば、logrotate の設定ファイルの1行目に #!/usr/sbin/logrotate と書いて
chmod +x しておけば、その設定ファイル自体がログをまわすための実行コマンドとして
使えるようになる。
757login:Penguin:2007/04/13(金) 01:49:38 ID:hedxuKWX
>>751
インタプリタを呼ぶのはシェルではなくてカーネルの仕事だ。
それにスペースを入れたらむしろ動かないことがある。
スペースを入れないのが無難だ。
758login:Penguin:2007/04/13(金) 07:10:23 ID:I9CXZd1n
~/.bash_history から cd か pushd の引数になっているディレクトリを
抜き出して、個数に従って降順に並べて出力させようとしています。
今のところ下記のようにしていますが、もっと簡潔でしかも高速にできる
方法はないでしょうか?

awk '/^(cd|pushd) [^\.]/ {print $2}' ~/.bash_history | sed -e 's/^~/echo $HOME/e' -e 's/\\//g' -e 's/\/$//' | sort | uniq -c | sort -k 1r,1 | awk '{print $2}'
759login:Penguin:2007/04/13(金) 10:46:44 ID:3QVN0/8o
>>758
実行時のカレントディレクトリを考慮していないという欠陥があるように
思えるんだけど、いいの?
760login:Penguin:2007/04/13(金) 10:50:38 ID:Sjsittfs
>>758
ls; cd hoge とか cd ~taro とかはいいのかな。

>>759
~/.bash_history からだと無理じゃない?
761login:Penguin:2007/04/13(金) 12:39:20 ID:I9CXZd1n
>>759
ご指摘ありがとうございます。
.(ピリオド)を使った相対パス指定については最初のパターンにある[^\.]で
除外しています。
762login:Penguin:2007/04/13(金) 12:44:13 ID:I9CXZd1n
>>760
> ls; cd hoge とか cd ~taro とかはいいのかな。
ご指摘ありがとうございます。

前者の方は手間がかかりそうだし遅くなりそうなので、今後の課題にさせて
いただきます。

後者の方は、
-e 's/^~/echo $HOME/e'
→ -e 's/^~\//echo $HOME\//e'
と変更してみます。
763login:Penguin:2007/04/13(金) 18:19:25 ID:TzWtW2Kz
perl -e 'map { /(cd|pushd) ([^\.].+)/ && $cnt{$2}++} grep{s/~/$ENV{HOME}/ ||1 } <>; map {s/^\d+#//;print $_,"\n"} reverse sort grep {$_="$cnt{$_}#$_"} keys %cnt;' .bash_history

ちと無理があるな...
764login:Penguin:2007/04/13(金) 18:23:32 ID:Sjsittfs
パス名展開は sed にやらせたくないな。
なんとかシェルにやらせられないかねぇ。
765login:Penguin:2007/04/13(金) 18:51:02 ID:PX922Nw1
awk '/^(cd|pushd)/&&$2!~/^\./{print $2}' .bash_history | xargs -i sh -c 'eval echo {}' | sort | uniq -c | sort -nr | cut -b9-
766login:Penguin:2007/04/13(金) 19:05:55 ID:JaXddgkw
awk -v h=$HOME '
/^(cd|pushd)/{sub(/^~/,h,$2);a[$2]++}
END{for(dir in a) print a[dir],dir}
' ~/.bash_history | sort -nr | awk '{print $2}'

なんかスマートじゃないな…
767login:Penguin:2007/04/13(金) 19:17:00 ID:CeIWV8n2
1 ディレクトリ名をキーにしてヒストグラムを作る
2 "度数 ディレクトリ名"形式で出力して、ソート
3 頭の数字を取り去る

何でやっても、大体こんな感じ?
768login:Penguin:2007/04/13(金) 19:53:48 ID:3QVN0/8o
>>761
それじゃダメだろ。
769758:2007/04/13(金) 21:46:07 ID:I9CXZd1n
みなさん、たいへんありがとうございます。

>>766さんのスクリプトが桁違いに高速なので使わせていただきます。
awkすごいですね。シェルスクリプトを作るなら勉強しないといかん
と思いました。

ただし、フィールドを使うと、空白の入ったディレクトリ名に対応できない
ことに気付いたので、とりあえず以下のようにしました(長すぎる行がある
と怒られたので適当に改行を入れてます)。

awk -v h="$HOME/" '/^(cd|pushd) [^\.]/{sub(/^(cd|pushd) /,"",$0);
sub(/^~\//,h,$0);sub(/\/$/,"",$0);gsub(/\\/,"",$0);a[$0]++}
END{for(dir in a) print a[dir],dir}' ~/.bash_history
| sort -nr | awk '{sub(/^[^\/]+/,"",$0);print $0}'
770758:2007/04/13(金) 22:20:19 ID:I9CXZd1n
>>768
すいません。どこがだめなのかわからないので宜しければ教えてください。
771758:2007/04/13(金) 22:30:37 ID:I9CXZd1n
.bash_historyから抽出したディレクトリの使い道はいろいろあると
思いますが、いちおう、どのように使おうとしているのかネタばらしを
しておきます。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3814.txt

基本的には、まめFileというWinのファイル管理ソフトにある
「登録フォルダジャンプ」機能のコンソール版です。

「登録フォルダジャンプ」というのは、フォルダとショートカットキーを
登録しておくと、jキーでその一覧が表示されて、ショートカットキーを
押すとカレントフォルダが切り替わります。
これと、ほぼ同じ事をbashの関数でやってみました。
772login:Penguin:2007/04/13(金) 22:43:15 ID:hedxuKWX
cd するごとにディレクトリを記録しておけばいいんじゃないのか
773758:2007/04/13(金) 22:55:19 ID:I9CXZd1n
>>772
なるほど。
それは、つまりcdコマンドのラッパーを作るということですね。
774login:Penguin:2007/04/13(金) 23:45:04 ID:hedxuKWX
zsh では chpwd を定義しておけば、その都度実行してくれるけど、
bash に似たような仕組みがなければそういうことになるかな。
775login:Penguin:2007/04/13(金) 23:49:27 ID:i8w2Wq8L
>>770
相対パスがドットでいつも始まるわけでじゃないから。

/aaa/
に居て
cd bbb
したら
/aaa/bbb/
に行く
776login:Penguin:2007/04/14(土) 07:54:06 ID:g8Mqkjvf
質問させてください。
以下のように、test-serverへ接続し、
date;hostname;whoamiを実行するスクリプトを書いてます。
date;hostname;whoamiの結果をリダイレクトし、
スクリプト本体があるサーバに保存したいのですが、
その場合、どう記述すれば良いでしょうか。

#/bin/bash
HOST=test-server
UNAME=root
PASSWD=***

expect -c "
set timeout 20
spawn telnet $HOST
expect login:\ ; send \"$UNAME\r\"
expect sword:\ ; send \"$PASSWD\r\"
expect \"$\" ; send \"ls\r\"
expect \"$\" ; send \"date;hostname;whoami\r\"
expect \"$\" ; send \"exit\r\"
777758:2007/04/14(土) 08:13:25 ID:ZyZ9VcbW
>>775
そのパターンもありましたね。うっかりしちょりました。
ご指摘ありがとうございます。

ということで修正しました。
awk -v h="$HOME/" '/^(cd|pushd) ~*\//{sub(/^(cd|pushd) /,"",$0);
sub(/^~\//,h,$0);sub(/\/$/,"",$0);gsub(/\\/,"",$0);a[$0]++}
END{for(dir in a) print a[dir],dir}' ~/.bash_history | sort -nr
| awk '{sub(/^[^\/]+/,"",$0);print $0}'
778login:Penguin:2007/04/14(土) 08:39:33 ID:BiYQHwK9
>>776

expectで関数を流し込むのはどうだい?

function myfunc(){
date
hostname
whoami
}

myfunc > a.txt
779login:Penguin:2007/04/14(土) 09:48:47 ID:hRvEgtMX
>>776
ssh じゃだめなん?
780login:Penguin:2007/04/19(木) 22:56:37 ID:LylKK0i9
sed -i みたいに awk でファイルを書き換えるオプションはありますか?
781login:Penguin:2007/04/23(月) 15:49:23 ID:hBglBe+9
Perl で書かれた CGI が生成する掲示板などの log ファイル(タブ区切りテキスト)から、
最新の一行だけを抜き出して、ページ内の任意の場所に貼り込むための簡単なスクリプトを書こうと思っています。
基本的には tail か head(元の CGI の作法によってどちらを使うかが決まる)を使って、
該当の一行を抜き出せばいい、というのはわかるのですが、
ここから、必要なカラムだけを取り出すにはどうすればいいのでしょうか?
例えばこのログファイルのフォーマットが
番号<TAB>日付<TAB>タイトル<TAB>本文<TAB>ホスト
となっているとして、本文だけを抜き出したい、というような場合です。
どなたか教えていただけませんでしょうか。よろしくお願いいたします。
782login:Penguin:2007/04/23(月) 15:52:02 ID:0g+Cr4Ks
>>781
cut とか awk とか。
783login:Penguin:2007/04/23(月) 16:20:15 ID:hBglBe+9
>>782
head に cut を合わせて、目的通りのツールを作ることができました。
ありがとうございました。
784login:Penguin:2007/04/28(土) 18:08:54 ID:dVJfq2VA
ハードウェアを認識した時に何かシェルスクリプトが走る
ハードウェアの認識を失った時にも何かシェルスクリプトが走る

プリンタの場合は /etc/init.d/cupsys ファイルが認識した時に走る
では認識を失った時にはどこのファイルが走る?
785login:Penguin:2007/04/29(日) 23:02:38 ID:OJVMkdP+
>>784
なんだ?埋蔵金の暗号化?
786784:2007/04/29(日) 23:19:16 ID:SbkIGRrk
>>785
いや、マジで質問しているんだけど。。。

プリンタを認識したり認識解除したりすると、/etc/samba/smb.confファイルが
勝手に書き換えられる(I-O DataのLANDISKをハックして使っているから)
問題に対処する為に、認識した時に自分で作った設定ファイルを上書きコピーする
ように出来たのはいいんだけど、認識解除した時にまた勝手に書き換えられるから
それにも対処したいんだけど、認識解除した時にどこのシェルスクリプトファイルが走っている
のか分からなくて困っているから質問しています。
787login:Penguin:2007/04/29(日) 23:28:50 ID:OJVMkdP+
>>786
udevのルールじゃね?
788784:2007/04/30(月) 00:43:14 ID:rs45s6UC
>>787
ん?udevのルールとは?
udev ルール プリンタ等で検索して調べましたが
/dev/hda とか /dev/sda とか、そういう命名規則を設定する?ソフト?みたいな
感じに書かれてありましたが、よくわかりません。
出来れば詳細をお願いできませんか?
789login:Penguin:2007/04/30(月) 00:52:21 ID:2ShUYUmR
よくわかんないけどオートマウンタみたいなハードウェア用の
デーモンが動いててそれがやってんじゃないの?
790login:Penguin:2007/04/30(月) 01:07:07 ID:mVE0ZpDc
>>788
スレ違いだよ。
791login:Penguin:2007/04/30(月) 02:09:50 ID:81n6LnY7
>>786
smb.confの所有者書き換えたらなんとかなるんじゃないの
792784:2007/04/30(月) 02:27:52 ID:rs45s6UC
>>791
landisk:~# ls -l /etc/samba/smb.conf
-rw-r--r-- 1 root root 1524 2007-04-29 22:27 /etc/samba/smb.conf
landisk:~#

どう所有者を書き換えろと・・・OTL
793login:Penguin:2007/04/30(月) 11:03:28 ID:bBqUiCik
>>792
chown
794784:2007/04/30(月) 13:27:07 ID:rs45s6UC
>>793
いや、だから、既にrootだから、システム側はroot権限のファイルすらも書き換えちゃう
って事ですよ?なので一般ユーザ等に変更しても書き換えは防げ無いでしょ。
chmod 555 とかやってもroot権限で書き換えられてるようだから効果ないよね
モキュ・・・・・。

シェルスクリプトでなんとかならんものか・・・・OTL
795login:Penguin:2007/04/30(月) 17:31:53 ID:bBqUiCik
>>794

LANDISKか白箱スレ行きゃ速効答えが出ると思うが。。。

んで、ハックって何をどうする事よと。
796784:2007/04/30(月) 18:30:11 ID:rs45s6UC
>>795
LANDISK Hacking Diary
http://landisk.kororo.jp/index.php

いや、LANDISKスレがまず存在しない。
白箱スレでも聞いてみたけど、解決策が見つかってない。
だから、直接的な対処法は(今のところ)ないので、
ココは一つシェルスクリプトでなんとかならないものかと・・・。
797login:Penguin:2007/04/30(月) 19:17:28 ID:K+8FTn35
ハードウェア版にスレあるじゃん。
ファイルシステムが ext2 系なら chattr +i で書き込み不可にできるが。
798login:Penguin:2007/04/30(月) 19:29:30 ID:t6CSDljD
実行されるものがシェルスクリプトということなら、
一時的にシェルを置き換えてみたら?
スクリプトを与えられて実行したときにその名前をどっかに記録するようなもの
で置き換えて試せばどうかな。もっと賢い方法もあるかも知れないけど。

それにしても根本的な設定ファイルを無断で書き換えるって、
それはLANDISKとやらがそういう作りになっているの?
まあI/Oデータ以外の人がいじることは考えていないからだろうけど、
随分と嫌な動作をするように作ってあるんだねぇ。

smbcontrol -s <プリンタ部分だけ変えたもの> smbd reload-config
とかで目的は果たせないものかな。
799login:Penguin:2007/04/30(月) 20:01:04 ID:bBqUiCik
>>798
なんも知らんならshut up
800784:2007/04/30(月) 21:18:41 ID:rs45s6UC
>>797
おお、chattrで変更を拒否ですか!それは凄い。。。設定してみます!ありがとうございます!
しかしそこまでIO Dataが読んでたら、
#! /bin/sh
chattr -i /etc/samba/smb.conf
とかその勝手に書き換えるシェルスクリプトに書いてたりして。もしそうだったら意味がない。
でも試してみます!

>>798
どうもありがとうございます。シェルを置き換えるとかそんな事は出来ませんが
smbcontrol -s からのコマンドラインで、/etc/samba/smb.confじゃなくて、他のファイル
をSambaの設定ファイルにしてしまう事が出来るんですよね?
これはこのコマンドを1度実行して、再起動しても恒久的に変更が反映されますか?
それとも起動時に毎回実行する必要がありますか?

今2つ希望が見えました。とにかく検証してみます。本当にどうもありがとうございます。
801login:Penguin:2007/05/11(金) 23:40:23 ID:MlLhGdKj
mv abc def
をしたら、
symlink -> abc

symlink -> def
に変えるスクリプトを、出来るもんなら作ってみろ
802login:Penguin:2007/05/11(金) 23:49:56 ID:zJL2J+QP
mv $1 $2
ln -sf $2 symlink
803login:Penguin:2007/05/12(土) 01:28:50 ID:WM2vXwVI
いけず
804login:Penguin:2007/05/13(日) 17:14:04 ID:5BVOAs1P
KENT-WEB からもらってきて改造して使ってる perl の CGI で生成される掲示板の log ファイルから、
最新の記事一つを抜き出す簡単なスクリプトを作り、html に埋め込んでいます。
そのスクリプトは以下のような具合です。
#! /bin/sh
head -n 1 /var/www/html/ore/bbs/bbs.log | cut -f 6
bbs.log ファイルの中で、6番目のカラムが記事の本文が格納されたカラムです。
このままですと、記事全文が抜き出されてしまうのですが、文頭から文字数指定で、
例えば100文字のみ抜き出し、などというのはどう表現するのでしょうか?
805login:Penguin:2007/05/13(日) 18:03:57 ID:TqLMWZw4
head -c 200
806login:Penguin:2007/05/14(月) 11:08:32 ID:NThbdS06
>>805
それだと200バイト目で2バイト文字がぶった切られるケースもあるんじゃないの?
807login:Penguin:2007/05/21(月) 20:59:01 ID:2u4XJWmb
echo 'あいうえお' | head -c 5 moge | iconv -f euc-jp -t euc-jp 2> /dev/null | od -tx1

まぁ文字といってるからには200バイトではないんだろうが。
808login:Penguin:2007/05/25(金) 19:47:19 ID:hXeVc9hi
すみません、スクリプト中で自分がバックグラウンドで動いているかどうか判定したくて
jobsを使おうかと思ったのですがjobsは呼び出したプロセスの子しか判定しないみたいで自分の状態が取得できません。
何か自分がバックグラウンドで動作してるかどうか調べる方法はないでしょうか?
809login:Penguin:2007/05/25(金) 20:41:09 ID:HxArb6S/
バックグラウンドかフォアグラウンドかというのは OS ではなくて
シェルが管理しているものなので、どういう状態かを知っているのは
スクリプトを呼びだしたシェルだけ。呼び出された側から知るのは不可能。
810login:Penguin:2007/05/25(金) 21:27:58 ID:b5XpGaTM
>>809
完璧ではないがNICE値で判断するっていう手もある。
バックグラウンド走らせたプロセスは大抵そのシェルよりNICE値が大きくなるから。
811login:Penguin:2007/05/25(金) 23:27:08 ID:x0ZSh3MY
>>809
なるほどやはりそうでしたか。
状態で処理を変えるような設計自体悪い気がするので別な方法を考えてみます。

>>810
バックグラウンドで行うとシグナルを出すコマンドを使って判定しようかとも思いましたが
bg->fgにした際の判定等色々な問題でやめました。
そこまでするぐらいならやはり別な仕様にした方が良そうですし。

どうもありがとうございました。
812login:Penguin:2007/05/27(日) 01:15:39 ID:iy/W+ZYZ
猫バトン用フィルターを作ってみにょ。
>『猫バトン』
>○これが回ってきたら次に書く日記の語尾すべてに「にゃ」「にゃん」「にゃー」等をつけにゃくてはにゃらにゃい。
>○「な、ぬ」も「にゃ、にゅ」にすること。
>○一人称は必ず「我輩」にすること。
813login:Penguin:2007/05/27(日) 17:51:45 ID:9zzml0ow
ユーザ毎のメモリ消費量を表示させたいのですが
いい方法はないでしょうか?
814login:Penguin:2007/05/27(日) 20:49:13 ID:eoDqPsS+
共有ライブラリなんかは、複数のユーザやプロセスで
共有されと思うんで、実際に正しい使用量を把握するのは
難しいと思われ。
815login:Penguin:2007/05/28(月) 01:26:46 ID:djvYxPmr
質問します。

lsnrctl<<EOF
set log_file listener.tmp
exit
EOF
RET=$?
if [ $RET -ne 0 ];then
logger -t tagtag -p local1.notice "切り替えに失敗しました"
  exit 1
fi

とエラーが出たときにSYSLOGにメッセージを表示させ
異常終了させたいのですが、どうもエラーがでてしまい
うまく動きません。
何か対処法はありますでしょうか?
816login:Penguin:2007/05/28(月) 03:42:59 ID:FxYAEuV2
>>813
top -b -n 1
を加工するとか。
817813:2007/05/29(火) 16:06:22 ID:qaFgFmD3
>>814
なるほど、その通りですね

>>816
今期はこれで十分です
これ使えば簡単ですね。

ありがとう
818login:Penguin:2007/05/30(水) 02:12:31 ID:AYm36Ukn
Makefileを作成中なのですが、ディレクトリの移動方法が分かりません。

cd /usr/lib
pwd

としても、現在のカレントディレクトリのパスが表示されてしまいます。

make.shを作成して

cd /usr/lib
pwd

を書いておくと、こっちのほうでは成功するのですが・・・
819login:Penguin:2007/05/30(水) 02:21:44 ID:RGDzaFns
cd /usr/lib; pwd
820login:Penguin:2007/06/06(水) 05:52:24 ID:fCNnCefX
>>818
Makefileは確か、コマンド記述した行の一行一行ごとにシェルを起動して、その中で
コマンド実行する。だからcdとかsetenvするなら一行にまとめて書く必要がある
821login:Penguin:2007/06/06(水) 23:19:54 ID:fCNnCefX
>>815
エラーの内容は?誰が出してるの?リスナー?ロガー?それともシェル自身?
822login:Penguin:2007/06/07(木) 17:09:18 ID:SgVASGqq
パーミッション755 のホームディレクトリを
700へ強制変更したい場合、
どのようにすればよいでしょうか?
823login:Penguin:2007/06/07(木) 17:20:56 ID:3hQir80J
>>822
chmod 700 ~
824822:2007/06/07(木) 18:54:10 ID:SgVASGqq
説明不足でした、755のパーミッションである
ディレクトリ「のみ」を変更したいです。
825login:Penguin:2007/06/07(木) 18:56:13 ID:3hQir80J
>>824
find ~ -maxdepth 0 -perm 755 -exec chmod 700 {} \;
826login:Penguin:2007/06/07(木) 22:14:28 ID:5ykPAG4k
>>825
それだったら、755の実行ファイルも700にならないか?

find ~ -maxdepth 0 -perm 755 -type d -exec chmod 700 {} \;
827login:Penguin:2007/06/07(木) 22:20:26 ID:3hQir80J
>>826
-maxdepth 0 だから対象は ~ だけだよ。
828login:Penguin:2007/06/08(金) 08:01:26 ID:rwSnAhXD
>>823>>825って結局同じじゃない?

829login:Penguin:2007/06/08(金) 11:06:22 ID:fx8u/6Qg
>>828
違うよ。
830login:Penguin:2007/06/09(土) 00:18:40 ID:F+RMa82W
>>823はディレクトリ(入れ物)のパーミッション変更
>>825はディレクトリからfindした一個一個のファイルディレクトリのパーミッション変更
831login:Penguin:2007/06/09(土) 00:28:40 ID:/KgsYWdR
>>830
>>827

find ~ -maxdepth 0 してみ。
832login:Penguin:2007/06/09(土) 06:14:33 ID:F+RMa82W
>>831
見落としたwwww
違いはファイルかディレクトリかではなくて、 -perm 755が入っているかどうかの部分か
833login:Penguin:2007/06/09(土) 12:03:08 ID:Wj5lTAcX
-maxdepth 0
だから、~のみしか変更されないから
chmod 700 ~
と同じで合ってるよね?
834login:Penguin:2007/06/09(土) 12:09:55 ID:/KgsYWdR
>>833
-perm 755
835login:Penguin:2007/06/13(水) 22:10:59 ID:cYyJ3pdD
ファイルの先頭2行分を削除したいんですが、
sedでできますか?
836login:Penguin:2007/06/13(水) 22:57:55 ID:1QPMUNje
>>835
awk で良ければ awk '(NR>2')' FILE
837login:Penguin:2007/06/13(水) 23:04:14 ID:w6ikWAzT
>>835
sed 1,2d
838login:Penguin:2007/06/13(水) 23:10:04 ID:1QPMUNje
>>835
836はセミコロンが一つ多かった・・

あと、いきなりFILEを変更したいなら
perl -pi -e 'undef $_ if($.<=2)' FILE
839login:Penguin:2007/06/13(水) 23:30:29 ID:w6ikWAzT
sed -i 1,2d FILE
840login:Penguin:2007/06/13(水) 23:34:18 ID:9rgdgTlQ
先頭を削除ならsed単独でいいけど、
後ろになると、sed単独では無理かな?
841login:Penguin:2007/06/13(水) 23:49:06 ID:w6ikWAzT
>>840
2行でいいなら sed '$d' | sed '$d' で。
842login:Penguin:2007/06/13(水) 23:55:59 ID:cYyJ3pdD
>>836-840
ありがとうございます。
sed、awk、perlと使いこなせれば凄い便利ですね。
勉強します。m(_ _)m
843login:Penguin:2007/06/14(木) 10:08:15 ID:uXd+maMU
>>840
できるよ。hold spaceを直前N行を保持するキューとして使う。
たとえば末尾3行を落とすなら
sed -e '1h;1!H;1,3!{g;P;s/[^\n]*\n//;h;};d' file
844login:Penguin:2007/06/15(金) 21:48:15 ID:U7CU2pze
キーコードを発行するスクリプトって、どう書けばいいのでしょうか。
例えば実行するとfirefoxにCTRL+Qを発行して終了させるとか。
845login:Penguin:2007/06/16(土) 01:28:36 ID:GYXyH32b
X上のという意味?
自分は crikey というのを使ってるけど。目的のウィンドウに送るには、
ウィンドウマネージャの機能と組合せる必要があるかもね。
自分は fvwm だから FvwmCommand + crikey でやっている。

今ならもっと便利なものがあるんじゃない。
846login:Penguin:2007/06/16(土) 01:30:16 ID:/7B3KXFi
終了したいだけなら pkill firefox-bin でいいんじゃね?
847login:Penguin:2007/06/16(土) 01:42:23 ID:GYXyH32b
そりゃそうだが、単に終了する例を出しただけだろう
848844:2007/06/16(土) 09:33:29 ID:f0v0sW7Q
説明が不十分ですみません、ありがとうございます。
crikeyでいけそうです、使ってみます。
849login:Penguin:2007/06/16(土) 14:51:20 ID:2Kahigd/
if mythshutdown -s
then
sleep 0
else
exit
fi
(続きの処理)
こんなスクリプトを書いています。
sleep 0って無駄なので止めたいのですが、
他にいい方法ありますか?やりたい処理はmythshutdown -sの
戻り値が0の時は続きの処理に行って、0以外だとその値を
スクリプトとして返したいのです。
850login:Penguin:2007/06/16(土) 15:10:05 ID:1iDZceQr
851login:Penguin:2007/06/16(土) 16:06:45 ID:ipt4t2s4
850はたぶん $? のことを教えたかったんだと思うけど、
849のような場合はふつー使わない。

とりあえず、「何もしない」という処理を書きたいのならば、
:(コロン1個)を使う。
あるいは、この場合はいっそ if を使わず以下で十分。

mythshutdown -s || exit
852login:Penguin:2007/06/16(土) 16:40:47 ID:FGcSj5kQ
スクリプトと関係ないけど
>>846のコマンド、pkillって便利ですね
他界したまま戻ってこないアプリを
叩き落とすのに便利でした
便乗でありがとう
853login:Penguin:2007/06/17(日) 05:41:23 ID:dKTjNLw8
>>852
killallってのもある。
特にSolarisでの便利さは異常。会社のサーバで是非rootで実行してみよう
854login:Penguin:2007/06/19(火) 11:49:55 ID:U1nxYNfn
実行中のシェルをバックグラウンドにするには、一度CTRL+Zで中断してbgコマンドでバックグラウンドにするしか方法はないですか?
中断させずに実行中のシェルをバックグラウンドにする方法があれば教えてください
855login:Penguin:2007/06/19(火) 12:05:31 ID:OWRsODC1
>>854
アンパサンド?
screen使うとか?
856login:Penguin:2007/06/19(火) 13:02:32 ID:U1nxYNfn
>>855
どちらも知らないので調べてみます
857login:Penguin:2007/06/19(火) 13:17:08 ID:U1nxYNfn
アンパサンド?って&これのことだったのね
シェルを実行時に文末につけるとバックグラウンドで実行が始まるのは知ってますが
実行中のシェルもバックグラウンドにできるのですか?
858login:Penguin:2007/06/19(火) 14:08:23 ID:OWRsODC1
>>857
スマン。一番下の行しか読んでなかった。
screenなら君の要件を満たせると思う。
859login:Penguin:2007/06/19(火) 16:52:52 ID:U1nxYNfn
>>858
screenについて簡単に調べてみました
これはscreen上で実行しているシェルなら別の端末エミュレータに切り替えることができるという感じのようですね

シェル実行前にかならずscreenを実行するくせをつけてあれば使えそうですね
ありがとうございました

先ほどの質問に、関係するのですがもう一つ質問があります
SSH上でシェルを実行しているときに、フォアグラウンド、バックグラウンド問わずSSHが切断されてしまうと
再度SSHで接続して確認すると、psコマンド上からはバックグラウンドでシェルが動いているように見えるかと思いますが
このシェルをフォアグラウンドに戻すことは可能なのでしょうか
860login:Penguin:2007/06/19(火) 16:56:46 ID:HOI6xzWc
>>859
たぶん無理。
それこそ screen 使っとけ、と。

あと、ここはシェルスクリプトを書くためのスレなんで
以後はこっちで。
くだらねえ質問はここに書き込め! Part 147
http://pc11.2ch.net/test/read.cgi/linux/1180697511/
861login:Penguin:2007/06/19(火) 17:26:06 ID:U1nxYNfn
screenコマンドを使っておけば、SSHの再接続後でもフォアグラウンドに戻すことができるのですか
御意見参考にさせていただきます

スレ違いすみませんでした
862login:Penguin:2007/06/19(火) 17:40:19 ID:el12elZa
そうです、screenのせいで
仕事を家からのSSHに持って帰れるようになってしまったのです。
863login:Penguin:2007/06/19(火) 17:54:57 ID:U1nxYNfn
仕事場から自宅の鯖で遊びたいという用途にもぴったしでs
864login:Penguin:2007/06/20(水) 20:27:02 ID:G+zE1D9A
Linuxわりかし初心者です。しつもん!

1)
sedって標準出力がディスプレイみたいですが、読み出したファイルの行自体を変更って出来ますか?
sed -e "s/a/b/" example.txt >>example.txt  みたいな
行の指定の仕方がわかりません

2)
ある行の内容によって、約10行前の内容を変更、みたいなのはできますか?
<table>
<td></td>
・・・
<td>テーブルを青くする</td>
</table>

とあったときに、
sed -e 's/<td>テーブルを青くする</td>/<table bgcolor="blue">/'
みたいなかんじで

3)
sed ""の""内で#には\要りますか?


申し訳ないのですが実機環境がないので試してみれません。
SEなのにそれってありえねーだろ!死!
865login:Penguin:2007/06/20(水) 20:44:38 ID:P/3rLZsT
>>864
つKnoppix
866login:Penguin:2007/06/20(水) 23:52:39 ID:AZTPZQG5
1)-i
2)s/hoge\n(fuga)\n(piyo)/foo\n\2\n\3/
みたいのじゃ無理?試してないけど。
3)いらない。(#を区切り文字にしている場合は必要)
867864:2007/06/22(金) 02:28:38 ID:8IDYCEkA
>>866
1)
-iってオプション何処にも載ってないんですが・・・
結局.tmpふたつ作って行ったり来たりさせることに('A`)

3)
さんくす。こんなの試しにやってみれば一発なのに('A`)

2)
説明不足でしたが、元のファイルに
<table>〜</table>で囲まれた同じような表がたくさんあって、その中の一部に
<td>青</td>ってあったら<table bgcolor="blue">
<td>赤</td>ってあったら<table bgcolor="red">
的な変換がしたかったのです(本当は全然違うけどイメージ的にこんなの)

結局↓みたいに相当力押しに書いてしまったんだが動くのやらどうやら

"s/<table>\n\(<tr>.*<\/tr>\n)*\)\(.*[^青]\)/<table bgcolor=\"blue\">\n\1\n\2/g"


>>865
こんな便利なのあるんだ!やってみる!thx!
868login:Penguin:2007/06/22(金) 06:59:13 ID:0Ail+SEg
>-iってオプション何処にも載ってないんですが・・・
sed --helpか、
LANG=C man sedしてみな
869login:Penguin:2007/06/23(土) 02:58:16 ID:Aml12dAK
csvのn番目のフィールドがある値の物のみ抜き出すのってどうやりますか?
例えば

aaa,bbb,ccc,ddd
www,xxx,yyy,zzz
111,bbb,222,333

で2番目が"bbb"の物だけ抜き出すと

aaa,bbb,ccc,ddd
111,bbb,222,333

って感じです。

sed '/^[^,]*,bbb,[^,]*$/p'

とかやってみたんですが、100番目がXXXの物を抜き出したいとかやろうと思うと気が遠くなりそうだったので…。
870login:Penguin:2007/06/23(土) 03:26:23 ID:gphZSY6j
awk -F, '{if($2=="bbb")print $0 }' FILE
871login:Penguin:2007/06/23(土) 07:56:46 ID:FmeGxq7D
csvはちょっと面倒臭いので、それ専用のperl libとかで扱った方がエエかも。
面倒臭い例→"a,aa",bbb,ccc,ddd
872login:Penguin:2007/06/23(土) 11:37:03 ID:dKiUoK3M
>>869
>>871みたいな例はPerlとか使うのがいいけど、フィールドにカンマや改行を含まないCSVなら
 awk -F, '{print $2}' csvfile
でどうだろう。
$100ができるかはawkの実装によるかも。
Linuxならgawkだろうから大丈夫だと思うけど。
873872:2007/06/23(土) 11:38:40 ID:dKiUoK3M
すまん。870を見落としてた。無視しといて。
874login:Penguin:2007/06/27(水) 20:06:41 ID:tEVNOCXT
ある文字列の出てくる行からある文字列が出てくる行までを削除
ってしたいんだけどやり方がわからんちん
875login:Penguin:2007/06/27(水) 20:35:07 ID:UPTNkwJ9
>>874
aaaが出てくる列からbbbが出てくる列までを削除したいなら
 sed '/aaa/,/bbb/d'
876login:Penguin:2007/06/30(土) 00:05:48 ID:ew4CTk9S
#!/bin/sh
FTPFILEDIR=/home/hogehoge;ftp -niv < ftpcomd.txt

==ftpcomd.txtの内容==
open 192.168.0.50
user nurupo gattu
cd $FTPFILEDIR/fugafuga
binary
bye

これだとftpcomd.txt内の環境変数を実行時に
置換($FTPFILEDIR⇒/home/hogehoge)してくれないですよね・・・

なにかいい方法あるでしょうか?
877login:Penguin:2007/06/30(土) 00:31:38 ID:7mQZTSxA
環境変数になってないじゃん
878login:Penguin:2007/06/30(土) 00:40:18 ID:ew4CTk9S
あ、本当ですね・・・ミス・・・
まぁ、そこはexportしてると行間を読んでくださいw
879login:Penguin:2007/06/30(土) 00:54:18 ID:8EJ+K+vB
>>878
目的はファイルのputですか?
FTPFILEDIR=/home/hogehoge; ncftpput -u narupo -p gattu -v 192.168.0.50 $FTPFILEDIR/fugafuga ファイル名
880878:2007/06/30(土) 01:04:10 ID:ew4CTk9S
>879
質問の意図が曖昧ですみません。

背景として、FTPコマンドが記述されたテキストファイルが現在
大量に存在しており、それをできる限り有効活用したいのです。

同種類のFTPコマンドがあちらこちらのシェルで利用されるので、
シェル内に直接コマンドを組み込むことはできるだけ避けたいと思っています。

従って、目的は
「既存のFTPコマンドテキスト(変数含む)を、シェルで読込んで実行したい。」
です。

FTPコマンドテキストをサブシェル化するしかないですかね?
881login:Penguin:2007/06/30(土) 01:37:31 ID:6UQWOODW
>>876
sed かなんかで置換したら?
882878:2007/06/30(土) 01:46:19 ID:ew4CTk9S
>881 それもあんまりスマートじゃないですよね〜(ごめん)
一応、下のような方法は考えています。

#!/bin/sh
FTPFILEDIR=/home/hogehoge;export FTPFILEDIR;sh ftp.sh
==ftpsh==
#!/bin/sh
ftp -niv < <!!
open 192.168.0.50
user nurupo gattu
cd $FTPFILEDIR/fugafuga
binary
bye
!!
883login:Penguin:2007/06/30(土) 01:51:43 ID:OQN/SHer
シェルにftp組み込むってすげーな。

わかってるけど。
884login:Penguin:2007/06/30(土) 02:37:53 ID:F29s3dVE
>FTPFILEDIR=/home/hogehoge;export FTPFILEDIR;sh ftp.sh
  ↓
FTPFILEDIR=/home/hogehoge /bin/sh ftp.sh
885login:Penguin:2007/06/30(土) 02:46:59 ID:RHKVFGjr
(echo "ftp -niv <<END"; cat ftpcomd.txt; echo "END") | sh
試してないけど
886login:Penguin:2007/07/01(日) 00:31:32 ID:JFz913ka
#!/bin/sh
cd $FTPFILEDIR/fugafuga
ftp -niv < ftpcomd.txt

ftpcomd.txtにcd ... の行は含まない
887878:2007/07/01(日) 01:24:33 ID:emR+Frn5
いちおうレス

>>884 ???
>>885 うまくいかない
>>886  うーーん・・・俺の質問の仕方が悪いのか・・
     求めてる回答はそうじゃない・・・
     本質的には、
    「標準入力からのリダイレクト時、読み込むファイル内に記述された
     環境変数を変数値で置換して入力したい」
     と言うのが要件なんだが・・・

     まぁSEDやAWK使えって言われたらそれまでなんだが

888login:Penguin:2007/07/01(日) 09:59:39 ID:06nG7cag
えう゛ぁるなよ

889878:2007/07/01(日) 11:36:38 ID:emR+Frn5
スマソ
そういうつもりじゃなかったんだが、
酔ってたので 文章に配慮が足りなかったな

不愉快にさせてたらゴメン・・・

回答くれた人には感謝しています。
890login:Penguin:2007/07/01(日) 13:23:47 ID:hFPuk4AQ
eval でどうにかしろという意味かと思ってた。
891login:Penguin:2007/07/01(日) 14:51:39 ID:r8an2VBT
evalか。
理屈は簡単で便利なんだけど、見にくくなるからなぁ。
892login:Penguin:2007/07/01(日) 23:58:38 ID:gky3wNyO
1 0:05
2 0:08
3 0:10
4 0:03
5 0:02
6 0:09
7 0:12
8 0:05
とかかれているファイルの2カラム目を
集計したいんですが
どうすればいいですか?
893login:Penguin:2007/07/02(月) 00:05:19 ID:gcmdBXNS
>>892
perl かなんかでスクリプト書いちゃいなよ。
894login:Penguin:2007/07/02(月) 00:46:48 ID:6ILmNwlg
>>892
for x in `cut -d ' ' -f 2 file`; do 集計;done

「集計」が何をしたいのかわからん
895login:Penguin:2007/07/02(月) 00:55:06 ID:jAK/z96S
MM:SS形式?の値を同形式で単純集計したいってことじゃ?
数値でなくMM:SS形式ってのがポイント・・・か?
896login:Penguin:2007/07/02(月) 04:12:56 ID:cVV0dg2o
cat /tmp/test.txt | gawk '{split($2,t,":"); sum+=(t[1]*60+t[2])} END{printf("%d:%02d\n", int(sum/60), sum%60)}'

これでどうかな?
897login:Penguin:2007/07/02(月) 08:03:47 ID:T+TUCf8/
イヤだ。catしてるのがイヤだ。
898login:Penguin:2007/07/02(月) 08:13:27 ID:tjSNrO4Y
catキタ━━━━━━(゚∀゚)━━━━━━ !!!!
899login:Penguin:2007/07/02(月) 09:28:23 ID:dOlJcvNR
なぜ喜ぶ?
900login:Penguin:2007/07/02(月) 11:15:18 ID:B1iDpGDH
俺もここで指摘されてから cat hoge | awk とかが凄く目につくようになった。
901login:Penguin:2007/07/02(月) 11:28:01 ID:eMBbdCfX
cat walk
と空目した
902login:Penguin:2007/07/02(月) 11:28:49 ID:eMBbdCfX
本題を忘れてたw
>>897
なんでcatしたらイヤなん?
903login:Penguin:2007/07/02(月) 11:35:30 ID:pz8XhO1H
904login:Penguin:2007/07/02(月) 14:33:34 ID:tjSNrO4Y
キャッキャッ
905login:Penguin:2007/07/02(月) 16:47:10 ID:cVV0dg2o
>>896
深い意味はないけど。一行スクリプトをコマンドライン上で編集繰り返すとき、中身(スクリプトの部分)が
最後のほうに固まってると編集しやすいし、あと行末に何もついてないとちょっとだけ見やすい。
完成したら、あとは前からcatで流し込もうがawkのパラメータとしてファイル名を渡そうが同じことだから
好きにすればいいんじゃねえの?
906login:Penguin:2007/07/02(月) 19:42:06 ID:T+TUCf8/
行末に何もついてないちょっとだけ見やすいcat例。
$ cat file | cat
907login:Penguin:2007/07/03(火) 09:49:52 ID:GRNywQZK
後付けで言い訳するなw
908login:Penguin:2007/07/03(火) 10:17:11 ID:UxfYWqAX
909login:Penguin:2007/07/03(火) 11:49:01 ID:XUmyJG5y
いや、かわいいしw
910login:Penguin:2007/07/03(火) 14:42:42 ID:YRSuOJ4J
ハム太郎「はっ(;゜Д゜)!背中に殺気!」
911login:Penguin:2007/07/03(火) 19:15:28 ID:VXKLGi2f
>>905
頭に cat を使う理由がそれだけなのならば
< file cmd という形式のリダイレクトを使えばいいんじゃね。
cmd < file と等価。

ちなみに、cmd < file arg と cmd arg < file も等価。
よーするに、どこにあってもいい。
912login:Penguin:2007/07/03(火) 19:23:10 ID:s0+VQAK4
でも
< /etc/hosts { sort; }
とかはできないんだよなぁ。
913login:Penguin:2007/07/03(火) 20:07:37 ID:tGxG80Q9
zsh はできるな
914login:Penguin:2007/07/03(火) 23:11:23 ID:YRSuOJ4J
よし!暇だからLinuxで動くcmd.exeのクローンを作るぞ
915login:Penguin:2007/07/03(火) 23:16:01 ID:sMJI1206
Windows CEで動くbashを作ってくれよ。
さらに暇があったらcygwin CEも。
916login:Penguin:2007/07/04(水) 00:46:45 ID:Odo/XUw0
いまさらCE?
917login:Penguin:2007/07/04(水) 01:17:30 ID:4TXwPx4Q
シェルって自由度高すぎて返って難しいよな
結構人によって癖があるし。

そんな漏れは割りとcat好き
理由は905とほぼ同じ?前から後ろにつなぐので個人的には直感的に書ける(ように感じる)
スクリプトとして保存するときは、リダイレクトにするけど
918login:Penguin:2007/07/04(水) 01:28:24 ID:4TXwPx4Q
どうでもいいが・・・

このスレを見ている人はこんなスレも見ています。(ver 0.20)
シェルスクリプト総合 その8 [UNIX]
サイレントナイト翔 第2翔 [懐かし漫画]               ⇒なんじゃこりゃw
HSP - Hot Soup Processor [15] [ゲ製作技術]


まぁせっかくなので
sed s `/聖衣/シェルター/g' 聖闘士星矢 > サイレントナイト翔
(わかる人少なそう・・・)
919login:Penguin:2007/07/04(水) 01:44:01 ID:xlcHCgOS
自分もサイレントナイト翔スレを覗いてるw
専ブラ使ってるから自分の痕跡じゃないな
920login:Penguin:2007/07/04(水) 03:51:28 ID:5Qs4Am0b
青い鳥の神話スレはここですか?
921login:Penguin:2007/07/04(水) 06:00:17 ID:xcXKXuHy
route |grep -E '^220\.210\..+UH.+ppp[0-9]$'
とかやると、

220.210.xxx.xxx * 255.255.255.255 UH 0 0 0 ppp1
てなるのでつが、

いちばんうしろの ppp? の部分だけぬきだしたいでつ。
たすけて。
922login:Penguin:2007/07/04(水) 07:17:51 ID:YyHq/MNx
各行の先頭単語を読みこみ、シェルスクリプトの変数に代入する
スクリプトを考えているのですが、特定の行を読むところでつまづいています。

while let "${var1} <= 6"
do
#whileの変数である「${var1}番目」の行を読み込もうとしています
DIR=`awk 'NR==${var1} {print $1}' pnl.txt`
mkdir ${DIR}
var1=$(expr ${var1} + 1)
done

どう書けばうまくいくか教えてください!
923992:2007/07/04(水) 08:04:36 ID:YyHq/MNx
と思ったらできました!こうやりました
names=`awk '/^/ {print $1}' pnl.txt`
for DIR in ${names}
do
mkdir ${DIR}
done


924login:Penguin:2007/07/04(水) 11:16:31 ID:9hL5icRE
>シェルって自由度高すぎて返って難しいよな

ここに空白が(あるとダメ|ないとダメ)
とか、
ここで改行(しちゃダメ|しなくちゃダメ)とか

そういう自由度は低いけどね。
925login:Penguin:2007/07/04(水) 20:45:32 ID:kum5iDid
>>992

こんなんいかがですか?
awk '{ print $1 }' pnl.txt | while read d; do mkdir $d; done
awk '{ print "mkdir $1" }' pnl.txt | sh (-x)

926login:Penguin:2007/07/04(水) 20:53:43 ID:kum5iDid
>>921

awk '{ print $NF }'
927login:Penguin:2007/07/04(水) 22:53:17 ID:5Qs4Am0b
マッドスプリクト
928login:Penguin:2007/07/05(木) 19:42:29 ID:EzhBjG1L
>>926
ありがとう。
できまちた。
929login:Penguin:2007/07/05(木) 22:22:56 ID:S5Nm9zsS
sedとawkじゃないかも知れないけど。
-hoge
a
b
-fuga
d
e
のようなファイルがあって、
-hoge a b
-fuga d e
のように出力出来ますか?
csplitでファイル分割して、全てのファイルの改行を取れば出来るのですが、
中間ファイル作りたくないし、これが実現出来るコマンドがありそうな気がしたので。
930login:Penguin:2007/07/06(金) 02:38:15 ID:Vt7J2m8C
>>929
sed s/$/" "/ file.txt |tr -d "\n" |sed s/" -"/"\n-"/g|sed s/" $"//

行末にスペース | 改行を取り除く | "スペース-" の部分で改行 | 行末のスペースを取り除く
931login:Penguin:2007/07/06(金) 06:23:05 ID:6aMK3M7p
>>930
スパーハカー!なるほど!産休。
932login:Penguin:2007/07/06(金) 09:36:03 ID:RB1MBV/1
sed 'N;N;s/\n/ /g' hoge
これはあんまり一般的なやり方じゃねぇか?
933login:Penguin:2007/07/06(金) 20:31:13 ID:zgIWnM6p
GNU sedオンリーだったかな?・・・\n
Linux板だからいーんじゃ?
Unix板だとperl使えか?

934login:Penguin:2007/07/06(金) 22:37:56 ID:d5hv1Ayr
\nはPOSIXでも規定されているし大抵の環境で使える筈。
普通に考えれば>>932が順当。
935login:Penguin:2007/07/06(金) 23:09:36 ID:eiWfMUpf
じゃあ、順当じゃなく。
fmt hoge | tr '-' '\n-'
936login:Penguin:2007/07/07(土) 01:22:38 ID:FIUQeagW
cat /tmp/test.txt | gawk '/^-/ && NR!=1 {print""} {printf($0" ")} END{print""}'
937login:Penguin:2007/07/07(土) 02:34:42 ID:Le67A90t
>>929
awk で

{
if ($0 ~ /^\-/ && NR == 1) {
printf("%s ", $0);
} else if ($0 ~ /^\-/ && NR != 1) {
printf("\n%s ", $0);
} else {
printf("%s ", $0);
}
}
END {
print "";
}
938login:Penguin:2007/07/07(土) 08:39:22 ID:niJj2YwU
>>937
状態遷移で改行の制御にしてみた
BEGIN {nl=""}
/^-/ {printf("%s%s", nl, $0);nl="\n";next}
{printf(" %s", $0)}
END {printf("\n")}

939login:Penguin:2007/07/07(土) 12:25:33 ID:Yc3WeePv
ファイル名をすべて小文字にしたいのですけど、
これはCなどのプログラムを書かないとできませんか?
940login:Penguin:2007/07/07(土) 12:38:07 ID:NvqElBXo
>>939
こんなんでいい?
perl -e '$f=$ARGV[0]; rename $f, lc $f' FILENAME
941login:Penguin:2007/07/07(土) 12:48:34 ID:5zeDGoS/
#!/usr/bin/perl
while (true) {
rename($_, lc($_));
}

# こうですか!? 分かりません><
942login:Penguin:2007/07/07(土) 13:17:34 ID:CShhEr+c
zshで autoload -U zmv; zmv '(*)' '${(L)$1}'
renameで rename '$_=lc($_)' *
943login:Penguin:2007/07/07(土) 14:35:03 ID:niJj2YwU
ls | while read f; do
nf=`echo $f | tr 'A-Z' 'a-z'`
mv $f $nf
done

for f in `ls` はファイルが多いと死亡するのでX
944login:Penguin:2007/07/07(土) 15:38:43 ID:Yc3WeePv
>>940,941
perlはあまりわからないですけどできるのですね。
>>942
autoloadははじめてみました。
>>943
あ、自分がやったことがあったのはこれだ。trと言うコマンドでした。

たまたま同じ小文字のファイルがないか注意してやります。
945login:Penguin:2007/07/07(土) 18:22:07 ID:niJj2YwU
perlはshellスクリプトのアンチテーゼ。
perl -pe -i の破壊力は強力だけど、諸刃の剣。
awkで済むものはawkでやるのがいいかな?
awkの入力駆動はある意味、最高。
946login:Penguin:2007/07/07(土) 18:34:22 ID:fRAuarhz
awkいいんだけど
正規表現が貧弱
947login:Penguin:2007/07/07(土) 18:34:21 ID:niJj2YwU
>>944
[ ! -f $nf ] && mv $f $nf
or
[ -f $nf ] && continue
mv $f $nf

948login:Penguin:2007/07/07(土) 18:40:57 ID:niJj2YwU
>>946
perl:高度な文字列操作中心orループ速度が高速でなくてはいけない場合
sh:ファイル操作中心orループが低速でいい場合
で使い分けてる
shは明示的にファイルをオープン・クローズしなくてもいいんで、
perlよりもステップが減るケースが多いから。
949login:Penguin:2007/07/08(日) 03:35:40 ID:R3wSaX8Q
このスレってsedとawkのスレだと思っていた。スレタイ紛らわしいな。
次スレはそんなことないよう、適切なスレタイでお願いします。 >>950 さん!
950login:Penguin:2007/07/08(日) 09:08:46 ID:yskZMM9a
申し訳ありませんでした。
次は
【csh】シェルスクリプト総合@LINUX Part3【tcsh】
とします。
951login:Penguin:2007/07/08(日) 14:09:16 ID:7xGE5YGp
>>950
あとPowerShellも足しといてくれ
952login:Penguin:2007/07/08(日) 16:04:38 ID:NPyNCDii
>>951
PowerShellはいらん。
953login:Penguin:2007/07/08(日) 23:15:35 ID:6LFQaTbX
>>950

それだと、B-shell系が除外されてるみたいだよ

【csh】シェルスクリプト総合@LINUX Part3【sh】
で。
954login:Penguin:2007/07/08(日) 23:22:52 ID:+jEhGz9Z
>>950 はネタでしょ。

まぁ、単に「シェルスクリプト総合 Part3」でいいんじゃね?
955login:Penguin:2007/07/09(月) 00:10:20 ID:AN/aqvCc
でも*shでスレタイ検索できるとうれしい
956login:Penguin:2007/07/09(月) 00:21:21 ID:odHzoAWA
関数で返り値を返すにはどうすればいいんだ?

foo(){
# ここで文字列を返したい
}

baz=`foo $1`


957login:Penguin:2007/07/09(月) 00:46:47 ID:+fFBXjtS
foo(){
# ここで文字列を返したい
echo "氏ね"
}

baz=`foo $1`
958login:Penguin:2007/07/09(月) 07:43:05 ID:j+0JUicd
foo(){
# ここで文字列を返したい
echo "ボクの肛門も返り値にされてしまいそうです。"
}

baz=`foo $1`
959login:Penguin:2007/07/09(月) 23:09:46 ID:znT8reqA
>>943
> ls | while read f; do
> nf=`echo $f | tr 'A-Z' 'a-z'`
> mv $f $nf
> done

すばらしい。これ、ディレクトリを再帰的にたぐるバージョンできないかしら。
960login:Penguin:2007/07/09(月) 23:29:20 ID:lRpzjg90
>>959
find ./ -type f -exec "f={}; nf=$(echo $f | tr 'A-Z' 'a-z'); mv $f $nf"
じゃだめなの?
961960:2007/07/09(月) 23:30:19 ID:lRpzjg90
最後につける \; を忘れたorz
962login:Penguin:2007/07/09(月) 23:39:42 ID:ocug9qoC
こんな感じ?(動かしてないのであれだけど)

lcdir() {
 for i in "$@"
 do
  test -d "$i" && (cd "$i" && lcdir *)
  mv "$i" "`echo $i | tr A-Z a-z`"
 end
}
lcdir dir
963login:Penguin:2007/07/09(月) 23:44:32 ID:EkunXhiP
find /path -type f | awk '/[A-Z]/{print "mv", $0, tolower($0)}' | sh

>>948
>sh:ファイル操作中心orループが低速でいい場合

ループが必要そうに見えてもうまくやればなくせることが多いし、
起動されるコマンドの数を減らせば遅さはカバーできることがほとんど。
964login:Penguin:2007/07/10(火) 00:00:28 ID:odHzoAWA
>>962
end はなくね?
965929 :2007/07/10(火) 07:16:10 ID:ejVmm0rs
>>932-938
ども
966login:Penguin:2007/07/10(火) 08:36:15 ID:kjj3OspV
>>964
やべ、Rubyまざった
967login:Penguin:2007/07/10(火) 09:02:31 ID:Ct64T7Yk
俺なら頑張っても

「やべ、Basicまざった」

位しか言えないな、、。
968login:Penguin:2007/07/10(火) 11:25:51 ID:bZQyYBJK
begin〜endといえば、Pascalだろ。
969login:Penguin:2007/07/10(火) 22:10:27 ID:vliNJz3h
>>964
こつじゃないけど、デバッグ中は
echo mv $f $nf
これなら実行しないで、実行されるコマンドのみ確認できる
何とかの知恵袋
970950:2007/07/10(火) 23:24:32 ID:qGthZdME
シェルスクリプト総合@LINUX Part3
ttp://pc11.2ch.net/test/read.cgi/linux/1184077033/

テンプレをどこかに保存してあるのなら、すんません。それは使ってません。
971login:Penguin:2007/07/10(火) 23:36:16 ID:NZ+MEzUa
>>968

begin ないじゃん。

do 書いたから多分Rubyになっちゃったんだろうな。。
972login:Penguin:2007/07/11(水) 04:19:18 ID:tJ7VLZ7p
sed、awkスレじゃないので次のスレタイは適切なのたのむ
973login:Penguin:2007/07/11(水) 13:29:35 ID:8OVf7N5d
>>971
へぇ〜知らんかった。
do〜beginってキモイねw
974login:Penguin:2007/07/11(水) 13:30:14 ID:tP/pX7fg
sedでhtmlファイル内のURLリンクだけ抜き出したいのですが、
うまくいきません。
sed 's/http[^html]*html//g'
こんな感じの処理を、これ以外を処理するという感じに書けませんか?

教えていただけるとありがたいです。
975login:Penguin:2007/07/11(水) 16:06:40 ID:NuF0tQDz
>>974
lynx 使うと簡単にできるよ。
976login:Penguin:2007/07/11(水) 20:36:07 ID:hhul5Kpu
grepとパイプで徐々に条件を絞りこんでいけばええんとちゃう?
977login:Penguin:2007/07/12(木) 01:50:22 ID:drYP50FL
>>974
頼むからまともなリファレンスの一つも見てくれ orz
[^html]はないだろうよ。

GNU sed だったら -P オプションつけて Perl互換の正規表現使って書け。
それ以外ならあきらめれ。
978login:Penguin:2007/07/13(金) 01:49:40 ID:XyYLHIIQ
grepとawkで出来るだろ。なんでsed
979login:Penguin:2007/07/13(金) 01:52:03 ID:sl7uOFWd
そこにsedがあるから
980login:Penguin:2007/07/13(金) 07:47:34 ID:pzA4frRT
awkで出来るならgrep使う意味もあんまり無いけどな。
981login:Penguin:2007/07/13(金) 10:43:13 ID:1FqGLDbV
>>980
awkを 

grep なんとか | awk '{ print $1,$2}'

みたいに行分割ツールだと思ってるやつ、いるな。もうちょっと勉強しろと。

そんな俺のお勧めの本は本家awk作者の書いた高い本じゃなくてASCIIの
「awkを256倍使う本」(オレンジ本)だ。昭和の時代からある本だが、未だに増刷版が
手に入る。これを通読すれば、awkのことは大体わかる。ふざけた口調だし、DOS時代の
記述が目に付くような骨董本だがな。
982login:Penguin:2007/07/13(金) 14:41:26 ID:i/OEyHK/
>>981
このスレ見てるとsedの方もsとdぐらいしかコマンドがないと思ってる奴多いじゃん。
あとGNU拡張かもしれんがgrepの-Aと-Bは何げに便利。
983login:Penguin
awkは配列が便利だ