シェル、オークの質問コーナー

このエントリーをはてなブックマークに追加
846名無しさん@お腹いっぱい。
シェルスクリプト内でcdしても
スクリプトが終るとその子シェルがしんで
結局移動できませんが
親シェルにも移動してもらうにはどうすればいいですか?
>>846
このスレ頭から読んでみ
848名無しさん@お腹いっぱい。:03/01/15 00:04
>>847
わかりますた
ありがとう
849名無しさん@お腹いっぱい。:03/01/15 03:20
some strings not contain bracket <another string> stringsue
↑の行の< >内だけを sed で表示する方法ってありますか?
851名無しさん@お腹いっぱい。:03/01/15 03:53
IFSの中身は改行とタブとスペースらしいですが
それプラス:とかできないでしょうか?
852山崎渉:03/01/15 12:49
(^^)
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`
>>853
マルチキター
>>853
どの辺がわからないの?
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で表示する方法を教えていただけませんか。
>>860
そのネタ飽きた
862名無しさん@お腹いっぱい。:03/01/15 17:34
最後にこれだけ教えていただけませんか。お願いします。
>>860
つうか俺が犬板で答えた。
864名無しさん@お腹いっぱい。:03/01/15 17:37
犬板ていうのはなんでしょうか。どのようにして見ることができますか。
>>864
Linux 板。
866名無しさん@お腹いっぱい。:03/01/15 17:44
>>860
sed 's/.*/another string/'
>>853
>>860
小生、他のスレで見た記憶が・・・
でじゃぶーか・・・
はよねよー
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
$
873871:03/01/20 23:20
>>872
できました。Thanks!
>>871
awkのほうがよくない?
恐ろしく長寿スレが多い板だな。。。
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>
にあたるやつです。
877876:03/01/21 13:38
事故解決しました。すいません。
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 でなく bash だが、目を通しておいて損はない
ttp://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO.html

# 本でなきゃダメ?
全然別人だけどshの入門書探してた。サンクス。
#! /bin/sh
#オッス。
#お願いします。
#ファイル名の拡張子を抽出したいのです。
#$file_listは任意のディレクトリの`ls -rt`です。

for file in $file_list
do

# exprの":"パターンマッチとかmanを見てやってたんですが
# どうも上手くできません。

echo $拡張子
done

#よろしくおながいします。
>>889
basename
>>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
>>893
$? を変数に入れとけば?
>>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/'
904cut 大好き:03/01/26 10:32
>>902
先頭4文字を取り出したいなら
codehead=`echo $code | cut -b1-4`
最後の2文字を消したいなら
codehead=`echo $code | sed 's/..$//'`
905expr 大好き:03/01/26 10:39
>>902
先頭4文字を取り出したいなら
codehead=`expr $code : '\(....\)'
最後の2文字を消したいなら
codehead=`expr $code : '\(.*\)..'
906902:03/01/26 12:49
適当にやっていたら、
codehead=${code::4}
で出来ました。(#!/bin/shだけど、多分bashの構文)

ついでに、質問です。
ImageMagicの質問は何処ですればいいでしょうか?
スレが無かったので、立てようかな?

>>906
くだ質でいいじゃん。
>>900
いえいえ、たかがステータス取るだけでTMPファイル用意するのも
馬鹿馬鹿しいと思ってたので助かります。明日会社で試してみます。
>>893
とった終了ステータスはどう使うつもり?
910889:03/01/26 22:55
>>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 する。
914雨なのね:03/01/27 00:19
>>911
> value_"$hoge"_temp="abc"

eval value_"$hoge"_temp="abc"
915雨なのね:03/01/27 00:28
>全部を単一ファイルにマージして,各行の時間順に再度ソート
>単純にするとえらいメモリ食って遅くなりそうで…

merge sortを使え。

http://mergelog.sourceforge.net/なんてものある
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`"

とやってみたらうまくいったのですが、もっと簡単に記述できますか?
919918:03/01/27 01:29
>> puni="eval echo $`echo value_"$hoge"_temp`"

ありゃ? うまくいってない・・・
気のせいだったみたいです∧||∧
>>915

感謝
921893:03/01/27 23:59
>>909
ごく普通です。終了ステータスが0以外だったらエラーメッセージを吐くだけです。
なのでなるべくステータスの値も出力したくなかったんですが、
もっと詳しく書けば良かったですね。
パイプがサブシェルで実行される事に気づかず、ドツボに嵌ってました。
ちなみに今日思いついたのですが、こんなのもアリかな…と。

(A.sh ; echo ":${?}:") | grep -v '^#' | awk -F: '
!/^:.*:$/{print $0}
/^:.*:$/ {STS=$1}
END {exit STS}'
exit $?
>>910
> 勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
いったいどういうシェルかと一瞬迷ったが、
リネーム用 シ ェ ル ス ク リ プ ト か。
923910:03/01/28 21:16
>>922
おぉ、確かにそう取れる。
いや、ただのムフムフ画像管理用のスクリプトなんですけどね。
これがケッコー懲り出すとメンドーで...
924878:03/02/03 23:40
インフルエンザで一週間寝込んでました(´Д⊂)
>>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
927925:03/02/06 23:10
>925 さん ありがとうございます。

expect調べてみました。
便利なものがあるのですね。

実は簡単なポート監視に近いshellスクリプトを作っているのですが、
これを入れるサーバー(Solaris2.6)が他社の基幹システムの本番機でして、
手続きが少しめんどそうです。でも明日きちんと説明してみようと思います。

#Perlで作られたそういうプログラムがあったのですが、
#Perl入れちゃだめってことでボツってしまいました。・゚・(ノД`)・゚・
>>927
と、レスポンスコードが要るのか、てんで見てなかった。スマソ
929925:03/02/07 00:43
う、いまから検証用スクリプト作ろうかなとおもつていたのでつが、、
とれないんですか、、、、・゚・(ノД`)・゚・

いっそのこと泣きながら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はサーバがお返事がのろいとき適宜いれるべし
>>930
ださっ
932名無しさん@お腹いっぱい:03/02/07 21:06
こんにてぃわ。

いきなりだけど、特定ディレクトリの不特定多数ファイルから該当文字
列に一致するファイル名を抽出しようとし根性が尽きました。

grep と find とパイプを駆使しても知能が足りませんでした。

どうすればうまくいくでしょう?
933ヽ(´ー`)ノ:03/02/07 21:10
>>932
何か抽象的過ぎるな(;´Д`)
 FIND_DIR: 特定ディレクトリ
 STRING: 該当文字列
として、
 find FIND_DIR -name 'STRING'
じゃだめかね。てか、man find しる。
>>932
GNU grep なら -r で。
grep -rl
936名無しさん@お腹いっぱい:03/02/07 23:04
確かに抽象、というかミスでした。

例えば、/hoge 以下の全てのディレクトリの全てのファイルから、文字
列 hage を含む全てのファイル名を表示する・・・場合どうやりますか。

これでお願いします。
>>936
man find しる。
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
>>945
どんなエラーだよ
948名無しさん@お腹いっぱい。:03/02/08 15:36
pythonってどうよ?
>>948
すごいよ。
>>948
ム板に行け。
行末に<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 &
960958
>> 959
どうもです.
それだとw3mが "%s" を引数(URL)だと思っちゃうからダメなんです.

   w3m -o extbrowser="mozilla %s &"
と直接shellからうちこめばうまく行くのですが.