トップページ⇒linux
988コメント336KB

シェルスクリプト総合@LINUX Part3

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001login:Penguin2007/07/10(火) 23:17:13ID:qGthZdME
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

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

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

【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。
0950login:Penguin2008/04/23(水) 23:33:35ID:M4AkpEZt
>>948
grep -E "(AAA|BBB)" もしくは
egrep "(AAA|BBB)"
09519482008/04/24(木) 04:44:09ID:8uaGXJVC
>>950
egrepでしたか、ありがとうございます。

>>949
1秒に100行以上流れるログなので、速すぎて読めないのよねw
0952login:Penguin2008/04/24(木) 09:43:23ID:C5h8jkbM
一秒に100行以上流れるとか全然関係ないと思うぞ。
0953login:Penguin2008/04/24(木) 10:09:04ID:iBrwQJHF
そんなにおかしいか?
おれもよくやるけどな。
0954login:Penguin2008/04/24(木) 19:19:48ID:BuhR71Gk
>>952
logの監視は他にどんな手段でやってるの?
0955login:Penguin2008/04/24(木) 19:42:01ID:28W2p82+
tail -fしても速く流れるのは変わらないだろ?
大きなファイルの増分だけ見たい時は有効だけど。
0956login:Penguin2008/04/24(木) 19:54:48ID:iBrwQJHF
たとえば
tail -f access_log | grep 10.99.78.22
とかやっといて、10.99.78.22 からアクセスしながらログを見たりする。
tail -f access_log だけだとログが多過ぎるし
grep 10.99.78.22 access_log ではリアルタイムに見れない。

つーか、なんでそんなに否定したがるんだ?
0957login:Penguin2008/04/24(木) 20:51:49ID:PIJRHfrL
そんなのは常識。

tail -fするのは、増分を見たいからだろ?
速く流れるのは関係ない。それはgrepの役目。
>>949に対する>>951の答えはおかしい。

それが読み取れない>>953も疑問。
0958login:Penguin2008/04/24(木) 23:00:30ID:amh/02/G
>>956
基本だよな。それって。
0959login:Penguin2008/04/25(金) 01:12:52ID:05aUO6OC
役に立たないのは949,952,957のレスだろ
つegrep -v '(949|952|957)'
0960login:Penguin2008/04/26(土) 03:30:44ID:2buln9M4
ファイルを検索して、
ファイル名によって分岐させたいと思っています。
以下のようにスクリプトを書いたのですが、
if [ $file = *.o ]
がうまく動作してくれません。
どこが間違っているのでしょうか?

# $1はディレクトリ
for file in `find $1`
do
if [ -x $file ]; then
echo "x: Name=$file"
else
if [ $file = *.o ]; then # .oで終わるファイル
echo ".o: Name=$file"
else
echo "not .o: Name=$file"
fi
fi
done
0961login:Penguin2008/04/26(土) 03:41:55ID:l2xr5sbr
[ $file = *.o ] の * がパス名展開されるから。
こういう時は case 文使うと楽。

case "$file" in
*.o) echo ".o: Name=$file" ;;
*) echo "not .o: Name=$file" ;;
esac

09629602008/04/26(土) 04:22:04ID:2buln9M4
>>961
ありがとうございます!
>* がパス名展開される
なるほどです。

今後のためにお聞きしたいのですが、
このままifで処理するには
どのようにしたらよいのでしょうか?
0963login:Penguin2008/04/26(土) 05:02:51ID:+ITD/myA
expr でパターンマッチさせた結果を判定するのが常套手段だと思う。
でも解り易さで俺も>>961おすすめ。
shでなくbashやzshに依存するやり方で良いなら他にもあるので、manするとエエでがす。
09649602008/04/26(土) 11:07:16ID:2buln9M4
>>963
expr、なるほど。

C++やってるときも、caseなんてifがあるから要らね、
とか言ってるのをshにも持ち込んでしまったわけですが、
shではcaseを格上げします。

ありがとうございました。
0965login:Penguin2008/04/26(土) 11:09:05ID:zBt65CRz
>>964
ざけんな。switchの方がコードの見通しがよくなる場面が多々ある。
適材適所だ。
0966login:Penguin2008/04/27(日) 00:22:17ID:FoD+QJwV
一文字のみ、小文字を大文字に置換の方法、教えてください

