846 :
名無しさん@お腹いっぱい。 :
03/01/14 23:51 シェルスクリプト内でcdしても スクリプトが終るとその子シェルがしんで 結局移動できませんが 親シェルにも移動してもらうにはどうすればいいですか?
848 :
名無しさん@お腹いっぱい。 :03/01/15 00:04
849 :
名無しさん@お腹いっぱい。 :03/01/15 03:20
some strings not contain bracket <another string> stringsue ↑の行の< >内だけを sed で表示する方法ってありますか?
851 :
名無しさん@お腹いっぱい。 :03/01/15 03:53
IFSの中身は改行とタブとスペースらしいですが それプラス:とかできないでしょうか?
(^^)
853 :
名無しさん@お腹いっぱい。 :03/01/15 16:26
f, f1, f2, f3 という4つのfileにそれぞれ“ls”,“ls -F”,“ls -l”,“ls -lF”と記述されているとする (“”は実際には記述しないし,“”内に改行は存在しません).この条件下で以下のscriptが全体的にどういったものかを 簡単にで結構ですので、説明していただけませんか。お願いします。 #!/bin/sh case $# in 1) com=f1 ;; 2) com=f2 ;; 3) com=f3 ;; *) com=f ;; esac eval `cat $com`
856 :
名無しさん@お腹いっぱい。 :03/01/15 17:02
853です。このscriptによってどういった結果が得られるのでしょうか。
>>856 ふつーに実行すればどういう結果になるかわかると思うんだけど。
>>856 自分でスクリプトを読んでみて、どこまでわかった?
859 :
名無しさん@お腹いっぱい。 :03/01/15 17:26
わかりました。すいません、ありがとうございます。
860 :
名無しさん@お腹いっぱい。 :03/01/15 17:29
できればもう1つお聞きしたいのですが、 some strings not contain bracket <another string> strings...; なる行の< >内だけをsedで表示する方法を教えていただけませんか。
862 :
名無しさん@お腹いっぱい。 :03/01/15 17:34
最後にこれだけ教えていただけませんか。お願いします。
864 :
名無しさん@お腹いっぱい。 :03/01/15 17:37
犬板ていうのはなんでしょうか。どのようにして見ることができますか。
866 :
名無しさん@お腹いっぱい。 :03/01/15 17:44
>>860 sed 's/.*/another string/'
869 :
名無しさん@お腹いっぱい。 :03/01/17 12:43
ファイル中からshell scriptで要素名(またはタグ)を 抽出するにはどうしたらいいんでしょうか?
>>896 と言われましても…どーゆー形式なのかによってやり方は…
一般的にはgrepとかsedとかperlとかawkとかを組み合わせてやるんじゃないんですか?
871 :
名無しさん@お腹いっぱい。 :03/01/20 22:10
sh スクリプト中で、ファイルの内容を一行づつ読んで、 その一行ごとに何かしたいときってどうすればいいんですか? たとえば、 a b c d と書いてあるファイルに対して、 echo a echo b echo c echo d とか実行したいときです。
872 :
名無しさん@お腹いっぱい。 :03/01/20 23:03
>871 $ cat foo #!/bin/sh while read line do echo $line done < $1 $ cat bar a b c d $ ./foo bar a b c d $
恐ろしく長寿スレが多い板だな。。。
876 :
名無しさん@お腹いっぱい。 :03/01/21 13:03
<title>タイトル</title>
の「タイトル」が欲しくて
$ wget -q -O -
http://aaa.bbb.ccc.ddd/index.html | sed -ne 's/<title>\(.*\)<\/title>/\1/p'
とやっているのですが、
<title>
タイトル
</title>
こういう時も対応するにはどうすればいいのでしょう?
emacsだと
<title>[C-qC-j]*\(.*\)[C-qC-j]*</title>
にあたるやつです。
事故解決しました。すいません。 s/<title>\(.*\)<\/title>/\1/p /<title>/{ N s/ *\n/ / s/<title>\(.*\)/\1/p } 書き方的にはこれでオッケーですかね?
878 :
名無しさん@お腹いっぱい。 :03/01/23 23:28
shのtrapについて質問があります。 今、hostAにmain.sh、hostBにsub.shってのがあるとします。 で、hostAからhostBに対してrshの実行が可能だと仮定します。 両方のスクリプトにtrapで、killのシグナル(15)を拾えるように 記述します。つまり、 main.shは ------------------------------------------- #!/bin/sh trap "echo \"main.sh killed\"; exit 1" 15 rsh hostB sub ~sub.sh ------------------------------------------- sub.shは ------------------------------------------- #!/bin/sh trap "echo \"sub.sh kill\"; exit 1" 15 # ずっと2chと出力 while true; do echo "2ch" done ------------------------------------------- です。で、hostAからmain.shを実行すると hostB上でのsub.shが実行されて、ずっと"2ch"の文字列が表示されるんですが この状態で、hostA上の別のコンソールからsh main.shのプロセスをkillしても 終了してくれません。 理想は、main.shをkillすると、main.shでもsub.shでもkillのシグナルを trapしてくれることなんですが、可能でしょうか。 どなたかよろしければご教授くださいm(__)m
879 :
名無しさん@お腹いっぱい。 :03/01/23 23:28
うは、長くなってすみません∧||∧
main.shのtrapにrsh hostB kill -15 PIDって書くのはだめ? PIDはこれまたリモートシェルでps -aef|grep sub.sh|awk '{print $1}' とかで、拾うとか。。。 手元にマシンがないからためせないけど。。。
ちなみにsub.shは、バックグラウンドで起動して main.shをスリープしとかないとPIDは拾えないかもしれない。
882 :
名無しさん@お腹いっぱい。 :03/01/24 15:32
awkを使わないで文字列抽出ってできるのかいな? hoge0 hoge2 mona2 giko0 hoge1 huga0 monaX giko2 の2行目の3番目を表示しなさい!って 一度TEXT化したらできるかもしれないけど あたまいてぇ〜
>>882 head -2 | tail -1 | cut -f3 -d' '
おおおお、そーきたか! 目からうろこです なるほど! TNX
885 :
うんじゃらげ :03/01/25 05:28
/bin/sh の定番本教えてください。 「入門UNIXシェルプログラミング」以外にもお勧めってありますか?
全然別人だけどshの入門書探してた。サンクス。
#! /bin/sh #オッス。 #お願いします。 #ファイル名の拡張子を抽出したいのです。 #$file_listは任意のディレクトリの`ls -rt`です。 for file in $file_list do # exprの":"パターンマッチとかmanを見てやってたんですが # どうも上手くできません。 echo $拡張子 done #よろしくおながいします。
>>889 あーごめん、拡張子を抽出するのね。${var##word} かな。
for file in `ls`
> echo ${file##*.}
この方法だと、tar.gz なファイル名だと gz ってのが致命的だな…
ちなみに、CSHでは。。 #!/bin/csh -f foreach fn (`ls`) echo $fn:e end
893 :
名無しさん@お腹いっぱい。 :03/01/26 02:24
bshでお知恵拝借願います。 どうしてもスマートなやり方が思いつかないもので…。 { A.sh echo $? > tmpfile } | grep -v '^#' ・A.shが吐くメッセージのうち、先頭が#の行だけ出力したくない。 ・A.shの終了ステータスを取りたい。 終了ステータスをファイルにリダイレクトする以外に良い方法はないでしょうか?
へるぷ〜〜 数値 で 10.0 22.1 210.1 20.0 ってhoge.txt があって 全部足したいんだけど… cat hoge.txt | awk '{print $1+$1+$1+$1}' ではだめぽです〜 しぇるでなんとかならんですか?! 10.0 22.1 210.1 20.0 なら足せるのだが…鬱
あ、いや、shellでなくてもなんでもいいんですけど 縦に書かれている数値を横に並べるって方法でも ヒント頂ければ幸いです 10.1 14.2 22.0 ↓ 10.1 14.2 22.0 ってな感じ
>>895 echo `cat hoge.txt`
>>894 % awk '{ total += $1 } END { print total }' hoge.txt
>>889 expr を使うなら
% filename=foo.tar.gz
% expr //$filename : '.*/.*\(tar.gz\)'
右側の部分は正規表現なのでちとめんどいかも。
>>893 ぜんぜんスマートじゃなくて、もしかした sh のバージョンによるかも
しれないけど、こんな感じでどうよ。
((A.sh; echo $? >&3) | grep -v '^#') 3<&1 | cat
最後の cat はてきとうに変えてくれ。標準入力から $? が読めるはず。
( ゚д゚)ポカーン
>>896 恐れ入りました!!、そんな簡単になるとは・・・・・・・・・
>>897 awkはEND がカギなのですね・・・・・・・・
まだまだ修行が足りませんでした逝ってきます
多謝多謝
したの<例>の${code}に処理を施して、先頭の5424を 取り出すにはどうすればいいでしょうか? <例> code=542489 codehead= ${code}を処理する書き方が分かりません!
>>902 cat hoge | grep 'code=' | sed -r 's/.*code=([0-9]{4}).*/\1/'
>>902 先頭4文字を取り出したいなら
codehead=`echo $code | cut -b1-4`
最後の2文字を消したいなら
codehead=`echo $code | sed 's/..$//'`
>>902 先頭4文字を取り出したいなら
codehead=`expr $code : '\(....\)'
最後の2文字を消したいなら
codehead=`expr $code : '\(.*\)..'
適当にやっていたら、 codehead=${code::4} で出来ました。(#!/bin/shだけど、多分bashの構文) ついでに、質問です。 ImageMagicの質問は何処ですればいいでしょうか? スレが無かったので、立てようかな?
>>900 いえいえ、たかがステータス取るだけでTMPファイル用意するのも
馬鹿馬鹿しいと思ってたので助かります。明日会社で試してみます。
>>893 とった終了ステータスはどう使うつもり?
>>891 >>892 >>899 サンクスです。
勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
とりあえず対話形式でターゲットディレクトリ配下のファイル群を
接頭辞+連番+拡張子
に変更するような。
参考にさせてもらいます。
拡張子が無いファイルだとか.tar.gz、tar.Z等の
処理をまだ考えなきゃいけないんですけどね。
感謝
911 :
名無しさん@お腹いっぱい。 :03/01/26 23:49
shの変数名そのものに、別の変数の値を入れるにはどうやればいいのでしょうか たとえば、value_2ch_tempという変数に"abc"と入れるために hoge="2ch" value_"$hoge"_temp="abc" echo value_"$hoge"_temp とするとうまくいきません・・・ どうすればいいのでしょうか。
負荷分散で複数のWebサーバをApacheで立ててるんですが, ログファイルの acces_log にエントリがばらばらになってしまいます。 なので全部を単一ファイルにマージして,各行の時間順に再度ソート したいんですが,どうやれば一番スマートでしょうか?単純にすると えらいメモリ食って遅くなりそうで…
>>912 定期的に別マシンに送って、そっちで merge する。
>>911 > value_"$hoge"_temp="abc"
eval value_"$hoge"_temp="abc"
916 :
名無しさん@お腹いっぱい。 :03/01/27 00:43
>>914 おぉ、ほんとだ
evalって、代入側でも参照側でも使えるんですね
ありがとうございましたm(__)m
変数が展開された後の文字列がevalに渡るから、 代入側とか参照側とか関係なし。
918 :
名無しさん@お腹いっぱい。 :03/01/27 01:18
なるほど・・・。もっとeval勉強せねば。 ついでにもう一つ、上でeval value_"$hoge"_temp="abc"としたときに 他の変数に代入するときは、 puni="eval echo $`echo value_"$hoge"_temp`" とやってみたらうまくいったのですが、もっと簡単に記述できますか?
>> puni="eval echo $`echo value_"$hoge"_temp`" ありゃ? うまくいってない・・・ 気のせいだったみたいです∧||∧
>>909 ごく普通です。終了ステータスが0以外だったらエラーメッセージを吐くだけです。
なのでなるべくステータスの値も出力したくなかったんですが、
もっと詳しく書けば良かったですね。
パイプがサブシェルで実行される事に気づかず、ドツボに嵌ってました。
ちなみに今日思いついたのですが、こんなのもアリかな…と。
(A.sh ; echo ":${?}:") | grep -v '^#' | awk -F: '
!/^:.*:$/{print $0}
/^:.*:$/ {STS=$1}
END {exit STS}'
exit $?
>>910 > 勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
いったいどういうシェルかと一瞬迷ったが、
リネーム用 シ ェ ル ス ク リ プ ト か。
>>922 おぉ、確かにそう取れる。
いや、ただのムフムフ画像管理用のスクリプトなんですけどね。
これがケッコー懲り出すとメンドーで...
インフルエンザで一週間寝込んでました(´Д⊂)
>>880 さん
main.shのtrapにそう記述したのですが
main.shのPIDをkillしてもsignal 15を拾ってくれません(´・ω・`)
それ以前に、main.shのPIDをkillしても終了すらしません・・・
で、rshのPID(なぜか2プロセス立ち上がってます)をkillすると
止まってくれるんですが、これではtrapする意味がないれす。
やっぱり無理なんでしょうか(´・ω・`)
925 :
名無しさん@お腹いっぱい。 :03/02/06 22:35
shのスクリプトでしつもんがあります。 telnet localhost 21 << EOF > RESULT とした時に #cat RESULT Trying 127.0.0.1... Connected to kmdr (127.0.0.1). Escape character is '^]'. のような感じでレスポンスコードがとれません。 # telnet localhost 21 > RESULT # quit だと Trying 127.0.0.1... Connected to kmdr (127.0.0.1). Escape character is '^]'. 220 Welcome To KOMADORI 221 Goodbye. のように取れるのですが、<<を使わないで標準入力にquitを 送る方法がわからないため行き詰まっています。 FTPなら ftp -v -n localhost << _EOF > RESULT #cat RESULT Connected to kmdr. 220 Welcome To KOMADORI 500 AUTH not understood. 221 Goodbye. のようにレスポンスコードが拾えるのですが、、、 telnet -n hoge とかでトレースをとってもレスポンスコードが入りませんでした。 telnetの結果をレスポンスコード付きで拾うのはshellスクリプトでは難しいのでしょうか?
>925 さん ありがとうございます。 expect調べてみました。 便利なものがあるのですね。 実は簡単なポート監視に近いshellスクリプトを作っているのですが、 これを入れるサーバー(Solaris2.6)が他社の基幹システムの本番機でして、 手続きが少しめんどそうです。でも明日きちんと説明してみようと思います。 #Perlで作られたそういうプログラムがあったのですが、 #Perl入れちゃだめってことでボツってしまいました。・゚・(ノД`)・゚・
>>927 と、レスポンスコードが要るのか、てんで見てなかった。スマソ
う、いまから検証用スクリプト作ろうかなとおもつていたのでつが、、 とれないんですか、、、、・゚・(ノД`)・゚・ いっそのこと泣きながらCでがりがり、、、 別プロセス立ち上げて名前付きパイプ経由で とったらうまくいかないかなとか今思いつきました。 できあがったら報告しまふ
930 :
名無しさん@お腹いっぱい。 :03/02/07 17:44
>>925 ( echo quit ; sleep 1 ) | telnet localhost 21
( echo head http/1.0; sleep 1 ; echo \n ) | telnet localhost 80
( echo quit ; sleep 1 ) | telnet localhost 110
( echo helo ; sleep 5 ;echo quit ; sleep 1 ) | telnet localhost 25
sleepはサーバがお返事がのろいとき適宜いれるべし
932 :
名無しさん@お腹いっぱい :03/02/07 21:06
こんにてぃわ。 いきなりだけど、特定ディレクトリの不特定多数ファイルから該当文字 列に一致するファイル名を抽出しようとし根性が尽きました。 grep と find とパイプを駆使しても知能が足りませんでした。 どうすればうまくいくでしょう?
>>932 何か抽象的過ぎるな(;´Д`)
FIND_DIR: 特定ディレクトリ
STRING: 該当文字列
として、
find FIND_DIR -name 'STRING'
じゃだめかね。てか、man find しる。
grep -rl
936 :
名無しさん@お腹いっぱい :03/02/07 23:04
確かに抽象、というかミスでした。 例えば、/hoge 以下の全てのディレクトリの全てのファイルから、文字 列 hage を含む全てのファイル名を表示する・・・場合どうやりますか。 これでお願いします。
du -a /hoge | grep hage | awk '{print $2}' # du より find のほうがいいかな? # オレは手軽なので du 使うけど
expect試してみた。結構便利。 #!/usr/bin/expect set site localhost set from ore@localhost set to posmaster@localhost spawn telnet $site 25 log_file smtp.log expect "220*" { send "helo $site\n" } expect "250*" { send "mail from: $from\n" } expect "250*" { send "rcpt to: $to\n" } expect "250*" { send "data\n" } expect "354*" { send "test\n.\n" } expect "250*" { send "bye\n" } send_user "script_end\n" close exit 0
940 :
名無しさん@お腹いっぱい :03/02/07 23:49
>>933 〜938
どうも!
決戦の日は近いぞ。
ガンバルゾぉぉぉ!
>>940 何と戦うのかは知らんが、manは味方にしとけよ。
>>936 find /hoge -name "*hage*"
943 :
名無しさん@お腹いっぱい。 :03/02/08 01:09
>>936 grep -lr hage /hoge
>>942 そりゃファイル名にhageを含むものだろう。
945 :
名無しさん@お腹いっぱい :03/02/08 15:19
誰かいますか? rm -Rf 'find / -name erogazou' ・・をしたいんですが、 "'" をサブシェルにしてもエラーでした。 察しの通り、rm の man を読んでない結果です。 検索結果に再帰的な問題はありますが、それは別として検索結果からの 該当ファイルとディレクトリを全て削除するよい方法ないでしょうか。
946 :
んにゃ。。。 :03/02/08 15:33
↑解決。 すっかりボケてるよ(w
948 :
名無しさん@お腹いっぱい。 :03/02/08 15:36
pythonってどうよ?
行末に<br>とかつけるにはどしたらいいんすかね? (hoge.txt) hoge huga mona ↓ hoge<br> huga<br> mona<br> 数値だったりする場合もあるので・・・・うにゃ〜
>>951 cat hoge.txt | sed 's/$/<br>/g' > hoge.new.txt
やぱsedでできるのか〜 修行が足りませんですた逝ってきます
>>953 むしろ拡張正規表現だけでいいから覚えれ。
sedでもperlでもgrepでも使えるから便利だぞ。
拡張正規表現ですかGoogってみます ありがとやんした!
http://www.kt.rim.or.jp/~kbk/regex/regex.html ネタが少し古めだけど、正規表現を一通り網羅してあるので便利。
>grepで使用できる正規表現
>egrepで使用できる正規表現
>sedで使用できる正規表現
>awkで使用できる正規表現
>perlで使用できる正規表現
>pythonで使用できる正規表現
>rubyで使用できる正規表現
>gawk 3.0で使用できる正規表現
>Tcl 8.1(以降)で使用できる正規表現
957 :
名無しさん@お腹いっぱい。 :03/02/11 20:26
awkで/begin/,/end/な 感じである範囲を検索しようと したところ行が長すぎると異常終了します まあ途中4kぐらいの行があるんですけど でRSで適当な文字を指定したら その文字だけかけちゃうのね 何かよいやりかたはないでしょうか ちなみにsolaris7です nawkでもだめでした
w3mで放置されたので, こちらで質問します. (よく考えればむこうではスレ違い) シェルスクリプトで default_option='-o extbrowser=mozilla' w3m $default_option みたいにするとうまく行くのですが, default_option='-o extbrowser=mozilla %s &' w3m $default_option だとダメです. どうすればいいんでしょう?
>>958 default_option='-o extbrowser=mozilla'
w3m $default_option %s &
>> 959 どうもです. それだとw3mが "%s" を引数(URL)だと思っちゃうからダメなんです. w3m -o extbrowser="mozilla %s &" と直接shellからうちこめばうまく行くのですが.