シェルスクリプト総合 その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/
0228名無しさん@お腹いっぱい。
2007/03/08(木) 16:15:29ので不要じゃないわよ>>225
0229名無しさん@お腹いっぱい。
2007/03/08(木) 16:16:49お約束どおり釣れましたよ。おめでとう。
0230名無しさん@お腹いっぱい。
2007/03/08(木) 16:18:58ありがとう。
実際にはdateから自動生成された莫大な
画像データを部分的に抽出しながら動画生成を
行うので
例に出したのより多少複雑に書き直します
seqも実験してみます
0231名無しさん@お腹いっぱい。
2007/03/08(木) 16:20:11[root@localhost /tmp]$ ls
[0-9][0-9].txt
となります。
00.txtから99.txtを作りたいのですが…
0232名無しさん@お腹いっぱい。
2007/03/08(木) 16:20:180233名無しさん@お腹いっぱい。
2007/03/08(木) 16:23:11zsh -c 'touch {00..99}.txt'
とか
0234名無しさん@お腹いっぱい。
2007/03/08(木) 16:26:04どういう結果になってほしいんだろう。
0235名無しさん@お腹いっぱい。
2007/03/08(木) 16:27:16は、書かれてしまったから
touch `seq -s ".txt " -w 99"`.txt
0236名無しさん@お腹いっぱい。
2007/03/08(木) 16:27:590237名無しさん@お腹いっぱい。
2007/03/08(木) 16:28:4900.txtから連番で99.txtまでのファイルが欲しいんでしょ
0238名無しさん@お腹いっぱい。
2007/03/08(木) 16:30:36いつものお約束も釣れましたよ。おめでとう。
0239名無しさん@お腹いっぱい。
2007/03/08(木) 16:31:170240名無しさん@お腹いっぱい。
2007/03/08(木) 16:35:08ありがとうございました!
zshって凄いですね。
でも、それに依存しないよう
>>235さんの方法を覚えます。
0241名無しさん@お腹いっぱい。
2007/03/08(木) 16:38:39exprを使うのが定石。
expr 0$COUNTER : '.*\(..\)'
0242名無しさん@お腹いっぱい。
2007/03/08(木) 16:40:100243名無しさん@お腹いっぱい。
2007/03/08(木) 16:43:230244名無しさん@お腹いっぱい。
2007/03/08(木) 16:46:42seq -f %02g.txt 0 99
の方がエレガント。
0245名無しさん@お腹いっぱい。
2007/03/08(木) 16:53:02-sは間に挟む文字列だから最後の.txtがないと、
00.txt ... 98.txt 99 で終わってしまうぞ。
でも正解は>>244。
0246名無しさん@お腹いっぱい。
2007/03/08(木) 16:57:54確かにこっちなら完璧に出来ますね。
ところで %02g と言うのは何なんでしょうか?
0247名無しさん@お腹いっぱい。
2007/03/08(木) 17:06:19man seq
つーか
man 3 printf
0248201
2007/03/08(木) 18:43:31最後にもうひとつだけ質問させてください。
出力をする時に配列の反対(リバースオーダー)から出力をするのはどうやれば良いのでしょうか?
例えば、
Tokyo
Osaka
Nagoya
とあったら
Nagoya
Osaka
Tokyo
と出力されます。
0249名無しさん@お腹いっぱい。
2007/03/08(木) 18:46:19tac
0250名無しさん@お腹いっぱい。
2007/03/08(木) 18:51:21done | tac
のようにパイプすればいいのではないでしょうか。
tacがない環境では、
for ...
done | sed '1!G;h;$!d'
0251201
2007/03/08(木) 19:14:20これでなんとか単位が取れます
0252名無しさん@お腹いっぱい。
2007/03/08(木) 19:25:380253名無しさん@お腹いっぱい。
2007/03/08(木) 19:46:300254名無しさん@お腹いっぱい。
2007/03/09(金) 00:33:46↓みたいに書いてみたのですがエラーでちゃいます。なぜ??
#!/bin/csh
set ALLCOUNT = 5
@ CT = 1
@ NO = 3
@ CN = ""
while ( $NO <= $ALLCOUNT )
set CN[$CT] = `sed -n "$NO p " job.txt
@ CT ++
@ NO ++
end
0255名無しさん@お腹いっぱい。
2007/03/09(金) 01:11:36配列を使おうと思った時点で負け。別の方法を探すべし。
0256名無しさん@お腹いっぱい。
2007/03/09(金) 01:17:09>>201と同じ学校の人?
0257名無しさん@お腹いっぱい。
2007/03/09(金) 01:19:14ダメっぽ?
>256
いや趣味
0258名無しさん@お腹いっぱい。
2007/03/09(金) 07:50:56それが宿題だとすると、そんな教官がいるような学校に
進学した時点で負け。
0259名無しさん@お腹いっぱい。
2007/03/09(金) 07:52:390260名無しさん@お腹いっぱい。
2007/03/09(金) 07:54:46cshで書かなければいけない合理的な理由は存在しない。
趣味なら自分で研究すること。
0261名無しさん@お腹いっぱい。
2007/03/09(金) 17:07:470262名無しさん@お腹いっぱい。
2007/03/09(金) 19:22:220263名無しさん@お腹いっぱい。
2007/03/09(金) 21:47:41所詮人間がデータ構造を解釈しているだけの話。
0264名無しさん@お腹いっぱい。
2007/03/10(土) 21:31:59というより口だけで実は分からないだけですかおまいら。
0265名無しさん@お腹いっぱい。
2007/03/10(土) 21:37:01宿題かどうかが問題なんじゃなくて、cshのスクリプトは論外ということ。
誰も答えるはずがない。
0266名無しさん@お腹いっぱい。
2007/03/10(土) 21:44:390267名無しさん@お腹いっぱい。
2007/03/10(土) 21:45:26__l // / | \ \\ ゙、 / ̄ ̄ ̄ ̄ ̄ ̄
/ :::|| / / / l l ヽ ヽヽド、 /
l::::::::::|| / / / ! l ヽ ヽ ヽヽ ||:::::ヽ | l 十`` 十_ヽ
斤.::::::::||/ / //! ハ l ! ヽ ', ゙ヽ||::::::::勺 | レ d、 (_| _)
|ll|i :::::::|| l l イ l /!l | ヽ ト、|、 ト、 l l、||::::::::}ll| | ┼‐、ヽ ┴┴
|ll|ヽ:::::|l !l |l!‐!‐ト、l ヽ | l | ヽ | l i l l||:::::::/!l| | ノ 月 l |
|lll| `ー! l | l 」-=ミ|`ヽ ヽ | !-‐!‐|-l、|} l |r、〃|ll| | 二二`` l__ヽ
L!l | l | 〃{ノ::::iヾ ヽ! ,. =-ミ、!ハ l !"´ |ll| | ノ _)
{l |!l | ヽ `ー" ' トイ:::}ヾ | l | |ll」 | ─ァ
ヽ |l !| `二ノ '| || | /\
l |', | /)|l l | ┼‐、ヽ
l | ゙、 ` ´ /-イ| l | ノ
!| \ ヽニヽ , ′/゙! l ∠ '⌒)
| |ヽ、 ー / 〃 | ! | 「
,.rr| 丶、 ,.. '´ト、 l′ ヽ ゚
l::l {:| ` ´ |::}} \______
_. -‐1::ヽ' -、 _,.. -‐ン::|ヽ、
_.. -‐ "´ |:::::::::`ゝヽ /rJ::'"´:::::::! ` 丶、
0268名無しさん@お腹いっぱい。
2007/03/10(土) 21:52:540269名無しさん@お腹いっぱい。
2007/03/10(土) 22:04:010270名無しさん@お腹いっぱい。
2007/03/10(土) 22:11:17毎回、問題を出すのにネタが尽き気味で大変です。
宿題が出た人、どんどんその問題を書き込んでください。
一部変えて出題に使わせていただきます。
0271名無しさん@お腹いっぱい。
2007/03/10(土) 22:19:470272名無しさん@お腹いっぱい。
2007/03/10(土) 22:29:26分かった。
うちで使うスクリプトを問題として出してやる。
0273名無しさん@お腹いっぱい。
2007/03/12(月) 10:34:35tacをシェルスクリプトで書かせる。
0274名無しさん@お腹いっぱい。
2007/03/12(月) 10:47:03そういえば、まだ bash の回答がない。
ttp://golf.shinh.org/p.rb?reverse+lines
この問題にかぎらず、sh で参戦してる人が少ないのでおまいらもやってみてくれ。
おれもがんばってみる。
0275名無しさん@お腹いっぱい。
2007/03/12(月) 17:31:24何も無理してshだけで文字列操作するこたーないと思うけど。
#!/bin/sh
f () { local l; read -r l && { f; echo "$l"; }; }
f
0276名無しさん@お腹いっぱい。
2007/03/12(月) 18:28:56readの -r オプションはbash依存。localコマンドは Bourneで使えない。
あと、再帰呼出しは重い。非再帰版の方がエレガント。
出題ネタにしたいので、回答は省略。
0277名無しさん@お腹いっぱい。
2007/03/12(月) 18:44:38txt=
IFS='
'
while read line
do
txt="${line}
${txt}"
done
echo -n "$txt"
0278名無しさん@お腹いっぱい。
2007/03/12(月) 19:10:00CodeGolfが出ちゃったからbashism上等の答えになったんだと思う。
0279名無しさん@お腹いっぱい。
2007/03/12(月) 19:18:190280名無しさん@お腹いっぱい。
2007/03/13(火) 01:40:570281名無しさん@お腹いっぱい。
2007/03/13(火) 02:44:26>>3
> POSIX: Shell & Utilities (標準規格)
> http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
0282名無しさん@お腹いっぱい。
2007/03/13(火) 09:45:19なるほどね
0283名無しさん@お腹いっぱい。
2007/03/13(火) 20:53:58single quotation mark("'")をエスケープしたいのですが、
次のコードは×となります。
どなたか、どうやって、"'"をエスケープするのか
教えていただけますか?
たとえば、
awk '{printf "\'%s\'", $2}' file
として、
$2フィールドの値を
'AX'
'PY'
'CU'
のように''で囲みたいのです。
0284名無しさん@お腹いっぱい。
2007/03/13(火) 20:57:48'{printf "'
¥'
'%s'
¥'
'¥n", $2}'
見やすいように改行入れてみたが実際にはくっつけて記述。
0285名無しさん@お腹いっぱい。
2007/03/13(火) 21:15:45できました!
ありがとう。
なんでできるのか、もう少し詳しく
教えていただけないでしょうか?
0286名無しさん@お腹いっぱい。
2007/03/13(火) 21:48:08シェルの解釈する文字をエスケープしながらね。
だから、
'{printf "'"'%s'"'\n", $1}'
などでもいい。
0287名無しさん@お腹いっぱい。
2007/03/13(火) 21:49:440288名無しさん@お腹いっぱい。
2007/03/13(火) 22:15:15wget アドレス >>ファイル名
で実行して失敗しました。
どうしたらいいかわかりますか?
0289名無しさん@お腹いっぱい。
2007/03/13(火) 22:19:000290名無しさん@お腹いっぱい。
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でもよいのですが、何かいい方法はありますでしょうか?
■ このスレッドは過去ログ倉庫に格納されています