シェルスクリプト総合 その2
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。
2005/04/17(日) 00:17:17まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。
□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/
□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/
□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0881名無しさん@お腹いっぱい。
2005/08/08(月) 23:35:21ヒント:リダイレクト、ファイル記述子
0882名無しさん@お腹いっぱい。
2005/08/08(月) 23:38:460883880
2005/08/08(月) 23:42:58もうちょっと、ヒントをください。
>>882さん
先ほどのソースは間違ってますが、現実は「FILEB」です。
ご指摘ありがとうございます。
0884名無しさん@お腹いっぱい。
2005/08/09(火) 00:04:592 FILEB=$0
3 CNT=0
4 function funcA
5 {
6 while read LINEB
7 do
8 echo $LINEB
9 done <$1
10 }
11 while read LINE
12 do
13 echo ------$CNT------
14 funcA $FILEB
15 CNT=`expr $CNT + 1`
16 done <$0
この例だと、同じファイルを読み込んでるけど、ちゃんと動くがなぁ。
0885880
2005/08/09(火) 00:34:04ほ、本当ですか?
自宅にはUNIX環境がないため、確かめることはできないのですが…
なんでだろうか。。
0886名無しさん@お腹いっぱい。
2005/08/09(火) 06:20:17どうすればいいでしょうか?
0887名無しさん@お腹いっぱい。
2005/08/09(火) 06:35:34echo $$ > pid
念のため言っておくけど、複数個起動すれば当然"pid"というファイルの
内容は書き直されちゃうからね。
0888名無しさん@お腹いっぱい。
2005/08/09(火) 07:14:42あざーっす!
参考になります。
ところで、やはりスクリプト内で別のスクリプトを読んでいる場合は
実プロセスIDではなくてスクリプトを実行しているプロセスのIDになってしまいますよね・・
0889名無しさん@お腹いっぱい。
2005/08/09(火) 07:19:22スクリプトを実行してるプロセスのIDになりました。
apacheとかはどうやって取得しているんでしょうか・・・
0890名無しさん@お腹いっぱい。
2005/08/09(火) 07:23:100891名無しさん@お腹いっぱい。
2005/08/09(火) 07:55:48あざーーっす!!!!
取れました!
1 #!/bin/sh
2
3 echo $$
4 ./test.sh &
5 echo $!
という超簡単なものなら行けたんですが・・・・・
実はtomcatの自動起動スクリプトを書いているんですが、
ソース晒して見てもらってもいいでしょうか?
0892名無しさん@お腹いっぱい。
2005/08/09(火) 16:03:39ってなんだよ?
0893名無しさん@お腹いっぱい。
2005/08/09(火) 16:13:010894名無しさん@お腹いっぱい。
2005/08/09(火) 16:14:21http://d.hatena.ne.jp/keyword/%A4%A2%A4%B6%A1%BC%A4%B9
0895名無しさん@お腹いっぱい。
2005/08/09(火) 16:15:07当たってたら、なんかくれ。
0896名無しさん@お腹いっぱい。
2005/08/09(火) 16:59:30日本語を書くこと。
0897名無しさん@お腹いっぱい。
2005/08/09(火) 17:40:180898名無しさん@お腹いっぱい。
2005/08/09(火) 21:41:090899名無しさん@お腹いっぱい。
2005/08/09(火) 21:43:310900名無しさん@お腹いっぱい。
2005/08/10(水) 09:20:00こういうのあんまりよくない?
0901名無しさん@お腹いっぱい。
2005/08/10(水) 10:18:290902名無しさん@お腹いっぱい。
2005/08/10(水) 10:37:29自己レスです。
結局
echo $(ps -ewo "%p %c %u %a" | awk "\$2==\"java\" && /catalina/ && \$3==\"$CATALINA_USER\" {print \$1}" | head -n 1) > $CATALINA_PID
こんな強引なやり方でプロセスID取得しました
0903名無しさん@お腹いっぱい。
2005/08/10(水) 12:56:490904名無しさん@お腹いっぱい。
2005/08/10(水) 14:54:230905名無しさん@お腹いっぱい。
2005/08/10(水) 19:16:47Tomcatが8080で待ちうけている場合
/usr/sbin/lsof -t -i TCP:8080 -P
シェルスクリプトじゃないけどね。
0906名無しさん@お腹いっぱい。
2005/08/10(水) 19:48:48ええー、(環境によっては)lsofをわざわざインスコすんの…。
そりゃあ必要なものは何でもインスコしなきゃならんがの。プロセスidさえ
わかればよいという目的下だと、ちょっとバランスの悪さを感じる。(俺は)
0907名無しさん@お腹いっぱい。
2005/08/10(水) 23:15:45Kシェルで
count=`cat a.txt b.txt | grep ${検索条件} | wc -l`
というコマンドで検索条件に半角スペースを含む文字列を指定したい場合、どうしたら良いですか?
0908名無しさん@お腹いっぱい。
2005/08/10(水) 23:23:53これじゃあかんの?
0909907
2005/08/10(水) 23:39:59それだと、なぜかcount=0になっちゃうんですよ。
もちろん、条件には引っ掛かる文字列もあります。
うーん。
0910名無しさん@お腹いっぱい。
2005/08/11(木) 01:43:37ksh使ってないんで本題はわからんが、grep -c って標準的じゃないの?
スペースの話を別にすれば
count=`grep -c $検索条件 a.txt b.txt`
でよかったんじゃないのかな。
本題も、wc -lを取り払って試せば、なぜなんだかわからないかな。
0911名無しさん@お腹いっぱい。
2005/08/11(木) 02:03:080912名無しさん@お腹いっぱい。
2005/08/11(木) 11:13:46というところからして、検索文字列の正規表現が
おかしくてマッチしないだけというオチじゃなかろうか。
grep を fgrep に変えてみるとか。
0913907
2005/08/11(木) 20:04:46検索条件はファイルから読み込んでいるので、
半角スペースに見えているのは特殊文字かと思い、
cat -vしてみたら
行末に^Mの文字が‥
引っ掛からないわけでした。
やさしいunix板の皆様、ありがとうございました。
逝ってきます。
0914名無しさん@お腹いっぱい。
2005/08/14(日) 08:45:190915名無しさん@お腹いっぱい。
2005/08/14(日) 10:05:520916名無しさん@お腹いっぱい。
2005/08/14(日) 11:04:42NetBSDにstaticな/bin/bashを突っ込む俺も阿呆だと思うけど。
だってシングルユーザモードでもログインシェルにbashを使いたいんだよもん!
0917名無しさん@お腹いっぱい。
2005/08/14(日) 17:35:450918名無しさん@お腹いっぱい。
2005/08/14(日) 18:04:12私はbashかksh。
0919名無しさん@お腹いっぱい。
2005/08/14(日) 18:51:360920名無しさん@お腹いっぱい。
2005/08/14(日) 19:41:530921名無しさん@お腹いっぱい。
2005/08/14(日) 22:12:160922名無しさん@お腹いっぱい。
2005/08/14(日) 23:23:49明らかにスレ違いだし。
0923名無しさん@お腹いっぱい。
2005/08/22(月) 17:31:43????.sh: xrealloc: cannot reallocate 268435456 bytes (0 bytes allocated)
(????はファイル名)
というエラーがでます。
前同じスクリプトを動かしても何も普通に動いていたのに。。。
パーミッション、ファイルサイズ制限、ログインシェル、メモリ残量
はチェック済みです。。。
このエラーが起きる原因はなんでしょうか?
よろしくお願いします。
0924923
2005/08/22(月) 18:14:300925名無しさん@お腹いっぱい。
2005/08/22(月) 18:26:41原因はなんだったんだよ!
0926名無しさん@お腹いっぱい。
2005/08/23(火) 20:43:34bourne shを使っています。
サーバにある毎日更新されているログファイル(ファイル名に日付入り)にアクセスし、
その中で使用されている2種類の文字列をカウントして、数をエクセルで日ごとに表示させようと思っています。
今考えているやり方は、引数に日付を与えてそれを元にその日のログファイルを検索し、
その中からヒット数をカウントしてテキストかCSV形式で保存し、手作業でエクセルに流し込もうと思っています。
(grep "A" logfile | wc -l ; grep "B" logfile | wc -l) >> hoge.txt
このやり方だとテキスト・CSVどちらの形式でも、
1
2
と改行が入ってしまって、エクセルで
A B
0822 3 5
0823 1 2
0824
という横並びの形で表すことができません。
何か良い方法を教えていただけますでしょうか。
よろしくお願いします。
0927名無しさん@お腹いっぱい。
2005/08/23(火) 20:47:49とりあえず、その部分の改行を取るだけなら、
echo `grep "A" logfile | wc -l ; grep "B" logfile | wc -l` >> hoge.txt
にすればいいわな。
0928926
2005/08/23(火) 21:26:20あぁ、なるほど・・・
近いところまで行ってたのに、そこに辿り着けませんでした・・・
ありがとうございます!
これでひとまずはできそうです。
あとは手作業でやる手間を省けるように、表形式(もしくはそれに近い形)で
表示させれるように考えてみます。
もし何かご存知の方がいらっしゃいましたら、ご教授ください。
0929名無しさん@お腹いっぱい。
2005/08/23(火) 21:44:10if文で文字列比較する際、
頭の2文字が"/a"に一致する、とか最後の文字列が".jpg"に一致する
と言う条件分は、どうすればいいんでしょうか?
正規表現使わないと出来ないのでしょうか?
0930名無しさん@お腹いっぱい。
2005/08/23(火) 21:49:54bashじゃなくても同じ。
if じゃなくて case 使え。
case $mojiretsu in
/a*)
hoge;;
*.jpg)
hoge;;
esac
だな。case文のパターンは正規表現ではなく、
単なるワイルドカードなので、混同しないように。
0931929
2005/08/23(火) 21:51:50早々のレス、ありがとうございます。
わかりますた。
0932名無しさん@お腹いっぱい。
2005/08/23(火) 22:19:21まず、そのやり方では文字列を数えていないことに注意してください。
grep| wc -l では、文字列を含む行を数えているのであって、
たとえば1行の中に目的の文字列が複数含まれていても、
1行としか数えられません。それで本当にいいんですか?
0933名無しさん@お腹いっぱい。
2005/08/23(火) 22:33:36Webサーバのログならanalog使え。
と、勝手な仮定で適当なことを言ってみるテスト。
0934926
2005/08/23(火) 23:47:47確かにおっしゃる通りです・・・
現状では特徴のある文字列でgrepすることで1行ずつで抽出しようと
考えています。
何かこのまま行くとこちらを基準にした名前付けをすることになったりしそうなので、
違う方法を考えてみます。
>>933さん
analogは初めて知りました。
こんなことができるんですね・・・
今回はちょっと学校の環境なので自由には入れられないんですが、
ゆくゆくは自サーバでと考えていたのでその時に参考にさせていただきます。
お二人ともありがとうございます。
0935名無しさん@お腹いっぱい。
2005/08/24(水) 04:45:28正規表現っていってもいいんですか?
0936名無しさん@お腹いっぱい。
2005/08/24(水) 06:27:37ちがう
0937名無しさん@お腹いっぱい。
2005/08/24(水) 06:57:51概念としては正規表現の一種といっていいんですかね?
0938名無しさん@お腹いっぱい。
2005/08/24(水) 07:28:08機能だけ見れば正規表現のごく一部の機能のみをもつ
サブセットだと考えても実用上ほとんど問題はないが、
それでも正規表現の一種だと言ってしまうのは間違い。
0939名無しさん@お腹いっぱい。
2005/08/24(水) 07:36:10何度も聞き返すのしつこいぞ。
シェルのワイルドカードは、正規表現とは全く違う。
サブセット(部分集合)でもないし、正規表現の一種でもない。
例えば、a*.jpg というのがあったとする。
これがシェルのワイルドカードなら、
ahoge.jpg aHage.jpg asoko.jpg ....
などにマッチする。
一方、 a*.jpg が正規表現だとすると、上記のものにはマッチせず、
aaaaaa.jpg aaaaBjpg sjpg .... などといった文字列にマッチする。
全く違うものだよ。
0940937
2005/08/24(水) 07:42:09実装がまったく違うのはわかってますが、
学問的な意味での正規表現ではワイルドカードパターンも
正規表現というのかなあと >>935 と同じ疑問を持ったわけです。
有限オートマトンがなんとかとかいうやつ。
0941名無しさん@お腹いっぱい。
2005/08/24(水) 08:11:42実装が違うだけじゃなくて、仕様自体が違うの。
だから、「学問的な意味」でも、
ワイルドカードパターンのことを正規表現とは言わない。
もともと、メタキャラクターの表現方法がいろいろあったのを、
sedやgrepで使うために「標準化」して、
"regular expression"と定義したわけ。
で、「正規表現」というのは実は誤訳で、
本来なら「標準表現」と言うべきもの。
(シェルで使っているのは標準以外の表現方法)
sedやgrepで使う表現がシェルのものとは異なるため、
sedやgrepが、「こっちが標準ですよ」と言っているかのごとく、
「標準表現=正規表現」というわけ。
もし、文献などでシェルの * のことを「正規表現」と
書いてあるものがあったら、それは大間違いなので買ってはいけない。
0942名無しさん@お腹いっぱい。
2005/08/24(水) 08:16:38> もともと、メタキャラクターの表現方法がいろいろあったのを、
> sedやgrepで使うために「標準化」して、
> "regular expression"と定義したわけ。
それは違うと思うぞ. Unix の正規表現と使ってるメタキャラが違
う正規表現の実装だってあるわけだし...
0943名無しさん@お腹いっぱい。
2005/08/24(水) 08:31:26ま、受理できる言語の集合がサブセットだってこった
0944名無しさん@お腹いっぱい。
2005/08/24(水) 08:50:52> ま、受理できる言語の集合がサブセットだってこった
>>941 のような恥ずかしい奴に言っても意味不明だと思う
0945名無しさん@お腹いっぱい。
2005/08/24(水) 09:33:09自己定義用語を持ち出しているのが間違い。
シェルスクリプトスレで、UNIXの世界で
正規表現と言ったらsedなどで使うものの意味にしかならない。
ただでさえ、初心者がシェルのメタキャラクターを
正規表現だと誤解する例があって混乱を招くので、
>>940 のようなカキコは謹んでくれ。
正規表現については sed スレあたりでやってくれ。
0946名無しさん@お腹いっぱい。
2005/08/24(水) 10:00:00オートマトンとか言語理論の方から見れば,
シェルスクリプトのワイルドカードも立派な
正規表現だと思うが...
0947名無しさん@お腹いっぱい。
2005/08/24(水) 10:04:25本気でそう思い込んでる香具師は
シェルスクリプトを書く素質がないので、
他の板にお帰りください。
0948名無しさん@お腹いっぱい。
2005/08/24(水) 10:10:09「実装が違う」というのは、
具体的なプログラム(コーディング)は違うけど
全体の仕様は同じ場合をいう。
たとえば、sendmailとpostfixは、メールサーバーの異なる実装。
実装は違うが、SMTPプロトコルでメールが送れるという
仕様は同じ。
しかし、正規表現とシェルとでは、実装が違うだけでなく、
仕様が違う。
だから、「実装が違うが、同じようなもの」みたいないい方は
それ自体が間違い。
0949名無しさん@お腹いっぱい。
2005/08/24(水) 10:30:12ところの「正規表現」を、あたかも Posix/Unix の正規表現をさす固有名詞の
ように扱っているから祖語が起きているんじゃねぇの?
0950名無しさん@お腹いっぱい。
2005/08/24(水) 10:49:54一つの形式で表現する方法のこと。正則表現(せいそくひょうげん)とも
呼ばれる。
アルファベット A={a1,...,an} 上の正規表現とは
1. 空記号列 ε は正規表現である
2. ai(Aの任意の要素)は正規表現である
3. X と Y が正規表現ならば、
1. X|Y も正規表現である
2. XY も正規表現である
3. {X}* も正規表現である
(以上Wikipedia日本語版)
glob() is a Unix library function that expands file paths according
to a minimal regular expression syntax. The syntax of glob patterns
is not identical with that of regular expressions used by Unix
utilities like grep.
(以上Wikipedia英語版)
後者glob()は要するにシェルのメタキャラクタ展開。ごらんの様に
正規表現の定義上も、glob()の定義上もglobは正規表現であることを
裏付けている。別に混乱も齟齬も起きてないよ。
0951名無しさん@お腹いっぱい。
2005/08/24(水) 11:06:47ワイルドカードは正規表現の真のサブセットなのに、
これをminimal regular expressionなんて呼ぶのが齟齬なんじゃないか。
どの正規表現にも対応するワイルドカード表記があると証明してくれたら、
その定義を受け入れるよ。
0952名無しさん@お腹いっぱい。
2005/08/24(水) 11:24:40そんなことを言い出したら、
「シェルって本当は貝っていう意味ですね。
だから、Bourne shやbashだけでなく、ほら貝やアサリ・シジミも
シェルですね」
と言っているようなもの。
UNIXで正規表現と言ったら、シェルのglobのことは指さない。
わかったら二度と出てくるな、ボケ。
0953名無しさん@お腹いっぱい。
2005/08/24(水) 11:32:250954名無しさん@お腹いっぱい。
2005/08/24(水) 11:38:57あのようなのは、「ばかまるだし」っていいませんか?
0955名無しさん@お腹いっぱい。
2005/08/24(水) 13:17:45globでX|Yや{X}*を表現できるのか?
0956名無しさん@お腹いっぱい。
2005/08/24(水) 13:56:31(http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A8%80%E8%AA%9E)
かって聞きたかったのだろう。
wikipeidaにもある通り正規表現とワイルドカードは全く別物
ワイルドカードで表現可能な言語は正規表現で表現できるが逆は不
可能なので両者は等価ではない。
0957名無しさん@お腹いっぱい。
2005/08/24(水) 14:02:54やれやれ、貼っとくか、
man 7 glob より:
NOTES
Regular expressions
Note that wildcard patterns are not regular expressions, although they
are a bit similar. First of all, they match filenames, rather than
text, and secondly, the conventions are not the same: e.g., in a regu-
lar expression `*' means zero or more copies of the preceding thing.
"wildcard patterns are not regular expressions"
と言ってるんだから明白だね。
ワイルドカードパターンと正規表現とは違う、
たとえ少し似てるところがあっても。
0958名無しさん@お腹いっぱい。
2005/08/24(水) 14:13:080959名無しさん@お腹いっぱい。
2005/08/24(水) 14:14:02本質を理解してなさそう。
マッチの対象がファイル名かテキストかの違いで、
*とかの表記の意味が違う、
といわれただけで納得か?
0960名無しさん@お腹いっぱい。
2005/08/24(水) 14:51:29globが正規表現の一種なら>>950が引用した定義により帰納的に定義される集合を
表現できなければならないが、その能力はない。
>>950は自分が引用したものの意味もわかっておらず自滅してる。
0961名無しさん@お腹いっぱい。
2005/08/24(水) 14:53:42本質も何も、UNIXでは、
ワイルドカードパターンのことは正規表現とは定義していない、
というだけのことではないのだろうか。
それ以外の定義を持ち出してUNIX板で議論するなら
板違いというべきもの。
0962950
2005/08/24(水) 15:33:14X*はたしかにないなあ。自滅だ。
>>961
sedのいうところの正規表現とegrepの正規表現はかなり異なるが、
どちらも正規表現と言っている。perlやphpはegrepに近いが、
いろいろ違う。だから、「UNIXでは」なんて言っても意味ないよ。
(POSIXのBREとEREは分かっててあえてsed,egrepと言ってるからね、念のため)
0963名無しさん@お腹いっぱい。
2005/08/24(水) 15:42:210964名無しさん@お腹いっぱい。
2005/08/24(水) 16:00:42だから、Basic RE と Extended RE は 正規表現と言っていいんだよ。
globはBasic REでもExtended REでもないから、
正規表現と言ってはいけない。言うと間違い。
0965名無しさん@お腹いっぱい。
2005/08/24(水) 16:13:04>正規表現と言ってはいけない。
ひどいな。
0966名無しさん@お腹いっぱい。
2005/08/24(水) 16:17:540967名無しさん@お腹いっぱい。
2005/08/24(水) 16:28:34自演乙。
glob を正規表現だと主張しているのはお前一人だけのようだ。
0968名無しさん@お腹いっぱい。
2005/08/24(水) 16:31:270969名無しさん@お腹いっぱい。
2005/08/24(水) 16:39:06ほんとだ
*(foo|bar)とかできるね、egrep式には(foo|bar)*の意で。
正規表現と言っていいかどうかまでは調べてないから分からんが。
シェルのファイルパターンマッチの場合、. .. / の扱いが正規表現と呼ぶのに
問題になりそうだ。(ファイルシステムの問題だけなら表現として無問題)
0970名無しさん@お腹いっぱい。
2005/08/24(水) 16:40:290971名無しさん@お腹いっぱい。
2005/08/24(水) 16:42:16「シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(sedスレへ)」
と、明記希盆。
0972名無しさん@お腹いっぱい。
2005/08/24(水) 16:51:07950が撤回してるからもう一人もいないんじゃないか?
今は964の変な理屈(たぶん釣り)に反応してるだけで。
0973名無しさん@お腹いっぱい。
2005/08/24(水) 16:51:560974名無しさん@お腹いっぱい。
2005/08/24(水) 16:56:130976名無しさん@お腹いっぱい。
2005/08/24(水) 21:41:010977名無しさん@お腹いっぱい。
2005/08/24(水) 21:41:540978名無しさん@お腹いっぱい。
2005/08/24(水) 22:04:16何を言っているのやら。
「マッチ対象」は関係無いでしょう。ファイル名に対してregexpを使うこともできるし、
テキストに対してもワイルドカードパターンを使えるのだから。
実装も違う、仕様も違うものをごっちゃにされても困る。
「経済の世界では、defaultの意味は云々」のレベル。
0979名無しさん@お腹いっぱい。
2005/08/24(水) 22:13:030980名無しさん@お腹いっぱい。
2005/08/24(水) 22:15:41レス数が950を超えています。1000を超えると書き込みができなくなります。