シェルスクリプト総合 その8
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2007/02/15(木) 14:28:44スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
0290名無しさん@お腹いっぱい。
2007/03/13(火) 22:25:010291名無しさん@お腹いっぱい。
2007/03/14(水) 17:16:17正しく判別するにはどうすればいいでしょうか?
grep -E ".*<>.*<>[0-9]+/[0-9]+/[0-9].* [0-9:.]+ ID:[a-zA-Z0-9+-/]+<>.*<>.*"
こんな感じでひっかけようと思ったのですが、
何かの間違いでメール欄やレス欄に <> が
まぎれこんでしまってる場合でもマッチしてしまいます。
やりたいことは、このようなゴミのまじった行を削除することなのですが
どうするのがよいでしょうか?
0292名無しさん@お腹いっぱい。
2007/03/14(水) 18:47:380293名無しさん@お腹いっぱい。
2007/03/14(水) 21:33:18全部捨てたらいいんじゃないか。
0294名無しさん@お腹いっぱい。
2007/03/14(水) 22:54:480295名無しさん@お腹いっぱい。
2007/03/14(水) 23:24:19-O
0296名無しさん@お腹いっぱい。
2007/03/15(木) 03:28:47宿題にするな。テストにしとけ。
0297名無しさん@お腹いっぱい。
2007/03/15(木) 09:45:110298名無しさん@お腹いっぱい。
2007/03/15(木) 23:41:20普通に構文を書くとパスワード入力等を求められると思うのですが
手動入力でなく、完全自動化にできないでしょうか?
Shellは「sh」です。
OSはRedhatです
0299名無しさん@お腹いっぱい。
2007/03/15(木) 23:42:09ssh-agent
0300名無しさん@お腹いっぱい。
2007/03/15(木) 23:53:17他のプログラムとかの絡みで使用できるか・・・・
0301名無しさん@お腹いっぱい。
2007/03/16(金) 00:12:200302名無しさん@お腹いっぱい。
2007/03/16(金) 00:13:16板違い。
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/
むしろこっちか。
くだらねえ質問はここに書き込め! Part 142
http://pc11.2ch.net/test/read.cgi/linux/1173460712/
0303名無しさん@お腹いっぱい。
2007/03/16(金) 07:56:47ssh-agentを知ってるなら質問するなよ!
0304名無しさん@お腹いっぱい。
2007/03/16(金) 08:32:480305名無しさん@お腹いっぱい。
2007/03/16(金) 08:33:30ただし、秘密鍵を盗まれないように。
0306名無しさん@お腹いっぱい。
2007/03/16(金) 10:28:230307306
2007/03/16(金) 10:30:13http://www.gentoo.org/proj/en/keychain/
0308名無しさん@お腹いっぱい。
2007/03/16(金) 22:01:18expect
0309名無しさん@お腹いっぱい。
2007/03/16(金) 22:13:130310名無しさん@お腹いっぱい。
2007/03/18(日) 18:56:130311名無しさん@お腹いっぱい。
2007/03/18(日) 22:20:49入ってないなら入れればいいじゃん。
0312名無しさん@お腹いっぱい。
2007/03/18(日) 23:45:58お馬鹿さん?
0313名無しさん@お腹いっぱい。
2007/03/20(火) 00:15:560314名無しさん@お腹いっぱい。
2007/03/20(火) 00:34:230315名無しさん@お腹いっぱい。
2007/03/20(火) 00:46:09必要あるなら入れなきゃいかんだろ。
0316名無しさん@お腹いっぱい。
2007/03/21(水) 00:06:29perlの小さなライブラリを追加といってExpect.pmでよくない?
かなりプログラム臭くなるのでexpectに比べてはいけないが、次善の策ではあるはず。
0317名無しさん@お腹いっぱい。
2007/03/21(水) 01:28:070318名無しさん@お腹いっぱい。
2007/03/21(水) 01:51:290319名無しさん@お腹いっぱい。
2007/03/21(水) 02:25:07パスなしでログインできるのが怖いなら、authorized_keysにcommandを書いて、できることを限定しておくといいよ。
スレ違いだったらすまん。
0320名無しさん@お腹いっぱい。
2007/03/28(水) 01:47:010321名無しさん@お腹いっぱい。
2007/03/28(水) 02:04:060322名無しさん@お腹いっぱい。
2007/03/28(水) 02:30:58awkでやれ
awk '{line[NR]=$0}END{for(i=NR;i>0;i--){if(line[i]=="検索パターン") print line[i];}}' input.txt
0323名無しさん@お腹いっぱい。
2007/03/28(水) 02:50:520324名無しさん@お腹いっぱい。
2007/03/29(木) 16:52:36行数は同じでそれぞれの行が関係のある物になっています。
現在、その二つの行をそれぞれスペースで区切って接続を行いたく考えています。
A.txt
山田
山下
B.txt
太郎
二郎
AB.txt
山田 太郎
山下 二郎
A.txtとB.txtからAB.txtを作成する妙案などございましたらご教示いただけませんでしょうか?
よろしくお願い致します。
0325名無しさん@お腹いっぱい。
2007/03/29(木) 16:56:53paste A.txt B.txt > AB.txt
0326名無しさん@お腹いっぱい。
2007/03/29(木) 17:09:44PASTE(1)
名前
paste - ファイルを行単位でマージする
大変失礼いたしました…orz
シェルスクリプトとかそう言うレベルで無かったことをお許し下さい…。
0327名無しさん@お腹いっぱい。
2007/03/30(金) 09:37:33幸子の場合、a.txtが山田となっていたら
里中に変更する。という条件付きくらいにしとけば
スクリプトでしなきゃいかんけどな。
0328名無しさん@お腹いっぱい。
2007/03/30(金) 15:20:07そのenvelope Fromを、実データのFromに置換して/usr/bin/vacation
に渡すスクリプトを書きたいのですが・・・
sed -n 's/^From: [^<]*<\([^>]*\).*/\1/p'の内容を覚えさせておいて、
もう一度先頭から読み込んで置換すればよいと思いますが、
その方法がわからないのです。
微妙な内容なのでググるためのキーワードもいまいちで、ヒットしません。
別にsedでなくてpealやawkでもよいのですが、何かいい方法はありますでしょうか?
0329名無しさん@お腹いっぱい。
2007/03/30(金) 15:26:46そのまま
・覚えさせる->ファイルに書く
・もう一度先頭から読み込んで置換する->そうする
でいいんじゃないの?
0330名無しさん@お腹いっぱい。
2007/03/30(金) 16:01:32頭とケツにそれぞれ「”」を付けたいです。
何か良い方法は有りませんでしょうか?
0331名無しさん@お腹いっぱい。
2007/03/30(金) 16:08:360332名無しさん@お腹いっぱい。
2007/03/30(金) 16:17:30パイプが無駄。一発でできる。
sed 's/\(.*\)/"\1"/'
0333名無しさん@お腹いっぱい。
2007/03/30(金) 16:24:130334328
2007/03/30(金) 16:31:53難しく考えずに、そうすることにします。
0335名無しさん@お腹いっぱい。
2007/03/30(金) 16:44:44ありがとうございます。
頑張ってsed覚えます。
0336328
2007/03/30(金) 17:10:27と思ったら、メール出力から起動されるプログラムは
きわめて弱い実行権限(nobody)しかないので、/tmpにさえ
ファイルを作れません。(人間がテストしたときは巧くいきましたが・・)
権限を強めればセキュリティーリスクが増大するし、
やはり、スクリプトの中で記録と標準入力の再読み込みが必要な模様です。
まあ記録は置換文字列に変数を使えることが判ったので何とかなりそうですが、
「初めからもう一度実行」が途方に暮れてしまいますね。
何かよい方法ありますでしょうか?
0337名無しさん@お腹いっぱい。
2007/03/30(金) 17:14:32・そもそも sendmail でも postfix でも .forward のファイル所有者と
同じ権限でプログラムが起動する。nobody にはならない。
0338328
2007/03/30(金) 18:36:24なるほど
では、ほかの原因を考察して見ます。
ありがとうございます。
0339名無しさん@お腹いっぱい。
2007/03/30(金) 22:30:53sed 's/.*/"&"/'
でもいいな。
0340名無しさん@お腹いっぱい。
2007/03/30(金) 23:05:57正規表現は使わない方が速いかな。
awkで、
awk '{print "\""$0"\""}'
0341名無しさん@お腹いっぱい。
2007/04/03(火) 01:43:34「\」を前に置いても駄目でした…
0342名無しさん@お腹いっぱい。
2007/04/03(火) 02:26:06system が起動しているシェルに食われたんじゃね?
0343名無しさん@お腹いっぱい。
2007/04/04(水) 00:17:45例えばこんな感じ。実際はこんなシンプルじゃないけど。
awk '{system("grep \"^$\" $1")}' input.file
systemが食われたのか、systemの引数の中では引用符が使えないのか、切り分けができません。
0344名無しさん@お腹いっぱい。
2007/04/04(水) 00:26:480345名無しさん@お腹いっぱい。
2007/04/04(水) 01:00:44あそっか、$1は""の外でした。。
awk '{system("grep \"^$\" "$1)}' input.file
本物は業務で使う予定だからコピペできないんだよね。
0346名無しさん@お腹いっぱい。
2007/04/07(土) 02:11:040347名無しさん@お腹いっぱい。
2007/04/08(日) 22:55:59ちゃんと伝わっていなかったようで。
awkの中にシェルの変数の$1入れてもawkがもっていっちゃうからダメなんだって。
0348名無しさん@お腹いっぱい。
2007/04/09(月) 22:22:34そうか?普通に↓とか使えてるぞ?
awk '{sum[substr($0,a,b)]+=substr($0,c,d);}END{for(n in sum)print n,sum[n];}' input.txt
0349名無しさん@お腹いっぱい。
2007/04/10(火) 20:40:57>>343や>>345の例だと、$1をシェルがもっていっちゃって動かないだろうから、
本来やりたいことである
>awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
の問題とは違ったところでハマっているでしょ、ってことを書いただけなんだけど。
($1にはinput.txtを入れたいのだろうと推測)
それに対して、$数字は awkで使用できるよ、と書かれても困っちゃうんだが。
0350名無しさん@お腹いっぱい。
2007/04/11(水) 06:22:32言いたいだろうことは理解するが、347がそれが伝わる書き方とは思えなかったぞ。
例えば、何を誰がもっていっちゃうと書いたか、347と349を比較してみ。
0351名無しさん@お腹いっぱい。
2007/04/13(金) 00:00:330352名無しさん@お腹いっぱい。
2007/04/13(金) 01:37:02フィールドセパレータ(デフォルト空白文字)で区切られたn番目のフィールドを
$nで参照できるんだよな。
awk '{system("grep \"^$\" "$1)}' input.file
で$1はinput.fileから読み込んだカレントレコードの1番目のフィールドを
参照すると。
$数字がawkで使えるのは良いとして結局"や'は
system関数の引数の中で使えるのかどうか?
0353名無しさん@お腹いっぱい。
2007/04/13(金) 16:02:04Debianを使っているときにはUTF-8を、
FreeBSDを使っているときにはEUC-JPを
環境変数LANGに設定するようにしたいのですが
どのようにコードをかけばよいのでしょうか?
0354名無しさん@お腹いっぱい。
2007/04/13(金) 16:07:45uname とか hostname あたり見るとか。
0355353
2007/04/13(金) 16:42:04unameとif文を使えばできると思うんですけど
それでsourceコマンドを実行したときに
ちゃんとわりあたるかどうか・・・
0356名無しさん@お腹いっぱい。
2007/04/13(金) 16:54:07おいおい、sourceなんて使わないよ。
あと、ifじゃなくてcaseを使うのが定石。
case `uname -s` in
Linux) export LANG=ja_JP.UTF-8;;
FreeBSD) export LANG=ja_JP.eucJP;;
esac
0357名無しさん@お腹いっぱい。
2007/04/13(金) 16:55:19なんで source が出てくるのかよくわからん。
0358名無しさん@お腹いっぱい。
2007/04/15(日) 15:34:49Cとかだとswtichは敬遠される傾向にあるけどな。
0359名無しさん@お腹いっぱい。
2007/04/15(日) 17:19:240360名無しさん@お腹いっぱい。
2007/04/15(日) 17:33:16if [ `uname -s` = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ `uname -s` = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi
となって、unameの実行が2回になって無駄になる。
かと言ってunameを1回にしようとすると、
tmp=`uname -s`
if [ $tmp = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ $tmp = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi
となって、シェル変数1つが余分に要るので美しくない。
よって、caseを使うのがモストエレガント。
0361名無しさん@お腹いっぱい。
2007/04/15(日) 17:37:03お前の美学はよくわかった。
0362名無しさん@お腹いっぱい。
2007/04/15(日) 17:41:220363名無しさん@お腹いっぱい。
2007/04/16(月) 19:45:580364名無しさん@お腹いっぱい。
2007/04/16(月) 19:58:240365名無しさん@お腹いっぱい。
2007/04/16(月) 20:37:020366名無しさん@お腹いっぱい。
2007/04/16(月) 22:11:510367名無しさん@お腹いっぱい。
2007/04/16(月) 22:42:570368名無しさん@お腹いっぱい。
2007/04/16(月) 23:46:400369名無しさん@お腹いっぱい。
2007/04/16(月) 23:52:070370名無しさん@お腹いっぱい。
2007/04/17(火) 00:16:38sh
0371名無しさん@お腹いっぱい。
2007/04/17(火) 00:41:10どの OS の?
0372名無しさん@お腹いっぱい。
2007/04/17(火) 00:47:25普通のbshなら.しか使えない。
HP-UXやAIXのshは中身がkshなんで。
0373名無しさん@お腹いっぱい。
2007/04/21(土) 02:11:17http://journal.mycom.co.jp/news/2007/04/20/023/index.html
0374名無しさん@お腹いっぱい。
2007/04/24(火) 14:20:370375名無しさん@お腹いっぱい。
2007/04/25(水) 21:35:530376名無しさん@お腹いっぱい。
2007/04/25(水) 21:45:150377名無しさん@お腹いっぱい。
2007/04/25(水) 21:50:110378名無しさん@お腹いっぱい。
2007/04/25(水) 21:52:270379名無しさん@お腹いっぱい。
2007/04/25(水) 21:55:090380名無しさん@お腹いっぱい。
2007/04/25(水) 22:01:270381名無しさん@お腹いっぱい。
2007/04/25(水) 22:06:430382名無しさん@お腹いっぱい。
2007/04/26(木) 00:34:12その筋質問箱は付いてますか?
0383名無しさん@お腹いっぱい。
2007/04/26(木) 04:36:490384名無しさん@お腹いっぱい。
2007/04/26(木) 10:22:570385名無しさん@お腹いっぱい。
2007/05/02(水) 17:38:53どうすればよいのでしょうか?
sedだと只それだけで一文字目の後ろに改行を挿入してホールドスペースに入れて、
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ てなことして
また連結して改行を削除みたいな、バカ手間が掛かるので投げ出してしまった。
もっと簡潔に出来たら良いなと思うのですが・・・
0386名無しさん@お腹いっぱい。
2007/05/02(水) 17:42:25echo aaa | sed 's/\(.\)/\U\1/'
0388385
2007/05/02(水) 18:42:47しかし、なんでもコマンドを高機能なやつに入れ替えるのもどうかと思うし、
使っているOSがGNUツール群を標準装備していないのもそれなりに理由があるだろうし
高々文字列変換で新たなツールを使うのには、消極的になりますね。
0389名無しさん@お腹いっぱい。
2007/05/02(水) 19:11:07echo "abc" | perl -pe 's/(.)/\U\1/'
0390名無しさん@お腹いっぱい。
2007/05/02(水) 19:18:21■ このスレッドは過去ログ倉庫に格納されています