_linux
から
_Linux
へ
(この場合、小文字lを大文字Lへ、一文字のみ)
trとかsedでぐぐってみましたが、すべての文字に適用される例のものばかりで。。。
0967login:Penguin2008/04/27(日) 00:31:12ID:mG61TWcx
echo _linux | sed -e 's/[a-z]/\U&/'
0968login:Penguin2008/04/27(日) 01:13:49ID:FoD+QJwV
>>967
ありがとうございます
期待通りの動作になりました、感謝
0969login:Penguin2008/04/27(日) 11:57:04ID:ETxngpCN
_liNux は出来ないのかな。>>967のようなスキっとした書き方で。
0970login:Penguin2008/04/27(日) 12:12:20ID:1cMdGQre
全部小文字化してから同じことしたらダメなん?
0971login:Penguin2008/04/27(日) 12:45:35ID:HcGhOMeC
>>970
誤爆?
0972login:Penguin2008/04/27(日) 22:02:04ID:q9kFxXww
>>971
誤爆?
09739712008/04/28(月) 00:36:22ID:Mw1Lj+jO
あ、いや、>>970が言うことの意味が解らんかったので誤爆と思ったんだが。
解るなら、少し噛み砕いて教えてくれまいか。
0974login:Penguin2008/04/28(月) 06:34:43ID:SsprEZLS
sedとか知らんのでperl風に。

a =~ tr/A-Z/a-z/;
if(a =~ /^[a-z]/){
}

ってことっしょ。
Cとかでは常套手段だね。
0975login:Penguin2008/04/28(月) 07:05:40ID:SIpyVhcv
echo _liNux | tr A-Z a-z | sed -e 's/[a-z]/\U&/'
0976login:Penguin2008/04/28(月) 07:06:19ID:8Uqzl8jr
>>969
echo _linux | sed -e 's/n/\U&/g'
09779692008/04/28(月) 10:03:13ID:7zRWo+3m
すまんかった。そういう意味にとられるとは思わなかった。
言葉を足します。
(>>966の入力 _linux を、)_liNux (と出力すること)は出来ないのかな。>>967のようなスキっとした書き方で。

>>976
_linux という文は固定でなく小文字の例だと思うので、_386bsd を入れられたら _386bsD を期待したいが、いずれにせよ要件をちゃんと書くべきだった。失礼した。
0978login:Penguin2008/04/28(月) 10:05:24ID:SsprEZLS
>>977
s/l/L/g
0979login:Penguin2008/04/28(月) 10:08:16ID:bnx5yVOH
_liNux
_386bsD

用件がわからん…というかアホですか?
0980login:Penguin2008/04/28(月) 10:12:27ID:SsprEZLS
>>979
それは俺も思った。
要求仕様はさっぱり不明。

だから言ってることが出来る道具だけ渡した。
0981login:Penguin2008/04/28(月) 11:16:17ID:JcWq+XLq
>_liNux
>_386bsD
>用件がわからん…というかアホですか?
それは幾らナンでも頭悪すぎ。
小文字1文字目のみを大文字に置換が元ネタなので、
小文字3文字目のみを大文字に置換だろう。
0982login:Penguin2008/04/28(月) 11:41:07ID:SsprEZLS
ああ、それだとちょっとむずいね。
0983login:Penguin2008/04/28(月) 13:02:16ID:H2glbyc+
v8 uNix もあわせて実現を目指してくれ
0984login:Penguin2008/04/28(月) 13:06:59ID:Qj7dOjgB
echo v8 unix | sed -e 's/\([a-z][^a-z]*[a-z][^a-z]*\)\([a-z]\)/\1\U\2/'
0985login:Penguin2008/04/28(月) 23:33:01ID:VcU+TmwT
こういうの需要ある?
gnome+nautilusの環境で、zipされたwmvエロ動画をダブルクリック一発で
快適に見るためのスクリプト*.zipのプロパティ/開き方で*.zipに関連付けて使う


#!/bin/sh
#PLAYER=your favorite movie player -- totem gmplayer vlc xine etc...
PLAYER=vlc
unzip -l "$1" *.wmv > /dev/null
if test $? -eq 0; then
$PLAYER `unzip "$1" *.wmv -d /tmp | grep .wmv | sed s/inflating://`
rm -f /tmp/*.wmv
else
file-roller "$1"
fi
0986login:Penguin2008/04/29(火) 00:44:38ID:yMPkktaR
エロ画像のみを再生してくれるなんてすごいな。
0987login:Penguin2008/04/29(火) 00:46:31ID:HB5XPfjp
>>986
zipされたwmv動画は98.7%(当社比)の確率でエロ動画だ。
0988login:Penguin2008/04/29(火) 12:02:50ID:McK0z648
zipされた画像ファイルをcomixかなんかに渡してくれる機能つけて
使ってみるわ
レス数が950を超えています。1000を超えると書き込みができなくなります。