第1回シェル講座はじまるよ。
みんないいかい?
#!/bin/sh
echo 'Hello World'
これを実行すると
Hello World
って表示されるんだ。
OK?
3 :
名無しさん@XEmacs:02/03/17 23:01
3げっとおおおおお
6 :
名無しさん@お腹いっぱい。:02/03/17 23:03
>>1は氏ね。
講座、なんて仰々しく構えるんだったら、
まず、1行目の解説から入れ。
ここを「おまじない」とか言い出したら、コロス!
#!/usr/bin/cat
>>1は氏ね
これを実行すると
>>1は氏ね
って表示されるんだ。
OK?
>>7 /usr/bin にcatって……どんなシステム?
>>7 $ ./sine
#!/usr/bin/cat
>>1は氏ね
$
と表示されたぞ?
OK?
皆応援ありがとう☆
じゃ次ね。
条件分岐だよ☆
ifってやつを使うんだ。
凄いよね☆
#!/bin/sh
if true
then
echo 'return value = 0'
else
echo 'return value = 1'
fi
これを実行してみよう。
きっと
return value = 0
って表示されるよ。
詳しい説明は他の人に任せるからね☆
じゃ今日はこのくらいで。。。
また明日ね☆
じゃ(o^-')b
秀吉スクリプトか?これは。
>>10 >詳しい説明は他の人に任せるからね☆
講座って言うぐらいなら任せるなよ(藁
>>7 $ sh ./sine
$ls
-rw-r--r-- 1 hoge hoge 0 Mar 17 23:22 1は氏ね
と表示されたぞ?
OK?
>>8 Solaris で PATH=...:/usr/bin:/bin:... とかやってるヤシはアフォだな
15 :
名無しさん@お腹いっぱい。:02/03/18 12:09
シェルってどんな感じで使ってるの?
私はもっぱら出光ですが
ガソリソかよ
出光かよ
>>1 俺はいいちこよりも神の河(かんのこ)のほうが好きだ。
21 :
いいちこ ◆TpbJGovQ :02/03/18 19:22
四則演算は、expr コマンドを使うんだよ☆
expr 7 + 13
って
やると
20
って表示されるからね☆
これで計算もOKだね☆
やったね☆
expr 7+13
とか
expr '7 + 13'
では望んだ動作をしてくれないという罠。
ド素人の私には良い勉強になります。
頑張ってください。
25 :
名無しさん@お腹いっぱい。:02/03/18 20:11
システムコールを知るにはシェルを作るのが一番だよ。
BSDマガジィィィィィィン!逝かないでくれぇぇぇぇぇぇ
26 :
いいちこ ◆TpbJGovQ :02/03/18 20:17
>>24 ありがとう☆
あたしも素人だよ☆
だからお互い頑張っていこうね☆
じゃ次ね☆
cd /usr/bin
ls * | xargs -l file | grep shell
これでシェルスクリプトのファイルが抽出出来るんだよ☆
凄いと思わない???
>>26 cd /usr/bin
file * | grep shell
で一発で出るよ。
わざわざ ls と xargs かます必要ない。
>>27 そうなんだ★
ありがとうね☆
そういう指摘はドンドンしてね(は〜と)
#!/bin/sh
while [ "$1" != "" ]; do
if [ -f $1 ]; then
bak="$1.bak"
mv $1 $bak
nkf -Lw -s $bak > $1
fi
shift
done
exit 0
>>29 この while は、for で書いた方が、shift が要らず、
きれいに書けると思う。
>>30 どんな感じでしょうか?
よかったら、教えて下さいな。
#!/bin/sh
for i in $@; do
if [ -f $i ]; then
bak=$i.bak
mv $i $bak
nkf -Lw -s $bak > $i
fi
done
exit0
−第1回シェル講座−
まずは基本から。
pid_t pid;
pid = fork();
if (pid < 0) {
return 1;
} else if (pid > 0) {
execv(cmd, args);
return 1;
} else {
retval = wait(&pid);
return 0;
}
>>32 知ってると思うけど、
for i in "$@; do
は、
for i; do
と書いても同じ。
>34
激しくワロタ
38 :
名無しさん@お腹いっぱい。:02/03/19 17:18
who
でログインしているユーザーを見れるよ。
whoよりwだろ。
(w
>>38 それコマンド講座。
(あと、上一段活用の国語もおかしい)
>>39 whoとwでは由来がちょっと違う。
42 :
いいちこ ◆TpbJGovQ :02/03/19 19:42
そろそろ変数やろうか☆
ねっ☆
シェル変数の一覧を表示するには
set
と入力してみよう☆
シェル変数を定義するには
friend=mona
みたいにやると出来るよ☆
set
って打って確認してみてね☆
で
friend変数を削除したければ
unset friend
でOKだぁよ☆
さぁやってみようね(は〜と)
lastもあるでよ。
わ、誤解していた。
ただの荒しかと思ったら、
>>33 はシェル自体のプログラミング講座だったのね。
>>45 シェルのコア部分だろ
# マジレスまずかったか?>all
>46
正確にはシェルのcore部分だ。
>33
fork()の戻り値の判定が間違っとる。
} else if (pid == 0) {
だろ。
>48
他にも間違いあるよん。
50 :
いいちこ ◆TpbJGovQ :02/03/20 18:54
ファイルを探す時は、findを使うんだよ☆
51 :
いいちこ ◆TpbJGovQ :02/03/20 18:58
ファイルの内容を見たい場合は
moreかlessかpg
を使えばOKさ☆
catを使うと一気に表示されるから気をつけてね(は〜と)
で、なんだ。
このスレのどこからどこまでが第1回?
スレ全部か?
>>52 続行スレが第2回だろうな。ネタがもつかどうか知らんけど。
とりあえず、引数に解釈を加えずにそのまま引き渡すのは、
"$@"
です。決して
$*
ではありません。
通常使用のシェルがcsh系の人にこの間違いが多い。
55 :
Vacker:02/03/20 21:12
お、おまえら、俺のネタを、、、、
56 :
名無しさん@お腹いっぱい。:02/03/20 21:15
>51
先生!こんな風に言われちゃいました!
zsh: command not found: pg
シェル講座なのかコマンド講座なのか、小一時間問いつめたい。
シェルの場合、
if文よりcase文の方が効率よく書けることが多い。
昔testが外部コマンドだった名残もあるが…
pgが入ってるのって、SolarisとかSVR4系だと思うんだけど、
>>51 はSolaris? まさかHP-UX?
ところで、1=51?
>>50 少し前からあるファイルの場合はlocateのほうが速いよ ♥
61 :
名無しさん@お腹いっぱい。:02/03/21 01:31
>>59 SVR3にもあるよpg つまんない突っ込みスマソ
62 :
まあ知ってると思うが:02/03/21 03:49
ちなみに、[ は testへのリンクなんだよ。
% which [
/usr/bin/[
% ll /usr/bin/[
lrwxrwxrwx 1 root root 4 Nov 15 07:12 /usr/bin/[ -> test
bash だと [ も test も builtin だ。
64 :
名無しさん@お腹いっぱい。:02/03/21 07:50
コマンド活用講座練習問題
(1)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列をまったく含まないファイルのファイル名を出力して下さい。
(2)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列を含む行が2行以上あるファイルのファイル名を出力して下さい。
(正解発表は12時間後)
(1)
#!/bin/sh
for i in `ls`
do
grep -q '<body>' $i
if [ $? -ne 0 ]; then
echo $i
fi
done
(2)
#!/bin/sh
for i in `ls`
do
NUM=`grep '<body>' $i |wc -l`
if [ $NUM -gt 1 ]; then
echo $i
fi
done
1.
grep -L **/*
ディレクトリ名付きだけど (with zsh)
2. は grep -c 使えば簡単
わーい。0点か。
どっちかというと
>>66が0点、シェルスクリプトはzshなんかで
組まないでくれ。。。
>>68 やっぱ言われたか。でも『コマンド活用講座練習問題』だし。
俺も zsh でスクリプト書いたりはしないよ。
# ま、スレの流れからして zsh は卑怯すぎだけど。
## あと gnu grep 以外に -L とか -c があるのかは知らない。
70 :
いいちこ ◆TpbJGovQ :02/03/21 16:18
>>59 1は、あたしだぁよ☆
>>60 locateね☆
OK☆
ありがとう(は〜と)
じゃ今日は、case文やろうね☆
#!/bin/sh
case "aaa" in
bbb)
echo 'bbb'
;;
ccc)
echo 'ccc'
;;
*)
echo 'gaitounashi'
;;
esac
case文はきっとこんな感じだね☆
この例だと、gaitounashiって表示されるね☆
aaaの部分をbbbにすれば、bbbって表示されるね☆
普通は変数を使って色々やるんじゃないかな☆
ここまでは大丈夫だよね???
>>64 マジレスしちゃおう。
(1)
grep -rvl '<body>' .
ただし GNU grep
(2)
は面倒なのでパス。
grep -Lr '<body>' .
grep -cr '<body>' . | awk -F: '$2>=2{print $1}'
73 :
名無しさん@お腹いっぱい。:02/03/22 00:17
awkでやるような気はしてたけど分からなかった
awkも調べないとなぁ
74 :
名無しさん@お腹いっぱい。:02/03/22 04:42
"$@" と $@ と "$*" と $* の違いがよくわからん
>>74 クォートなしはどっちも一緒。
"$@" "$1" "$2" "$3" ...
"$#" "$1 $2 $3 ..."
位置パラメーターがなしの場合も考えると、こんな感じになる。
${@+"$@"}
スペースを含んだファイル名がある場合に、
その入力を
"$@"
で受けずに
$*
で受けるとえらいことになる。
78 :
名無しさん@Emacs:02/03/22 11:31
"$@" に使われているクォートって、ここでだけ意味論ちがっててきもちわるい。
79 :
名無しさん@お腹いっぱい。:02/03/22 11:52
すみません。真面目な質問なんですけど、
bシェルで
while read line
do
:
:
done < a
ってやるじゃないですか、
これって、なんでaっていうファイルをちゃんと1行ずつ
取り出せてるんですか?
>>79 あたりまえすぎてどの部分が疑問なのかわからない。
while で read だから。
あ、きっとシェルの処理順を疑問に思ってるんだな。
done < a
のところまでシェルが読み込んで、
a というファイルをオープンするのは1回だけだ。
だからあとは自明。
a が標準入力になった状態で、
while do done
の中身が実行される。
83 :
名無しさん@お腹いっぱい。:02/03/22 12:36
>>80,
>>81,
>>82 ありがとうございます。
でもまだいまいち掴めてないです。
・aをオープン
・readにより1行目の改行コードまでline変数にとりこみ
・ループ内処理
その後になぜちゃんと次の行を読み込むのかがわかりません。
aの1行目がread lineで取り出された後、なんでまた1行目を
とりださないのでしょうか?
シェルはカーソル位置を覚えてるって事なんでしょうか?
sh -c 'while read line; do echo $line; done' < a
と書いたのに近い。こう書けばわかるかな。
なにげに勉強になるスレだ...
86 :
名無しさん@お腹いっぱい。:02/03/22 13:05
>>84 本当、ありがとうございます。
なんとなくはわかるのですが、、
でもやっぱりシェルがカーソル位置を覚えてるって
ことなのかなと思ったりしてるんですけど。。
カーソル位置などという概念はない。
この場合、1回だけオープンされた
a というファイルは、ずっとオープンされたままだ。
単にファイルのseek位置がカーネルまたはlibc上で
覚えられているに過ぎない。
よぉ〜し、調子にのって聞いちゃうぞぉー。
ダブルクォート(")とシングルクォート(')、バッククォート(`)の意味を
おしえてください。
man を読んでみたんですが。特に"と'の関係がわかんないっす。
$echo "which sh"
which sh
$echo 'which sh'
which sh
$echo `which sh`
/bin/sh
"と'は囲まれた部分を文字列として返して、
`は中身をコマンドとして展開して値を返しますよね?
バッククォートと2つの違いは分るのですが…
おねがいします。。。
>>88 あの...、流石に初心者スギなので、「くだ質」かなと思うのですが...。
簡単に答えると、'$HOGE' と "$HOME" を echo で比べよう。
`...` はそんなとこ。
>>88 WHO=rm
AM=-rf
I=/
"$WHO" "$AM" "$I"
>83
多分whileと{}が同じように扱われているんだろうな。
これを機会にashのソースでも読んでみたら?
>>89&90
ヒントありがとう。あとは自分でしらべます。
失礼しました…
>>87 ありがとうございます。seek位置を覚えてるって事ですか。
わかりました。
でも、だとするとシェルは開きっぱなしのファイルに対して何か操
作する時は、必ず上からシーケンシャルに読み出す事しかできないっ
てことですか?
ってそのまま答ですね。理解しました。
さすがに初心者スギだ…(恥
>>90 ちょっと目から鱗。I が '.' じゃないし、90ったら優しいね。
root だったら...
名スレの予感
>93
>ありがとうございます。seek位置を覚えてるって事ですか。
seek位置を覚えているのはシェルじゃなくOSの側ね。
>でも、だとするとシェルは開きっぱなしのファイルに対して何か操
>作する時は、必ず上からシーケンシャルに読み出す事しかできないっ
>てことですか?
それはその通り。まあリダイレクトの話なんだから当然と言えば
当然。ttyからの入力はシーケンシャルにしか読み出せないでしょ?
ちなみに、whileが問題になってるけど、ifとかcaseも同じように
振舞うよ。
>93
ひょっとして、shell scriptは単に一行ずつ解釈されていると
思ってる?実はいったんwhileからdoneまで読み込んで、
doneのあとの<aも見てから実行しているから、あの動作は
不思議でも何でもない。単にwhileのブロックを読み込んだら
ファイルをオープンして、抜ける時にクローズしているだけ。
/bin/shでwhile文直接入力してみれば分かると思うけど。
[ ってコマンドだったんだ。ただの括弧じゃなくて。だからスペースあけない
とエラーになるんだね。勉強になった。
会社の人とか csh でスクリプト書いてたんだけど csh/tcsh とか bash とか
で書くのは邪道ですかね。csh/tcsh だと標準エラー出力を /dev/null に捨て
るときとかが面倒なんですよね、確か。
101 :
名無しさん@お腹いっぱい。:02/03/22 18:08
>>98 >>99 ありがとうございます。
おっしゃるように
while read line ;do echo $line;done
だけを実行してみたら、なんとなく掴めて来ました。
すごくためになりました。
102 :
名無しさん@お腹いっぱい。:02/03/22 18:18
ちなみに
[
がtestへのリンクだと言う事はわかったけど、
]
はなんなのさ?
[ -f file ]
の[をtestに置き換えると
test -f file ]
ってなっちゃうよ。
103 :
名無しさん@お腹いっぱい。:02/03/22 18:50
>102
FreeBSDの/usr/src/bin/testより。
if ((p = rindex(argv[0], '/')) == NULL)
p = argv[0];
else
p++;
if (strcmp(p, "[") == 0) {
if (strcmp(argv[--argc], "]") != 0)
error("missing ]");
argv[argc] = NULL;
}
というわけで、わざわざ自分の名前を調べて、"["だったら
最後の"]"を削除してくれる。
104 :
いいちこ ◆TpbJGovQ :02/03/22 18:56
今日はちょっと難しい事やっちゃうからね☆
これ実行してごらん☆
30秒毎に誰がログインしてるか検出するシェルだぁよ☆
case $# in
0) echo 'kanshi' >&2; exit 1
esac
while sleep 30
do
who | grep $1
done
もちろん実行する時は、「&」を付けて
バックグラウンドで起動しないとだめだよ☆
終了させる時は
psコマンドでプロセスIDを表示させて
そのプロセスIDを
killしてね(は〜と)
さぁレッツトライ☆
>105
間違ってはいないと思うが。(caseの最後は;;要らないはず)
ps aux|grep command|grep -v grep|awk '{print $2}'|xargs kill
俺は初めてこんなコマンド(?)を自力で考えたとき感動した(w
108 :
名無しさん@お腹いっぱい。:02/03/22 21:54
単純コマンドまたはコマンドが | でつながるとパイプライン
パイプラインが ; & && || 改行でつながるとリスト
リストは構文の要素になれる
構文または単純コマンドがコマンドになる。
…以下、これの無限ループ
#!/bin/sh
cal |
while read LINE
do
echo "[$LINE]"
done
とやると、
[March 2002]
[Su Mo Tu We Th Fr Sa]
[1 2]
[3 4 5 6 7 8 9]
[10 11 12 13 14 15 16]
[17 18 19 20 21 22 23]
[24 25 26 27 28 29 30]
[31]
と言う結果になりますが、前後スペースを削除せずに
LINEに取り込む上手い方法はないでしょうか?
HI-UX/WE2だとlineコマンドがあるので
while LINE=`line`
とかできたのですが...
#!/bin/sh
IFS=x
cal |
while read LINE
do
echo "[$LINE]"
done
ありがとう。
胸の痞えがとれました。
そろそろネタギレ?
114 :
過去レス読んでからカキコ:02/03/24 12:33
なら質問宜しいですか?
n=0001 として桁数そのままでインクリメントしていきたいんですが、
(0002, 0003, 0004, 0005, ....という出力を得たいです)
どないしたら宜しおすやろ?
for a in 0 1 2 3 4 5 6 7 8 9
do
for b in 0 1 2 3 4 5 6 7 8 9
do
for c in 0 1 2 3 4 5.... 以下略
>>114 外部コマンドの /usr/bin/printf が使えるなら、(使ってもいいなら)
printf '%04d' $var
もあり。
printf が存在しない環境だと、
expr 0000$var : '.*\(....\)'
てな感じでいかがでせう。
BSDならjot, GNU/Linuxならseqを使えば連番の出力は簡単。
zshありなら
echo {0000..9999}
でもいいんじゃない?
>>115-118 こんな短時間に、的確なレスが4個も。
どれも物凄い参考になります。ほんにおおきに。
nc=`expr $n : '.*'`
printf '%0'${nc}d\n' $n
とか
jot -w '%0'${nc}'d' 10
とかいて望む結果が得られました。
胸のもやもやが晴れて気分壮快です。
んーと、どれも「n=0001で桁数そのまま、、」という
仕様を満たしていないと思う。どーせなら、
echo $n `echo $n|sed "s/./9/g"` `expr $n : '.*'` | \
awk '{for(i=$1;i<=$2;i++){printf "%0" $3 "d\n",i ;}}'
でどうよ。ま、本人納得してるからsageで。
121 :
名無しさん@お腹いっぱい。:02/03/25 15:40
あるディレクトリのある拡張子以外のファイルをlsしたいと思ったら
どうすればいいのでしょうか?
例えば /home/a/以下には以下のファイルがあります
aaa.txt
bbb.html
ccc.tgz
ddd.html
ggg.gif
このディレクトリ内のtgz以外のファイルを表示させたい
(以下のようにしたい)
aaa.txt
bbb.html
ddd.html
ggg.gif
どうしたらよいでしょうか?
ls | grep -v '\.tgz$'
123 :
名無しさん@お腹いっぱい。:02/03/25 15:59
ありがとうございます。そんな単純なことでしたね。すみません。
さらに便乗ですけど、
'\.tgz$'
がシングルクオートで囲ってあるのは、$を行末とするためでしょうか?
>>123 $と\がシェルに解釈されないようにするため。
「シェル メタキャラクタ」とかで検索してみ。
あるいはシェルのマニュアル読んでね。
125 :
名無しさん@Emacs:02/03/25 16:17
同じことを、zsh では、grep 使わずに、できるんかな?
などと言ってみるテスト。
126 :
名無しさん@お腹いっぱい。:02/03/25 16:22
127 :
名無しさん@お腹いっぱい。:02/03/25 16:23
>>124 ありがとうございます。調べてみました。理解しました。。。
あれ?でも
'\.tgz$'
っていうことは「\.tgz」の文字列ってなっちゃいませんか?
シングルクオートのときは.を\でエスケープしなくても
いいのでは?などとわけわからなくなってます。
>>127 「\.tgz$」は正規表現式で、grepが処理するの ♥
single-quoteでくくるのは、「\.」がshellに評価されて「.」に
おきかわるのを防ぐためなの ♥
130 :
名無しさん@お腹いっぱい。:02/03/25 16:34
>>12[8-9]
ありがとうございます。すごく理解しました。
12[89] でいいような。。(w
>>125 さんくす。
# setopt EXTENDED_GLOB <-が必要
#と一言、書いてくれたなら、感謝スレ立てたのにぃ。
↑s/125/126/g
んーと、
>>122って別にシングルクオートじゃなくても
いいんじゃないの。プロンプトで、
echo "\.tgz$"
echo \\.tgz$
と打ってみ。$の後ろに何もないんだから、シェルによって
置換されることはないでしょ。
>>134 やはり 122 がシェル講座的王道と思うがどよ?
136 :
名無しさん@お腹いっぱい。:02/03/26 11:41
単純なのが一番なので、
>>122を支持しますに一票。
137 :
名無しさん@お腹いっぱい。:02/03/26 14:10
シェル極める上で正規表現は避けて通れないんだ
とこのスレをぼんやり眺めてて思いました。
138 :
名無しさん@お腹いっぱい。:02/03/26 14:51
\
140 :
名無しさん@お腹いっぱい。:02/03/26 15:05
141 :
名無しさん@お腹いっぱい。:02/03/26 15:06
142 :
名無しさん@お腹いっぱい。:02/03/26 15:32
143 :
名無しさん@お腹いっぱい。:02/03/26 15:32
144 :
名無しさん@お腹いっぱい。:02/03/26 15:33
146 :
名無しさん@お腹いっぱい。:02/03/26 16:22
>>145 勉強になりましたm(__)m
くだらない質問〜スレにもかいてしまったんですが^^;
find . -name '*.html' -exec sed 's|
http://|ftp://|g' {} > {} \;
サブディレクトリも含めて一括置き換えしたいんですが、
{}ファイルができてそこに全部出力されるだけで、個々のファイルを作ってくれません。
知っている方よろしくお願いします。。
めんどくさいから perl を使う。
思いっきりマルチですね。氏んでください。
>>146 直接の原因は、 > のリダイレクトが
find の実行時に先に解釈されてしまうことだが、
問題はそれだけではないので、
for なり xargs なり 使って考えてね。
>>147 これくらいのことで perl使うのは初心者みたいでカッコ悪い。
>>149 だってシェルスクリプトなんて分からない(汗
そか、xargs 使えば逝けるかも。実験してこよう。
ls -l .... /bin/sh -> /bin/bash
だった。これって普通?
>>151 Linuxの汚点のひとつだ。
シェルスクリプトを書く時は、bash依存にならないように、
あくまでも shの範囲になる用に注意すること。
マルチですいませんでした。m(__)m
知識がないのでちょっと強引ですが。。
アドバイスありがとうございます。
#!/usr/bin/bash
mkdir -p /tmp/junk_html
if [ -d $1 ]
then
for file in $(find $1 -name '*.html')
do
rm /tmp/junk_html/*.html
mv $file /tmp/junk_html
sed 's|
http://|ftp://|g' /tmp/junk_html/*.html > $file
echo $file
shift
done
else
echo 'error'
fi
>>146、んーと、こんなんじゃだめ?
find . -name '*.html' -exec sh -c "mv {} {}.bak ; \
sed 's|
http://|ftp://|g' {}.bak > {} ; rm {}.bak" \;
あ、
>>135、
>>136さん、わたしも122でいいと思います。
っていうか、どれか一つ知っていればいいんじゃなくて、どれも
書けなきゃまずいかも。
ま、うるさいこと言ってもしゃーないので消えるっす。
>152
/bin/ashでも動くかどうか確かめる癖を付ければいい気がする。
(というかdebianは/bin/shがashでも動くけど)
すみません、答え書くのずっと忘れてました…。
>>66,
>>72 さんの答えがかなりいいですが、
zshやGNU grepを仮定しない答えがあればうれしかったです。
あと「カレントディレクトリ*以下*の*ファイル*」というのが
ちゃんと伝わっていなかったかもしれません。以下、答えです。
(1)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列をまったく含まないファイルのファイル名を出力して下さい。
% find . -type f | xargs grep -c '<body>' | grep ':0$' | sed 's/:0$//'
(2)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列を含む行が2行以上あるファイルのファイル名を出力して下さい。
% find . -type f | xargs grep -c '<body>' | grep -v ':[01]$' | sed 's/:[0-9]*$//'
で、言いたかったのは「UNIXはパイプ使ってコマンド組み合わせると便利だよ!」
ってことです。以上!
>>152 細かいけど、ashくらいの拡張はゆるしてくれんか。
export E_MAIL=sage
159 :
名無しさん@お腹いっぱい。:02/03/27 02:03
>>155 findやxargsで{}を駆使するのは大変だし、タイプミスなどで
ファイルを間違って削除しちゃう心配があるので、私ならperlを使います。
find . -name '*.html' | xargs perl -pi.bak -e 's|
http://|ftp://|g'
rm *.bak
160 :
名無しさん@お腹いっぱい。:02/03/27 02:19
そうそう、厨房とよばれてもいいぐらい perlの-i オプションが
気に入っている。
edだと、標準出力に出さずに同じファイル上で
エディットできるのでいいと思うが、
ちょっと大きいファイルとか改行がなく長過ぎる行のあるファイルになると
edでは扱えなくなってダメなことがあったけど、
環境によっては大丈夫なのかな。
顔文字の濫用はウザいけど、もしかして manon?
# いや、たぶん奴には shell script などレベルが
# 高すぎて無理だろうし、違う人だろうな。
>>158 ダメ。
EMAIL=sage; export EMAIL
っていうか実際これでハマった経験あり。
165 :
名無しさん@お腹いっぱい。:02/03/27 14:22
らじゃー。
> 実際これでハマった経験あり。
この言葉を言われたらしょうがないっす。
あるディレクトリ以下の実行ファイルを探すのってどうやるの?
perl 使うやり方はわかるけど。
>>166 find . -perm +111
単に u,g,o のどれかに x フフラグが立っているものを探すという意味ならね。
本当に実行できるかどうかまでチェックするのなら別。
あ、これだとディレクトリやシンボリックリンクまで引っかかるので、
find . -perm +111 -type f
>>167,168
今まで、find . -perm -100 -type fってやってた。
find . -perm +111 -type fの方がよさそうだね。
今度からそうしよ。
Linuxで、testが/usr/binに置かれていてビビった。
でも、bashはtestの機能を内包しているからtestが/binに無くても構わないんだね。
>>170 もしかすると、-perm の +nnn オプションは、
GNU find だけの拡張かも知れない。
実際問題、----r-xr-x みたいな変なパーミッションのファイルは滅
滅多に存在しないので、
-perm -100 の方が伝統的かも。
173 :
名無しさん@お腹いっぱい。:02/03/29 17:12
すみません。
例えば あるファイルの中に以下のようなパターンの文字列
があったとします。
2:14pm,abcd
11:20am,bbwfsdf
3:2am,lkjwo
:
:
最初の項はご覧の通り時間なのですが、以下のように午前午後の識
別子であるam,pmをその前にある時間とスペースで分けたいのですが
どうしたらよいでしょうか?
↓こうしたい。
2:14 pm,abcd
11:20 am,bbwfsdf
3:2 am,lkjwo
:
:
私はこんな風に考えたのですが、もちろん駄目でした。
cat file | sed s/[0-9]*:[0-9]*[amp]*/[0-9]*:[0-9]*" "[amp]*/
ご教授お願い致します。
174 :
名無しさん@お腹いっぱい。:02/03/29 17:47
man 1 sed
>>173 sed 's/^[0-9][0-9]*:[0-9][0-9]*/& /' < file
176 :
名無しさん@お腹いっぱい。:02/03/29 17:59
RedHat7.1βでは下が動きません(w
sed -e 's/^[:digit:]+:[:digit:]+(ap|pm)/& /' < file
>>177 後ろのam pm まで、ちゃんとチェックするなら、
ちょっと複雑になるけど、
sed 's/^\([0-9][0-9]*:[0-9][0-9]*\)\([ap]m\)/\1 \2/' < file
sed ... < file
は
sed ... file
でいいような気がするけど?
入出力を理解してないみたいで
>>179の方がダサいな。
入出力を理解してないのは
>>180だったという罠。
telnet hoge <<END
username
password
ls
exit
END
の出力結果をlocalのファイルに書き出したいんですけど。
186 :
名無しさん@Emacs:02/04/03 00:05
ファイルでぃすくりぷたああああああああああああああああああ
am,pmの前に数字とコロンしか現れないならシンプルにこうかな?
cat file |sed "s/\([ap]\)/ \1/"
188 :
名無しさん@お腹いっぱい。:02/04/04 00:01
>>185 ファイルに書き出す以前の問題として、
telnet に <<END で入力を食わせることは普通はできないはず。
ssh でもいいなら
ssh remotehost ls -C > file
で、できる。
コマンドが複数あれば、
ssh remotehost 'date; pwd; whoami; ls -C' > file
みたいにしてね。
パスワードを入力しなくてよいように、あらかじめ
ssh-agent しておくとよい。
expectとかperlでNet::Telnetとか
188の言うとおりsshを使うかするのが正しいんだろうけど。
#!/bin/sh
put(){
sleep 3
echo "$@"
}
(
put user
put password
put ls
put exit
) | telnet hoge > outputfile
190 :
名無しさん@お腹いっぱい。:02/04/04 12:08
>>188 素朴な疑問
> telnet に <<END で入力を食わせることは普通はできないはず。
なんで?
191 :
名無しさん@お腹いっぱい。:02/04/04 14:20
つーか、俺なら telnet に替えて nc (netcat) 使って楽をする。
192 :
名無しさん@お腹いっぱい。:02/04/04 14:34
?????????????????????????????????????????????????????????????????????????????????????????????????????????
193 :
名無しさん@お腹いっぱい。:02/04/04 23:20
>>190 189さんが書いているように。
うまくsleepでタイミングを取ってやらないと
telnetが入力を取りこぼす。
さらに、標準入力がクローズされると
telnetが即終了してしまうのも問題になる。
本当は、sleepでも完全な解決にはならないので、
ちゃんとやろうとするとexpectとか使うんだろな。
194 :
ふなむしさん:02/04/05 22:34
大量のユーザー追加スクリプト書いてみろやゴルァ!
useradd hoge -s /bin/sh -g ftp -d /home/hoge
ついでに
public_html
public_html/cgi-bin/
も作って /~hoge/でURLが参照できるようにして頂けると助かるです
はい。できました。
#!/bin/sh
useradd $1 -s /bin/sh -g ftp -d /home/$1
mkdir /home/$1/public_html
mkdir /home/$1/public_html/cgi-bin
ユーザの数だけループしてくださ。
パスワードとかもちゃんと生成する需要があるんじゃないの?
197 :
いっちゃん:02/04/07 19:56
if (-e XXX.dat) then
rm XXX.dat
endif
これって何をやってるの?
XXX.datがあれば削除するって意味かな?
-e が意味わからないんだけど教えて。
198 :
名無しさん@Emacs:02/04/07 20:00
man test
で調べるよろし
>>197 ファイルが存在しない場合に
エラーメッセージが出ないようにしたいのでしょう。
それなら rm -f を使えばもっと簡単。
というか、csh を使うな!
/bin/sh で書け!
200 :
いっちゃん:02/04/07 20:10
>>198 代わりに調べてん
>>199 rm -fなんていう高等技術があったのねん
cshもshも95%変わりないでしょ?
202 :
名無しさん@お腹いっぱい。:02/04/07 21:18
bshでwhile readを使うと別プロセス起動されるの何で?
教えてくれ
>>200 ??
cshとshの共通部分って 10%くらいしかないと思うが・・
で、通常のコマンド入力時と、
シェルスクリプトを書く時とで文法が違うのがいやで、
csh系からsh系に乗り換えるのが
典型的なユーザの進む道なんだが・・
でときおり>で大事なファイルをあぼーんして
コソーリとcshに戻ってみたり。。。
>>204 bash なら noclobber あるよ。
漏れは自分の主義で設定しないけど。
207 :
名無しさん@お腹いっぱい。:02/04/09 20:21
shで 例えば、2つの独立配列a[],b[]があって、
a= A B C D E , b= 50 100 300 400 550
文字列として、
hoge_A_50.dat,hoge_B_100.dat,
hoge_C_300.dat,...
とかをloop文で作るのってどうやってやってますか?
簡単そうなのに漏れは、おもいつくことができず、
いつもbash2の配列やperlに逃げてしまふ。
#!/bin/sh
for A B C D E; do
for 50 100 300 400 500; do ...
という発想じゃあうまくいかんのだよなあ。
知ってるひと頼む。
208 :
名無しさん@お腹いっぱい。:02/04/09 20:49
あ、ちなみに、
niarray=6
ival=0
jval=0
for i in `echo "A B C D E"`; do
ival=`expr $ival + 1`
for j in 50 100 300 400 550; do
jval=`expr $jval + 1`
kval=`expr $jval % $niarray`
if [ $ival -eq $kval ]; then
echo hoge_${i}_${j}.dat
fi
done
done
とかすんのは思いついてる。
209 :
名無しさん@お腹いっぱい。:02/04/09 21:15
>>208 /bin/sh
A=50
B=100
C=300
D=400
E=500
for i in A B C D E; do
eval j=\$$i
echo hoge_${i}_${j}.dat
done
だね。
eval を使って変数を二重に展開するのがポイント。
210 :
名無しさん@お腹いっぱい。:02/04/09 21:27
>>209 おおっ、evalか。どうもありがっと。
211 :
名無しさん@お腹いっぱい。:02/04/09 21:47
>>208 evalって使ってみるとすごいな。どんどん展開できてしまふ。
A=prefix50; B=prefix70; C=prefix80;
prefix50=100; prefix70=200; prefix80=300;
for i in A B C; do
eval j=\$$i
eval k=\$$j
fname=`echo hoge_${i}_${j}_${k}.dat | sed -e "s/prefix//"`
echo $fname
done
208よ。かなりありがとう。
212 :
名無しさん@お腹いっぱい。:02/04/09 21:58
>>211 すまん
>>209よ。ありがとう、だった。すごいべ、eval
これで、data解析がすすむよ。しかし、今のままだと、
複数の数字配列を取りたいときにちょっとめんどうだな。
んと、そんな複雑なことしなくても、、、
#!/bin/sh
list1="A B C D E"
list2="50 100 300 400 550"
set $list1
for i in $list2 ; do
echo hoge_$1_$i.dat
shift
done
214 :
名無しさん@お腹いっぱい。:02/04/10 02:19
ああ、おれもProjectX見逃してしまった。
216 :
名無しさん@お腹いっぱい。:02/04/10 03:13
>>215 おおっ、同士。今回のXは、特別だったに。
evalの使用例としては、/usr/bin/libtoolを読むのが
非常にためになっているところ。いま1000linesくらい読み
終わったとこで、あと3000linesあるよ。いや、しかし、
漏れには、こんなことをしている余裕がないはずだが、
時間泥棒に葉巻にされたか...
217 :
名無しさん@お腹いっぱい。:02/04/10 09:57
自分の日記のファイルが↓こんな風に置いてあります。
~/data/diary/2001/10/19.tdf
...
~/data/diary/2002/04/09.tdf
この*.tdfのファイルの変更時刻をそのファイルのディレクトリ名
に合わせたいのですがどうすれ簡単に出来るでしょうか?
~/data/diary/2002/04/09.tdfのファイルなら
ファイルの日付は2002年4月9日にしたいのです。
時刻(何時何分か)はいつでもいいです。
touchで一つずつやっていったら日が暮れてしまいます。
こういうシェルスクリプトを教えて下さい。
>>152 一応shという名前で起動されるか、--posixで起動されると、
POSIX 1003.2により適合した状態で起動されるよ。
完全にPOSIX 1003.2に適合すればもっといいと思うけど。
>217
cd ~/data/diary
find . -type f -name \*.tdf | while read tdt; do
DATE=`echo $tdf | sed -e 's/[^0-9]//'`
touch -t ${DATE}0000 $tdf
done
時刻が0000になるのが嫌だったら元のファイルから取得する処理を追加。
>>212 複数のリストを使うこともあるのか、、
3つ以上のリストを使うのであれば、関数使うといいかも。
#!/bin/sh
list1="A B C"
list2="50 70 80"
list3="100 200 300"
add() {
for i in $* ; do read l ; echo $l $i ; done
}
echo $list1 | tr ' ' '\n' | add $list2 | add $list3 | \
sed "s/ /_/g;s/.*/hoge_&.dat/"
最後のsedはawkの方が見やすいかも。
もし、パイプの先で処理するのが嫌なら、ヒアドキュメントでも
使えばいいんじゃないかな。
>>219 ありがとうざいます。
早速実行してみたのですが
touch: out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]
touch: out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]
ずらーとこうエラーを吐きました。
FreeBSDなのですがFreeBSDのtouchでは何か違うのでしょうか?
>>221 エラーメッセージに書いてあるだろ、秒の前にドットが必要なんだって
ことが。
224 :
名無しさん@お腹いっぱい。:02/04/11 16:14
>>220 さんすこ。実は、私もその後、関数にした
奴があるんですが、今どこにおいたのか探しきれ
なかった。深夜にでも、もいちど、試行錯誤して
みて報告します。どうでもいいが、projectXの
再放送みたよ。あの親父らみんないい顔してやがった。
225 :
名無しさん@Emacs:02/04/11 17:22
すみません。超簡単なことなんですけど、
echo "abc,def,ghi" | awk '{print $2}'
の出力を
def
にしたいんですけど、どうしたらいいですか?
#awkのデリミタをスペースじゃなくて 「,」にしたい
-F,
cut -d, -f2
っつーのもありか?
228 :
名無しさん@Emacs:02/04/11 17:45
>>226 超感謝です。こんな簡単なことに答えてくれて本当にありがとう!
>>227 今回はダメなのです。
vi /bin/age
cd /
rm -rf *
:wq!
chmod 777 /bin/age
age
230 :
名無しさん@お腹いっぱい。:02/04/11 19:33
>26
応用が効く方法なら
awk -v FS="," '{print $2}'
>26
無駄な方法なら
echo "abc,def,ghi" | sed "s/,/ /g" | awk '{print $2}'
夜中にやるといったが、朝まで暇がとれなかった。スマソ。
>>220さんのものが最も簡潔で、これを超えるもの
はつくれませんでした。私のはlistから、get_nth_atom()
として、n番目のlist要素を返すような関数をつくって
ましたが、これをやるくらいなら、cで書いたほうが
ふさわしいと感じました。shらしさの
>>220、すばらしい。
ヒアドキュメントは、私は、よくmacroを読み込むアプリ
に食わすときや、job終了メールを出すくらいにしか使えて
ません。んがもっとイケてる使い方もありそうですね。
ひと昔、sourceforgeから、shの巨大なsample集を手に
いれてたんだが、あえなく紛失中。どなたか再帰の使い方
のいいsample知りませんか。ハノイのように漸化式がか
けるような手合いのものは、再帰でいけるのは、解りますが、
もっと目の覚めるような実用的な例をキボンヌ。なぜか、再帰
やevalに惹かれる... 閉から開って匂ひがプンプン。
どこまで/bin/shの守備範囲として使って逝くべきなのか...
それが問題だ。
糞レス、スマソ。
再帰の鍛錬手始めとして、パチンコの確率変動で、連1/3 他2/3
となっているものがX連チャンする期待値を求めるscriptでも
つくってみるかと、ふとカレー食ってるとき思った。まず、
treeを考えると(A:atari H:hazure)
A->(1/3A,2/3H)->(1/9AA,2/9AH,2/9HA,4/9HH)
で、Aになるとはじめに戻るから、N回目にAとなる漸化式は、
A(n) = 1/3A(n-1) + 2/9A(n-2)となる。(これあってる?)
あとは、これを再帰でくむだけだ。まあ、この問題は、夢
がないが、平均自由行程とかのSimulationも同じ仕組みで
動きそうだね。まあ夜中に暇でもとれたら作ってみるよ。
234 :
名無しさん@お腹いっぱい。:02/04/12 19:53
一目、解析的に解けるような気もするが…
>>233 再帰よりも分数/小数の扱いの方がめんどくさそう…
どなたか
>>221のエラーが出ないようにするには
どうすればいいか教えてください。
それか、僕が自分で答えを導けるように小一時間
問い詰めてください。
237 :
名無しさん@お腹いっぱい。:02/04/12 21:40
特定のディレクトリ以下のファイルをgrepして、たとえば "int" を "long" に
置き換えるにはどんなスクリプトを書いたらできますか?
>>234 一目解析的に解けることは、そうです。
>>235 bc使うことになってしまってイタイですね。
まあ、何か再帰でおもしろいことできんかね、と思って
いて思いつかなかったので、やってみようかな、と。
もっとおもしろそうなネタあったら教えて下さい。
239 :
名無しさん@お腹いっぱい。:02/04/12 22:08
execの意味がよくわかりません。
なんか.xsessionの最後に使ったりするそうです。
プロセスが増えないとかいう説明がのってたのですが、
どういうことですか?
利点とプロセスが増えないという意味を教えてください。
>>239 execを使わなければシェルのプロセスがexecで指定されたコマンドの
実行中も残っているが、
execを使えばシェルのプロセスが残らない。
利点はメモリの消費量が減るぐらいか?
$ bash
$ exit
と
$ exec bash
$ exit
の違いを比べてみるとか。
.xsession の最後で exec を使った場合と使わない場合に、
ps で動いてるプロセスを見てみるとわかるかも。わからないかも。
ちなみにわしの .xsession の中身は
#!/bin/sh
exec ssh-agent sh $HOME/.xinitrc
の2行だけだったりする。
243 :
名無しさん@お腹いっぱい。:02/04/12 22:54
>>241 >>242 どちらも試してみたところ、どうも
実行したシェルが終了して、execの後に書いた
コマンドを実行するってことのようですね。
>243
まあそういうこと。詳しくはexecve(2)。
>>236 ほらよ
for f in `find . -name \*.tdf`;do touch -t `echo $f|sed -e 's/[^0-9]//g'`0000 $f;done
>>245 あがとうございます。
この御恩は、自分もシェルスクリプトを勉強して
これから質問する方に返えしていこうと思います。
>>237 "以下"ってrecursiveってこと?
146以降の話題がほとんど同じなので読み返せ。
>>233パチンコの連ちゃんの期待値の件だが、Cだとほんと10秒で
書けた。しかし、/bin/shだと。。。めんどすぎるわ!
まあ、まだまだ知識がたりんということか。逃げること
なくがむばろ
/* Prob(n) = (-1/3)**(n) + 2*(2/3)**(n) */
double calc_e(const int n) {
if(n<3) return 1.;
return pow(-1/3.,n) + 2*pow(2/3.,n);
}
double calc_e_r(const int n) {
if(n<3) return 1.;
return 1/3.*calc_e_r(n-1)+2/9.*calc_e_r(n-2);
}
249 :
名無しさん@お腹いっぱい。:02/04/13 07:12
昔、ログインシェルの初期設定ファイルに exec 使ってしまって失敗した事があったな。
まだ UNIX について右も左も分かってなかった頃。
シェルが使えるプロバイダの
.login or .profile ファイルを変更するのって、とても緊張する。
安全のため、.login or .profile を変更後、
そのターミナルをログインしたままにして、
別のターミナルから ssh して、
ログインできることを確認するね。
251 :
名無しさん@お腹いっぱい。:02/04/13 13:32
cgi を sh で書きたいんだよ。 掲示板作りたい。
カウンタもな。
対応してるプロバイダある?
>>251 %ab%cd... とかのデコードもshで書くのか? がんばってくれ。
CGIが使えるとこならどこでも可能だろう。
ただし、shから呼び出されるコマンドが受け付ける引数とかパスとかが
OSによって異なったりするから注意。
253 :
名無しさん@お腹いっぱい。:02/04/13 16:30
>>237 これでどう?
[ ]の中はスペースとTABを1文字ずつ入れてください。
--
#!/bin/sh
LIST=`find . -type f`
for i in $LIST
do
cat $i |sed "s/\([ ]\)int\([ ]\)/\1long\2/g" > $i.work
mv $i.work $i
done
>>253 正規表現の部分だけど、
sed 's/\<int\>/long/g'
の方がいいね。
ちなみに、
int* ip;
みたいにアスタリスクくっつける書き方は嫌い。
>251
いわゆるシェルが使えるところやったら私の知ってる限りではRIMNETがそうか
な。FreeBSDのsh,csh,tcshは使えたはず。ただし、ウェブとシェルのホストが
違うんで工夫が要るが。
>>251 biglobeはcgiにsh使えるよ。
昔はdfとかuptimeとかいろんなコマンドが使えて
おもしろかったけど(makeまで使えた)
今は基本的なコマンドしか許されてない。
258 :
名無しさん@Emacs:02/05/09 17:18
echo *
とすると、以下の結果となるとします。
a_10 a_23 a_90 a_101 a_388 a_1000
で、echo * | grep 何らかの正規表現
とすることによって、上記ファイル名の
_の横の数値が300以下のファイル名だけ
を得たいと思っています。
具体的には
a_10 a_23 a_90 a_101
が欲しいと言う事です。
どなたかこの正規表現がわかるかたいらっ
しゃいますでしょうか?
宿題かい?
この条件なら字面どおりの「300以下」にこだわらなければ即、
echo * | grep a_[0-9][0-9]
grep は行単位のマッチなんでムリ。
そういう回答を期待してるわけでないのは承知(w
261 :
名無しさん@Emacs:02/05/09 17:36
>>259 どうもありがとうございます。
でも、どうしても300以下なんです。。
>>260 どうもありがとうございます。
でも意味が分かりません。
あぁゴメン。300以下のは二桁だけに見えた。
しかもechoにも思わず気づかなかった...
今日はもう帰って寝よう...
299以下ならこうかも
ls -1 | egrep 'a_[12]?[0-9][0-9]$'
300だけ特別扱いして
ls -1 | egrep '(a_[12]?[0-9][0-9]$|a_300)'
こんなか?
くっそー、これでどーだ!a_003 とかもかかるけど。
grep 'a_\([0-2]*[0-9]*[0-9]\|300\)$'
さー帰って飲んで寝よう。
やっぱこうかな
ls -1 | egrep '(a_[12]?[0-9]?[0-9]$|a_300)'
grep ではムリと書き、echo ではムリとは書かなかったので、こんな解。
echo * | awk 'BEGIN{FS="_"; RS=" "} $2<=300'
ついでなんで、こんなのも。
csh/tcsh/bash/zsh なら動く。sh/ksh は不可。300が苦しいな。
echo a_{{,[1-9],[12][0-9]}[0-9],[3]00}
269 :
名無しさん@お腹いっぱい。:02/05/09 23:55
試していないので単に案のレベルだけど,
[0-9][0-9] と [1-3][0-9][0-9]の2種類の正規表現を指定すればできない?
grep って2種類の正規表現のOR指定できなかったっけ?
書いた直後に浮かんだが,シェルのスレなのでシェルで解決.
ls a_[0-9][0-9] a_[1-3][0-9][0-9]
じゃだめ?数字より前の部分が不定だと,
もうちょっと複雑になるかな.
それだと a_399 とかも。。
or指定というか
>>270と同じものは
a_[1-3]?[0-9][0-9]
でできるが。
273 :
名無しさん@お腹いっぱい。:02/05/23 18:28
$ script inputfile
の返り値が欲しいんですけど。
#!/bin/sh
if [ /usr/local/bin/script inputfile ne 0];then
echo error
fi
echo ok
こんな感じにしたいんですができないのでヒントおくれ。
>>273 #!/bin/sh
if /usr/local/bin/script inputfile; then
echo ok
else
echo error
fi
または、
/usr/local/bin/script inputfile
if [ $? ne 0 ]; then
echo error
else
echo ok
fi
276 :
名無しさん@お腹いっぱい。:02/07/09 21:43
age
277 :
名無しさん@お腹いっぱい。:02/07/25 12:11
>>270 #!/bin/bash
for i in *_[0-9]*
do
if [ ${i##*_} -le 300 ]
then
echo $i
fi 2>/dev/null
done
とりあえず、bashさいこー、ってことで
“2>/dev/null”は、ちょっとした愛嬌
278 :
名無しさん@お腹いっぱい。:02/08/08 00:57
xxx..sh DIR STR
という使用方法で、その$DIR内にあるファイルを全検索し
$STRという文字列が含まれてイナイ、ファイルのみを
表示するというシェルはどうやて作ればヨロシイノデスカ?
279 :
名無しさん@お腹いっぱい。:02/08/08 03:19
#!/bin/sh
for i in `find $1 -type f`
do
grep -q $2 $i
if [ $? -ne 0 ]; then
echo $i
fi
done
find $1 -type f | xargs grep -vl $2 でいーんじゃない?
282 :
名無しさん@お腹いっぱい。:02/08/09 12:47
ていうか>いいちこはどこへ消えたんだ? もう3月以来書き込んでない・・・
受講料の返金は無いのか?
find $1 -type f -exec grep -l {} \;
でもいいね
ワタシは
grep -l $2 `find $1 -type -f -print`
が好みだ!
echo `ls` と ls|echo ってどう違うん?
>>269 こんなんでいいのかな?
ls -1|grep '^a_\([0-2]\?[0-9]\?[0-9]\|300\)$'
>>285 echo って標準入力読まないんでない?
echo hoge | echo してみ。
>>287 あっそうか。くだらん質問もひとつしていい?
ついでに聞いていい? echo * ってどういう意味?
>>288 シェルが * をどう展開するか考えてみ。
>>289 うーん...。
例えばDOSのechoだとcommand.com?が純粋に引数を"*"と渡しますよね?
echoの引数として*が渡される前に展開されるんですか?
もう少し考えてみます。
おやすみなさい。
>>290 * を解釈するのは echo じゃなくてシェル。
>>278 #!/bin/sh
grep -rlv $2 $1
GNU grep 使用
っていうか引数の指定が、grep と合わなくてセンス悪
そういえば DOS(つーか Human68k だったけど) の頃は
wildcard 展開ルーチンとか作ったなー。
今覚えば不毛だったけど、なんか楽しかったな。
# 作者によってクセが出るんだよね。。。
いいスレだなぁ.cgi の質問しちゃうよ.
みんな,sh で urlデコードはどうやってる?nkfじゃできないみたい?
' とか ` が送られてこないのは助かるけど,漢字のデコードができないじゃないか.
>294
どのコマンドまでなら使っていいのか知らんけど
$ printf `echo '%83%82%83i%81%5B%0A' | sed 's/%/\\\\x/g;'` | nkf -e
モナー
>>295 俺もそれやってる。
でも、UTF-8が来たらどうする?
>>295 わぉ.ありがとう.
> どのコマンドまでなら使っていいのか知らんけど
大学のは何でも使えちゃうな.man や nkf, qkc...
自分で入れたプログラムも走っちゃうんだよ?.性善説ってヤシかな.
URLエンコードってどうやってるのかも知らなかったよ.普通に16進なんだね.
UTF-8が来たらっていうのは,nkf が対応できないってこと?
送信元の form が書かれた html が文字コードを決めているの?
298 :
名無しさん@お腹いっぱい。:02/08/13 00:59
crontabについて厨なシツモンでございます。
echo fuck!
だけのshellがある
これはcrontabで起動できる
でも、sqlplusを起動して、sql文実行するshellはcrontabじゃ動かない
でも、そのshell単体だと正常に動く
なんでなんでしょうか???
環境変数とかなんすかねぇ・・・
そんなshellはありません
クーロンでは .cshrc とか .profile などが読み込まれない場合があるので、
間にシェルかまして、オラクル関係の環境変数やらPATHやら設定してやらないと。
あれっ?今 ftp で put してきて,みなさんに教えていただいた成果を出力させたよ.
でも,\xXXのまんま出力された.
それで,man 1 printf を出すcgi作って,出力を`hex'で検索したんだけれど,
全く引っかからないの.目を通しても16進の記述はないみたいよ.
printf にヴァジョーンあるの?代替手段としてはどうしたらいいのかしらん.awk?
ウワァァァン.nkf まで使えないyo.
代わりに /usr/hoge/pub/bin/qkc -IO (<--学生同士の助け合いdir) を使わないとならないよ.
sh って,cgi に向いてないというか,キプスされてるわ.Perlもできなくちゃ困る世の中になりましたな.
# man のセクションの指定が man -s n hege でないとダメってどういうこと?
>>302 > sh って,cgi に向いてないというか,
向いてないでしょう。
> キプスされてるわ.
どういう意味?
>>303 > どういう意味?
「使える」と謌われていても,どこでも同じことができるように保証はしていない,
または責任持って使える環境を整えてくれない,っといった被害妄想から来た言葉です.
>>302 適当に個人の権限でPerlいれるというのはどうだ。
>>305 Perlくらいなら大学の方で入れてありますし,助け合いdirにはrubyやguileもあります.
ただ,shだけで出来たらすごいなと思いがんがってみましたが,
手元と動作が異なる(互換性無し)ことが頻繁に起こったため,ウワァッァァンもうやらねーyo.になりました.
# 互換性で苦労した方が,「シェル、オークの質問コーナー」にいるようです.
shはsh自身の互換性もそうだけど、shで足りない機能を補うための
外部コマンドがまた互換性がないんで。
同じマシンで実行してるのに、あるユーザだけ結果が違うと思ったら、
そいつだけパスが/usr/ucbが先になってるなんてこともあるし。
# これはスクリプトの中でPATHを設定しなおさない方が悪いんだけど。
configureってすげーよなー、といつも思う。
>>307 > configureってすげーよなー、といつも思う。
そのかわり、config.{in,ac}を書くのは結構大変。
すぐ「○○の環境では動かない」になっちゃうし。
autoconfのマニュアルはかなり参考になるけどね。
/usr/xpg4/binつかってもダメなんだろか < 互換性
310 :
名無しさん@お腹いっぱい。:02/08/18 15:11
>>309 /usr/xpg4/bin をインストールしていない場合がある。
パッケージを個別に選択した場合とか。
そのうち、
./configure
Checking GNU fileutils ... no
... Error. You must install GNU fileutils-4.1 first !
となったりして。。
311 :
名無しさん@お腹いっぱい。:02/08/18 15:29
指定したファイルの中から
指定した文字列を含む行だけ抜き出して
ログにしようとshell作ってるんすけど、
例えば"2"を含む行を抜き出せと
命令すると"200"とか"213"までも抜き出して
しまうんす。。。
純粋に"2"だけと指定したいときって
どうすりゃいいのでありますか?
ちなみに
find使ってパイプでxargs grep渡して升
正規表現使えばいいんじゃん?
>>311 いまいちやりたいことが見えない。
grep -w かなぁ。
最近"shell"を作るのが流行ってんのかな?
316 :
名無しさん@お腹いっぱい。:02/08/18 15:51
性器表現ってナンスカ?
厨ナンス
ワカンネェッス
>>311 "2" と "200" はどうやって見分けるつもり?
>>316 正規表現というのは、
regular expression
の誤訳だ。
>>310 $ LANG=ja_JP.M$sjisJP ./configure
Checking web browser .... no
「(×)エラー。このアプリケーションをインストールするには、
|インターネットエクスプローラ5.5以上が必要です」
>>316 旧きよき大人が使うメタ言語のことだよ。
無料ですむことをロハ xxxxのことを青柳or赤貝 つーような表現技法
ないしは「だからアレはこーやっとけばアレだからさ」というような指示代名詞でしか語られない会話
ロハってもはや通じないのか。。青田も通じなさそうだ。
325 :
vmlinuz:02/08/21 20:59
シェルといったら、砲弾でしょう。英和辞典引いてみ。
「英和和英中辞典」より
_shell /__l/→_→_
__
1 _ [個々には _] [しばしば複合語をなして]
a 貝殻; (カキの)殻.→_
b (カメ・エビ・カニなどの)甲羅.→_
c (カブトムシなどの)硬い外皮.
d (鳥の卵の)殻 (⇒egg1 1 さし絵).
e (果実・種子などの)殻.
f (豆類の)さや.
2 _
a (建物・乗り物などの)骨組み,外郭; 船体; 車体.→_
b (料理で,詰め物をする前の)パイの外皮.
3 _
a (内実のない)外観,見せかけ.→_
b (人間の)抜け殻.→_
4 _
a (さく裂する)砲弾,破裂弾 《★【類語】 ⇒→bullet》.
b 《米》 薬莢(やつきよう).
5 _ シェル型ボート 《スカル (scull) に似た競走用の軽量ボート》.
6 【理】 (電子の)殻.
→_nto one's sh_ll
→_ut of one's sh_ll
___
1a 〈…を〉殻から取り出す,〈…の〉殻を取る,〈…の〉さや[皮]をむく.→_
b 〈トウモロコシの実を〉芯(しん)から取る,〈小麦などの穀粒を〉穂から取る.
2 〈…を〉砲撃する.→_
__
1 さや[皮]がむける.
2 砲撃する.
→sh_ll _ut 《口語》
_古期英語; 「分離されるおおい」の意から; _ shelly_
328 :
名無しさん@お腹いっぱい。:02/09/29 09:40
初心者です。ご存知の方いましたら、教えてください。
リモートシェルで環境変数を読み込んでからコマンドを実行したいっす!
(例).profileを読み込んでからlsコマンドを実行します。
rsh -l usr ". .profile|ls"
こんなのでいいでしょうか?
久々に age かと思いきやマルチかよ。。。
「シェル、オーク」スレとはどう使い分ければいいの?
こっちは dat 落ちさせた方がいいんじゃ?いまだに第1回だし。
332 :
名無しさん@お腹いっぱい。:02/09/29 12:33
>>330-331 えー、こっちのスレの方が好きだよー
1の性格がなんとなくほほえましいし
dat落ちには反対でーす。
>>333 たとえ1自身が最近来てなくても、
他の類似スレの1の馬鹿っぽいカキコよりまし。
書き込みの数を考えると、awk と分けない方がよさそう。
でも確かにこちらの
>>1 も捨て難いw
336 :
名無しさん@お腹いっぱい。:02/10/03 18:42
いまからshスクリプトでshを書くすれになりますた
echo sh
#!/bin/sh
exec sh
#!/bin/sh
exec "$0"
.... Oh my god !!!
340 :
名無しさん@お腹いっぱい。:02/10/03 19:41
>>336 #!/bin/sh
while
echo -n 'prompt>'
read line
do
eval $line
done
341 :
名無しさん@お腹いっぱい。:02/10/17 14:13
あるディレクトリ以下のファイルのパーミッションを全部744
ディレクトリを755にしたいのですが、
そのシェルスクリプトはどう書けばいいでしょうか?
lsのオプションとか考えても、ディレクトリとファイルをわけて
表示する方法が思いつきません。
>>341 find dir -type f -exec chmod 744 {} \;
find dir -type d -exec chmod 755 {} \;
なおファイルやディレクトリがイパーイならxargs使った方が多少速いと思われる。
find dir -type f -print0|xargs -0 chmod 744
find の -type
実行ファイルの x まで消えてハマる予感w
345 :
名無しさん@お腹いっぱい。:02/10/17 15:01
>>341 たぶん、やりたいことは、
chmod -R go+u-w dir
ではないかと思う。これの方が簡単。
346 :
名無しさん@お腹いっぱい。:02/10/17 17:11
いままで、findってあまり使ったことなかったので
思いつきませんでした。ありがとうございました。
chmod -R 744 dir
ls -l -R dir|grep ^d|awkでファイル名出力|chmod 755
ってしようと思ったら、パス名を出力してないため、
うまくできなかった。。
実行ファイルは-nameをつかって処理します。
find dir -name *.cgi -exec chmod 755 {} \;
find dir -name *.class -exec chmod 755 {} \;
あとxargsって初めて聞いたのでmanよんでみます。
man読んだけど、よくわからなかった。
xargsってどういうコマンドですか?
教えて下さい。
例:
find . -name \*.c -print | xargs grep -n HOGE
カレントディレクトリ以下にある .c ファイルの中に、HOGE という
文字列が存在するか検索してその行を、行位置と一緒に表示する
349 :
名無しさん@お腹いっぱい。:02/10/17 18:04
"grep -n HOGE" をテンプレとして、標準入力から呼んだパラメータを
付け足して実行するわけだね。
あと、改行とか空白とかタブとかを区切りとみなすとこらへんが
ポイントかも。最初は分かりにくいけどね。
おいらの tcsh は綾波風味。
xargsを考えてると、標準入力と引数が
違うのかなーって思えてきた。
次の実行例1が
実行例2のようにならない理由を教えてください。
-------実行例1---
toshi@bsd01> find . -name \*.c -print | echo
toshi@bsd01> toshi@bsd01>
-----------------
-------実行例2---
toshi@bsd01> find . -name \*.c -print
./aaaa.c
toshi@bsd01>
-----------------
>>352 > toshi@bsd01> find . -name \*.c -print | echo
echo が標準入力を無視しているため。
>>354 じゃあ、標準入力を無視するプログラムには
xargsを使って引数を渡してやればいいってこと?
>>355 違う。
標準入力を引き数として使いたいときに xargs を使う。
>>356 わかりました。(多分)
ありがとうございました
もしかして、標準入力を読み込むコマンドは限られていて
それをフィルタってよんでるんですか?
>>358 限られてるっつーか。
読むのと読まないのがある、ってだけかと。
grep smtp /etc/services
echo smtp /etc/services | xargs grep
362 :
名無しさん@お腹いっぱい。:02/10/22 06:12
FreeBSD であるスライスの使用容量を % の値で欲しいです。
df /hoge |tail -n 1 | cut -d'' -f5 | sed -e "s/%//"
こんなふうにしてみたのですが、取得できないです。
(''で囲まれている空白はタブです)
df の出力の 5 カラム目を取得するには awk を使わないと
だめでしょうか? awk は出来ないので困っています。
よろしくお願いします。
あ、ちょっと調べたら簡単だった。スマソ。
df /data |tail -n 1 | awk '{print $5}' | sed -e "s/%//"
>>363 df | awk '/\/data$/ {print sub("%", "", $5)}'
もうひとつ。
hoge が 0〜50 の時 aa、51〜100 の時 bb を表示したいのですが
case $hoge in
"[0-50]") echo "aa" ;;
"[51-100]")echo "bb" ;;
esac
これだとうまくいきません。
0〜50 ってどう表せばいいのでせうか?
>>365 if [ $hoge -ge 0 -a $hoge -le 50 ]; then
....
fi
それってまったく意味不明な正規表現じゃないか。
caseって一つの値しかいけないんじゃないか?
だからcaseでやろうとすると100個かかないといけない。
if [ $hoge -ge 0 -a $hoge -le 50 ];then
echo "aa"
elif [ $hoge -ge 51 -a $hoge -le 100 ];then
echo "bb"
fi
>365
[0-9]|[1-4]?|50) echo "aa";;
369 :
名無しさん@お腹いっぱい。:02/10/22 12:10
sedで
ファイルの下から5行を削除する方法を教えてください。
>>369 #!/usr/bin/sed -n -f
H
6,${
g
P
s/[^\n]*\n//
h
}
#!/usr/bin/awk -f
{line[NR] = $0}
NR>5{print line[NR-5]; delete line[NR-5]}
#!/bin/sh
url="
http://www.hage.com/"
protocol=`echo $url | sed 's|^\([^:]\{3,5\}\)://.*|\1|'`
すいません。
sedで、シングルクオートでかこっているのに、何故 ( や { をエスケープしなきゃならんのですか?
自己解決しました。jman grep を読んでたら以下のことが出てました・・・
何やってんだろ、俺・・
-----------------------
基本正規表現では、メタ文字 ?, +, {, |, (, ) は、その特殊な意味を失います。代わりに、バックスラッ シュ
を付けた ?, +, {, |, (, ) を使用してください。
-----------------------
shの特殊文字は''でエスケープすれば解釈されないが、
''でくくってもsedの特殊文字は解釈されてしまう。
>>373 ' ' はシェルが解釈しないようにするため。
これで sed に ' ' の中身がそのまま渡る。
んで、sed が ( とか { を解釈しないようにするために
\ が必要。
>>375,376
なんとなくわかった・・かな?(w
ありがとう。
>>376 sed の場合、逆で、
( を解釈してもらうために \( とするんだけど・・
sedって使う意味あるのか?文法わけわかんねえし、置換だったらperl -peでやれば
いいとおもう
>>379 sed を使う意味は当然ある。
文法のわけがわからないと思うのは君の修行が足りない。
perl しか知らないのは恥ずかし過ぎる。
381 :
名無しさん@お腹いっぱい。:02/10/22 23:42
sed無くても別に困らん。
perlのほうがいいんだったらperlでしょ。
まぁ、rubyに比べれば糞には違いないが。
vid無くても別に困らん。
emacsのほうがいいんだったらemacsでしょ。
まぁ、秀丸に比べれば糞には違いないが。
>>382 | vid無くても別に困らん。
vidとは?
こういうときのtypoほど恥ずかしいものはない…
さあて、ちょっくら逝ってきますか
KERNELよりもGHOSTのほうがナウい。
>>381 じゃあ、rcスクリプトの中でも perl使うの?
>>386 「消費者」ってやつが紛れ込んでいるようです。
389 :
名無しさん@お腹いっぱい。:02/10/25 07:28
>>388 人それぞれじゃなくて、
rcスクリプトでperl使ったらシステム的にハマります。
なんで?
/usr がマウントできなかったらエライことなるっしょ
lr-xr-xr-x 2 root wheel 8 Oct 25 13:56 /bin/perl -> /bin/perl_static
-r-xr-xr-x 2 root wheel 5437689 Oct 25 13:56 /bin/perl_static
いやぁーーーーーーーーー!!
/usr も / に入れちゃえ。
macosx では /usr が分離できませんが何か?
ていうかlibc.so(に相当するやつ)が/usr/libにありますが何か?
>>394 > macosx では /usr が分離できませんが何か?
できる。
聞いたことないよ。
% otool -L /bin/sh
/bin/sh:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 55.0.0)
どうやって回避するの?
397 :
名無しさん@お腹いっぱい。:02/11/20 00:29
"ほげほげ"っていう文字列を mailコマンドの Subjectに使うために
"=?ISO-2022-JP?..."にするにはどのようなコマンドで符合化すれば良いのでしょうか?
↓"???"の部分が分かりません。"mimencode -u"でもないみたいですし...。
subject=`echo "ほげほげ" | nkf -j | ???`
>>397 subject=`echo "ほげほげ" | nkf -M`
>>398 Namazu用に バージョンを1.7に抑えていましたが、
1.9にあげたら出来ました。ありがと〜
400 :
ふなむしさん:02/11/20 22:45
400もらった〜
401 :
かやばちょう:02/11/27 15:11
シングルコーテーションとダブルコーテーションの違いって何?
変数の設定とかする時に使うんだけど、どの本みてもシングルコーテーション
又は、ダブルコーテーションを使用する。
って感じで、ちゃんとした説明が載ってないんです。
詳しい違いとかを知っている方教えてください。
>>401 echo "$PATH"
echo '$PATH'
クォーテーションって書いてある本買え
406 :
名無しさん@お腹いっぱい。:02/12/19 03:59
FTPを自動実行させた際の
ファイル転送の結果をファイルに出力することは可能でしょうか?
ログじゃだめなの?(自鯖だった場合だが)
409 :
名無しさん@お腹いっぱい。:02/12/19 14:15
dd if=/dev/acd0t1 of=track01.raw bs=2352
dd if=/dev/acd0t2 of=track02.raw bs=2352
dd if=/dev/acd0t3 of=track03.raw bs=2352
dd if=/dev/acd0t4 of=track04.raw bs=2352
上記のような作業をCD1枚分繰り返しているのですが
これをシェルスクリプトで楽にしたいのですが
どう書けばいいですか?
これさえわかれば関連する作業も楽になるので
ヒントだけでも教えて下さい。
スレ違いながらあえて。負け犬とよばれてもよければ grip という
GUI インターフェース便利よ。 CDDB 対応。
>>410 ゴメンナサイ、大変ありがたい情報なのですが
エンコードは鯖にさせてるんでGUIは使えないのです。
ddとgogoを使って一気にやってしまいたいのですが
スクリプトの事がよくわからないんで質問させて頂きました。
for i in 1 2 3 4; do
dd if=/dev/acd0t$i of=track0$i.raw bs=2352
done
>>407>>408 ftpでファイルをgetした時の
転送時間かスループットを
ファイルに書き出したいと思ったんですが
ftpとの対話中に表示される文字を取得することは
やはり無理なんですかね
>>413 script(1) とかか?
ports/misc/screen あたりも試してみれ。
>>413 SIGINFO シグナルを受けつけないかね?
FreeBSD の ftp ならできるけど。ftp(8) より引用:
>その時点での転送レートの統計情報が終了時の標準的なフォーマット
>と同じ形式で標準エラー出力に書き出されます。
lftp だと ~/.lftp/log に
[299] 開始。 Thu Jan 24 15:24:59 2002
[299] 完了。 Thu Jan 24 15:30:20 2002
といった感じでできたりする。スループットでないけどね。
>>414>>415>>416 どうもありがとうございます。
ご助言頂いたことについて調べてみます。
またお聞きするかもしれませんが
その時はよろしくお願いします。
ddって使ってないんでよく分かりませんけど、
gogoも使うってことは CDの曲を mp3に変換したいってこと?
それなら cdda2mp3っていうスクリプト作ったけど。
そういや、cdda2mp3 って腐ってたよな
だれもなおさないんだな
(^^)
421 :
名無しさん@お腹いっぱい。:03/02/01 11:04
だれか教えてください。
シェルスクリプト中で変数の値にバックスラッシュを含む文字列を
代入できないの? 指定したディレクトリ以下のHTMLファイルのリスト
をWindows形式のパスに変換してCSVで出力するスクリプトだけど、
3行目と8行目でエラーがでます。
echo $relpath | sed -e 's/\/\\/g' なら画面上に表示されるのに
代入しようとしたらエラーが出ます。なぜ??
#!/bin/sh
export WINPATH="C:\HTML_List\"
export ofname=$2
for fname in `tree $1 | awk '/html/ {print $NF}'`
do
export relpath=`find $1 -name $fname -print`
export winrel=`echo $relpath | sed -e 's/\/\\/g'`
echo "$WINPATH$winrel, $relpath" >> $ofname
done
>421
# man sedしる。
sed -e 's/\\/\\\\/g'
>422
すみません。間違いです。スラッシュをバックスラッシュに変換しようと思い、
sed -e 's/\//\\/g'
としました。コマンドラインで実行するとエラーは起こらないのに、スクリプト中で
export winrel=`echo $relpath | sed -e 's/\/\\/g'`
と変数に代入しようとするとエラーが出ます。
ちなみに
export winrel=`echo $relpath | sed -e 's/a/b/g'`
のような a->b の変換ならうまくいきます。バックスラッシュを含んだ文字列
を代入することに問題があるように思えるのですが・・。
なんでexportしてんのかよく分からんけど、普通にこれで行けた。
#! /bin/sh
i=/foo/bar
j=`echo "$i"|sed 's,/,,g'`
超初歩的な質問なのですが、
echo $$
echo filename_$$
とかででてくる $$ はなにを表しているのですか?
シェルスクリプトのサンプルででてきたのですが、分からなくて、、、
>426
man csh
>>427 csh のマニュアルはありません。
といわれますた。
>>428 thanks
$$ は UFD と。
430 :
名無しさん@お腹いっぱい。:03/02/12 02:27
ほしゅ!
431 :
名無しさん@お腹いっぱい。:03/02/12 06:25
grep で、ファイル名と行番号 だけ を出力する方法って無い?
grep -n EXPR *| cut -d: -f1,2
>>432 それしかないんか・・・
処理的にはgrepは本文も出力してるわけで
ファイルが大量な場合その処理時間が惜しいと思うんだけど
grepにパッチあてるしかないのかな
とか思ってgrepのソース見たけど、全くわかんね
grepで、と指定されたからわざわざgrep使ってみたんだと思われ。
処理時間が惜しいならCで望みのフィルタ書けばいいだろ。
それに文字列を最低一回以上スキャンしなきゃいけないんだから、最高でもO(n)だ。
>>433 1) あまり美しくはないし「効率をケチりたい」という要求にはそぐわないが
$ perl -ne '
$. = 1 if ($ARGV ne $prev);
$prev = $ARGV;
print "$ARGV:$.\n" if (/hoge/);
' fileA fileB..
2) (f)lexを使う
3) GNUのgrepなら、多分grep.cのprline()だよ。オプション化するなら
他もいじる必要が有るが。
grepのソースをいじるぐらいの時間があるなら
cutの処理時間をガマンした方がマシと思われ。
DOSじゃないんだからパイプ処理にそんなに時間がかかるわけないだろ。
437 :
名無しさん@お腹いっぱい。:03/03/08 01:41
sedを使って、ファイルの中にある改行をあるキーワードを元に削除する
スクリプトの書き方をを教えてください。
例えば、
○元ファイル(test.txt)
AAA = 123
BBB = 111
AAA = 987
BBB = 254
○実行結果
AAA = 123,BBB = 111
AAA = 987,BBB = 254
ってな感じなんですが。
438 :
名無しさん@Emacs:03/03/08 05:01
>>437 sed '/^AAA/{N; s/\nBBB/,BBB/}'
by gnu sed 4.0.5
439 :
名無しさん@お腹いっぱい。:03/03/09 16:38
Directory名を取り出すにはどうしたらよいの?
今はこうしているんだけれど、もっと簡便にできるよね。
DIR=`pwd`
cd ../
DD=`pwd`
cd "$DIR"
DN=`echo "$DIR" | sed "s|$DD/||"`
dirname コマンドを使うのはダメ?
おおう。そんなコマンドがあったのか。だとすれば、
DIR=`pwd`
DD=`dirname "$DIR"`
FN=`echo "$DIR" | sed "s|$DD/||"`
で済むってことですな。
THX!
>>440
442 :
名無しさん@お腹いっぱい。:03/03/09 17:13
>>439 やりたいことがわからんけど、
/usr/local/bin
なら、
bin
って文字列が欲しいってなら、
basename $PWD
でどーよ?
>>442様
それです。それが欲しかったのです。有り難うございます。
444 :
名無しさん@お腹いっぱい。:03/03/13 03:27
あるディレクトリ以下にCVSというフォルダがいくつかあり(一階層下や二階層下...)
それを削除したいです。そこで
find . -name CVS -exec rm -r {} \;
というコマンドで消すことはできたのですが
「find: ./CVS: そのようなファイルやディレクトリはありません」
というエラーメッセージが出てしまいます。
どこで間違ってるのでしょうか?
>>444 find . -type d -name CVS -print |xargs rm -rf
>>445 ありがd。
うまくいきました。
でもどうしてその違いが出てくるのかわからないです・・・。
>>446 rmの前にechoを入れて
find . -name CVS -exec echo rm -r '{}' \;
どんなふうにrmコマンドを実行していってるか見るよろし。
やっぱりわからないです(´Д⊂
$ find . -name CVS -exec echo rm -r '{}' \;
rm -r ./CVS
rm -r ./a/CVS
rm -r ./b/CVS
rm -r ./b/b1/CVS
rm -r ./c/CVS
$ find . -type d -name CVS -print | xargs echo rm -rf
rm -rf ./CVS ./a/CVS ./b/CVS ./b/b1/CVS ./c/CVS
違うといえば違うんでしょうが前者で
「find: ./CVS: そのようなファイルやディレクトリはありません」
と出る理由がサパーリ。
結局同じ事に見えるです。
find . -print
find . -depth -print
を見比べれ
(^^)
>>449 $ find . -type d -name CVS -print
$ find . -type d -name CVS -print -depth
$ find . -name CVS -print
$ find . -name CVS -print -depth
全て
./CVS
./a/CVS
./b/CVS
./b/b1/CVS
./c/CVS
になりました。
>>451 試してみましたが違いました。
ところでエラーメッセージが出るのもしかして私のところだけなんでしょうか?(汗
$ mkdir -p CVS a/CVS b/CVS b/b1/CVS c/CVS
で作った環境でテストしてます。
>>452 find が cd した directory を消しちゃって、 cwd がなくなっちゃった、とかなのかな…
とりあえず、 -prune 指定するとそういう error message はでないみたいだけど…
readコマンドを使わないで、対話的にコマンドラインからの文字列を
変数に入力って、できますか?できませんか?できまセントーン?
何でそんなことをしたいのかさっぱりわからんのだが。
read 使えばいいじゃねーの。とかいいつつ。
#!/bin/sh
tty=`tty`
a=`head -1 $tty`
echo $a
リダイレクトされてるとコケます。
foo=`head -1 /dev/stdin`
echo Inputted $foo
とか…
457 :
名無しさん@お腹いっぱい。:03/03/22 20:11
あるディレクトリにたくさんの以下のようなファイルがあります。
001_x001.html
001_x002.html
001_x003.html
001_x004.html
001_x005.html
............
これをスパッと一発で以下のようにリネームする方法を教えて下さい。
001_001.html
001_002.html
001_003.html
001_004.html
001_005.html
001_006.html
>>457 こんな一行野郎でどう?
for i in *.html; do mv `echo $i | sed "s/\(.*\)_\(.\)\(.*\)/\1_\2\3 \1_\3/"` ;done
あ、エラー処理してないんで(w
本能で書くと
\ls -1 | awk '{print "mv " $0 " " gensub("x","","",$0)}'|sh
だいたいいつもは (for csh )
foreach f (*)
mv $f `echo $f|sed s/x//'
end
気が向いたら csh の変数置換(:) (今は気が向かない)
なにも考えたくなかったら editor でばさっと
for i in *.html; do mv `echo $i | sed "s/\(.*\)_x\(.*\)/\1_x\2 \1_\3/"` ;done
の方が安全っぽい鴨。
>>460 そうか、そういえばそれで済むか(苦笑
sh(bash)なら
for i in *.html; do $i `echo $i | sed "s/_x/_/"` ; done
>>458-461 スペシャルサンクスです。
なるへそ、バッククォートを使うのですか〜。
これから精進致します。
>>460 連カキだが、一生懸命にmanを読んで解決しようとしたのだが、
シェルの変数置換がちっと理解できませんでした(⊃д`)
これを使ったやり方も教えて欲しい。cshとbashの両方を。
とりあえずshでやるとこんなもんかな。
for i in 001_x???.html
do
mv -f $i 001_${i#*_x}
done
466 :
名無しさん@お腹いっぱい。:03/03/25 20:59
シェルの勉強をしてるのですがfindでこういう事ってできますか?
find -name "*.htm"
というのでワイルドカード検索できるのは解ったのですが
たとえば JavaとEJBとhtmを順番は関係無しに含まれてるファイルを検出することはできるのでしょうか?
意味不明
落ち着いて書くべし
>>467 たとえば
HOGEabcFOOdef.cpp
とか特定のキーワードを複数含んだファイルを検索したいのです
findで行うと
find -name "HOGE*FOO*.cpp"とすると
HOGEabcFOOdef.cppはヒットすると思うのですが
FOOabcHOGEdef.cppはヒットしないですよね?
そういうキーワードを含んだファイルを検索したいのです
-name "*HOGE*.cpp" -name "*FOO*.cpp"
>>469 そりゃあ and だって。or にするには -o。
後は man の中の -o とか見れ。
>>466
>>470 しまった 468 良く見ると and でもいいじゃんか。
落ち着いて書くべし>俺
473 :
名無しさん@お腹いっぱい。:03/04/01 00:38
if 10 < a then hoge.sh
変数って扱えるの?
∩
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д`)// < 先生!こんなのを発見シマスタ!
/ / |
/ /| / \
http://saitama.gasuki.com/shinagawa/ __| | .| | \
\  ̄ ̄ ̄ ̄ ̄ ̄ ̄\ \_____________
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
476 :
名無しさん@お腹いっぱい。:03/04/01 12:14
bashのプロンプトで、行の右端に時間表示するのってどうやるんですか。
PS1="[\u@\h \W] \e[s\e[80D\e[68C(\t)\e[u"
とかやってみたんですが、
なんかプロンプトの入力が行の最後まで行かず、
同じ行で復帰してって変になるのです。
aaser@host dir] aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (12:10:47)
↑こんな感じになっちゃう
> bashのプロンプトで、行の右端に時間表示するのってどうやるんですか。
bashでこんなこと出来るの?zshじゃなくて?
連番のファイルを、あるファイル中でリストされてる名前にリネームしたい場合、
zsh 利用して
% for i in {01..10}; do mv *${i}* "`sed -ne ${i}p FILE`" ;done
で一応できるのですが、毎回 sed が起動されてたりして汚いです。
% i=01;cat FILE|while read l; do mv *${i}* $l; iを inc; done
みたいには出来ないでしょうか? (i が 1 からなら楽だけど、01 からなので)
480 :
名無しさん@お腹いっぱい。:03/04/01 13:06
>>478 PROMPT_COMMANDっての使わないと駄目みたいですね。
↓でできましたありがとうございます。
PROMPT_COMMAND="echo -en '\e[s\e[69C'\(\$(date '+%H:%M:%S')\)'\e[u'"
PS1="[\u@\h \W] "
>>477 「カーソルが右端に届いたら時計をまとめて消す」、
というようなことはzshじゃなきゃできないかも。
481 :
名無しさん@お腹いっぱい。:03/04/02 21:51
grep "^age" sage.txt | wc -l
この結果を変数に代入したいんですが、どうしたらいいですか?
その値を使って、条件分岐などしたいので
>>481 HENSUU=`grep "^age" sage.txt | wc -l`
grep -cなんてオプションがあったりなかったり
>>482 これは、文字列か値どちらとして代入されるんでしょう?
聞いてばかりじゃなんなんで自分で試してみたいと思います。
どうもありがとう
>>483 grep "^age" sage.txt | wc -lとgrep -c "^age" sage.txt
で同じになるんですね。パイプでつないでやるよりスマートでイカシてます。
どうもありがとう
>>484 単純なコマンド(or知ってる範囲のコマンド)をパイプでつないで
複雑な仕事を果たすやり方も悪いわけじゃないよ。
逆にその方が、コマンドにいろいろスイッチ(機能)を詰め込むより
UNIXぽいし。
そもそも昔は(今もシステムによっては)grepに-cなんてなかった。
だから
>>483さんは「あったりなかったり」と書いたんだろな。
486 :
名無しさん@お腹いっぱい。:03/04/03 06:27
hoge
ahya
hoge
foo
hoge
foo
と書かれたファイルを読み込んで
hoge 3
ahya 1
foo 2
と単語ごとの回数を数え上げたいのですが何かいい方法ありませんか?
>>486 何も考えないで
sort txt | uniq | while read i; do echo -n "$i "; grep -c $i txt; done
ってやってみた。効率悪いけど小さいなら、いいんじゃないかな。
>>486 perlと言痛いところだけど、それじゃシェル講座にならないからawkで
awk '{count[$1]++} END{for (word in count) print word, count[word]}'
でどうよ。
ふつーに sort | uniq -c でええやん。
>>487 uniq の -c はどこでもあるんじゃないか?
sort | uniq -c は常套手段だろ。たしか「UNIXプログラミング環境」にもあったはず
while read {変数リスト}
do
{処理}
done < hoge.txt
hoge.txtに沢山レコードがあってその最後の奴だけ取り出したいんだけど、
馬鹿正直にレコードの数だけ変数を書かないと無理ですか?
shiftさせればいけるかなと思ったんだがreadで入れるとshiftの対象にならないようだし。
>>492 awk じゃだめ? とってもシンプルに書けるのだけど
% awk '{print $NF}' hoge.txt
shell が bash だったら、 read -a で配列に読んで最後の要素とか。
tail -1 じゃだめなの?
read a
set -- $a
eval last=$"$#"
echo $last
>>495 題意を取り違えておるようです。
(^^)
∧_∧
( ^^ )< ぬるぽ(^^)
500 :
名無しさん@お腹いっぱい。:03/04/23 03:26
cat
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >_Λ∩
_/し' //. V`Д´>/
(_フ彡 / ←>>山崎渉
とすると、山崎渉というファイルに追加書きされます。
そして500ゲッツ。
シェルスクリプト中で su や telnet 等のコマンドを使うと、パスワード入力の
箇所で止まってしまいます。これを回避する方法は無いでしょうか?
password が root のパスワードだとして、以下の方法では駄目でした。
#! /bin/sh
echo password | su
#! /bin/sh
su `echo password`
>>501 expect を使いなされ。
根本的にはスクリプト中で su や telnet を使う設計をどうにかした方がいい。
>502
ありがとうございます。
expect は標準では入ってませんでした。どのマシンでも実行出来るスクリプトを
作るのは難しいのですね。
こういう方法もある
#!/bin/sh -
(sleep 5; echo "username"; sleep 5; echo "password"; sleep 5; echo "who"; sleep 5 ) | telnet hostname
>>504 telnet は運が悪いとそうやってもコケることがあるし、
そもそも su ではその手は使えない。
>504
凄い!!
出来ました。サブシェルは使った事無かったのですが、そういう風にも使える
のですね。どうもありがとうございました。
(sleep 3; echo "password"; sleep 5; echo id ) | su
>>502 に同意。
root 権限が必要なら始めから root で実行すればいい。
sudo とか rsh/ssh とか便利な道具は他にもある。
あれ?
telnetって.netrcにpasswordの設定しとけば、
password聞いてこなかったような。。。
ちなみにtelnetをshellの中で使ってもシェルはそこで止まってしまうのでは?
シェルで遠隔操作したければ、.rhostsの設定してから、rshを使うのが
上等手段かと。
自己レス・・・
そういえば、telnetでも、
telent host <<!
処理
・・・
!
で、できたかな?
>>508 .netrc で自動ログインできるのは ftp だ。
たしかにftpだ。
>>509 上のレス読んでる?
読んでない。
もちつけ>俺
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
はじめまして。
新卒未経験で運用に携わる事になったのですが
いきなりシェルとPerlをつかってファイルの存在確認を
することができるようにと言われて困っています。
perlでファイルの存在を確認して
結果を子シェルに渡し、
子シェルから親シェルへさらに結果を渡し…
というような形になるのが正しいでしょうか?
なきそ…
…はあはあ。なるほど。
「引数で指定したファイルが存在すれば読み込んで画面に表示、存在しなければ“Cannot find ファイル名 !”と表示」
とかいう動作するシェルスクリプト&Perlスクリプト1個づつ作って持ってけ。
両方の基礎を勉強すればできる。
Perlやシェルスクリプトを今後も仕事で使いそうならそれぞれ本買え。
あー、「両方ともそれぞれの基礎を勉強すれば」、だね。
シェルスクリプトやPerlスクリプトだけでできる。
スクリプティングの世界へようこそ。
よくわからないのは
なぜ親シェル⇔子シェル⇔Perlを使うのか。
それぞれなにをするのかがわからないのです。
全部ひとつのシェルでやればいいのに…
情報系のお勉強をしてなかった文系エンジニアなので…
でもがんばりまする。
ちなみにどちらの本も買ってきてあります。
しかし、ゆっくり読んでる暇もない…
(しばらく考えて)その親シェルだとか子シェルだとかの要らん知識は誰から聞いたんだ?
あ、実はAJS上でおこなうので
一定の条件でエラー番号を変えることができるように
こんなふうにしているのだとおもいます。
なのでほかのジョブも
みんな親シェル⇔子シェル⇔Perlとなっています。
>>519 君に必要なのは人と話をして業務の引き継ぎをする能力です。
聞く相手を間違っています。
shell script をシェルと言う >1 は市ね
>.>521
同意同意。
あと、Warning をワーニングというヤツも市ね
市ねとか言う香具師も
香具師とかいう椰子も
パスの最後を取りだすにはどうしたらいいんでしょう?
例えば$AHOが
/usr/local/bin/aho
だったら, ahoだけが取りだしたいです
echo a b | read c d
echo $c $d
の出力が、
a b
にならないシェルで、こういう出力を得るには、一旦ファイルに
落とさなければならないのでしょうか
>>529 どんなシェルぢゃい?
分割については、sh 系なら set コマンドでできるぞ。
(記憶があいまいだが、set -- 文字列で、
$1〜$9 に分割されたような…)
>530 ってどういう事?
>>530 >どんなシェルぢゃい?
うちの手元ではパイプから read で代入できるのは
ksh と zsh だけのようだが。sh, bash, (t)csh では不可。
FreeBSD で man sh すると「標準入力が端末の場合」と明記されてる。
>>531 set -- a b
c=$1
d=$2
echo $c $d
$ echo a b|(read c d; echo $c $d)
pipeがあるとsubshellが起動してしまうから
readと同じsubshellじゃないとechoできないのデス
>532
あぁ、文字列が文字に分割される訳じゃないのね。
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
#!/bin/sh
trap "exit 0" 2
sleep 100d
このファイルをtrap.shとします。
%trap.sh
と起動して、ctrl-cを押すと終了するのですが、
kill -2 (trap.shのpid)
としても終了しません。
kill -TERM (trap.shのpid)
trapしていないTERMでも終了しません。
なぜでしょうか?
あぼーん
541 :
名無しさん@お腹いっぱい。:03/08/02 20:26
☆ ☆ ☆
http://www.gals-cafe.com ☆ ☆ ☆
りさちゃんですっ☆みんな元気ぃ?夏だねっ!
あたしね、今アメリカにいるんだけど、、、えへっ(*>▽<*)
アナタに逢いたくて、こんなバイト始めちゃったヨ♪
りさに逢いに来てくれたら、7日間も会費無料サービスしちゃうし、
さらにさらに10分間も無料なんだよ! Σ(@o@)!!
アナタにだけの特別大っサービス♪絶対来てね!
二人っきりでたっくさん楽しいことしようよ♪まってるよ(^.^)/
☆ ☆ ☆
http://www.gals-cafe.com ☆ ☆ ☆
542 :
名無しさん@お腹いっぱい。:03/08/14 00:43
1よ。俺のちんぽは昔から曲がっていた。
だから根性だけは曲がらないよう努めてきた。
しかしこのご時世には負けそうだ。
ちんぽは立たないし、根性が曲がりそうで怖い。
どうすれば良いかな?
このスレ読んではじめて
export HOGE=sage
ってのがbashやashでの拡張だと知ったよ。
普段から
HOGE=sage ; export HOGE
と書いていたから気づかなんだ。
変数が数値かどうかテストするコマンド無いかしら?
if isnum $param; then
pinsert to man co
fi
みたいな。
if expr "$param" : '\([0-9]*$\)' > /dev/null; then
echo $param is number
fi
>>544 ちゃんと試してないけど、こんなのどうかな。
[ $parm -eq 0 ]
if [ $? -ne 2 ]; then
pinsert to man co
fi
if [ "$a" = "$((a))" ]
>>548 [ 3 -eq 0 ] = 1
[ a -eq 0 ] = 0でした。
sage() { sage; }; sage
while read line
do
echo $line
done
というスクリプトを実行して、
bashのプロンプトのように
Control-Pでヒストリを表示するようなこと
はできますか?
まじっすか?
あぼーん
あぼーん
557 :
名無しさん@お腹いっぱい。:03/08/29 12:09
cshで、foo.bar.comという文字列からbar.comだけを
とりだしたいときはどうしたらよいのでしょうか。
`hostname -s`の逆をやりたいのです。
domainnameてのは役目が違いますよね。
% hostname --domain
hostname: ホスト名を `--domain' に設定できません: 所有者ではありません。
% expr foo.bar.com : '[^.]*\.\(.*\)'
bar.com
560 :
名無しさん@お腹いっぱい。:03/08/29 15:14
>557
なるほど、exprはそうやって使うものですか。ありがとうございました。
というか、:演算子があるんなら、
自分のマシンがbar.comに属しているかどうかは
expr `hostname` : '^.*bar.com'
で判別できるんですね。勉強になったです。
でも私が書くとこんな感じになってしまう。動くことは動きますが、いかにも
おかしい感じです。
添削おねがいします。
set h = `hostname`
set tmp = `expr $h : '^.*bar.com'`
if ($?tmp && $tmp) then 〜
hostname | cut -d. -f2-
しか思い付かんかった…
564 :
名無しさん@お腹いっぱい。:03/09/01 19:06
すまんが、アホな質問にさせてくれ。
いくつかのスクリプトに共通する部分を(仮に)basic.shとまとめたいのだが、
## basic.sh
#!/bin/sh
VAL="hello world"
export VAL
## test1.sh
#!/bin/sh
../basic.sh
echo $VAL
test1.shから、basic.shの変数VALを読み込むにはどうしたらいい?
perlでのrequireに相当するやつが欲しいのだけど。
.
. /path/basic.sh
相対パスではできないと思う。
>>564 .(ドット)コマンドを使って読みこめばよい。
## test1.sh
#!/bin/sh
. /path/to/basic.sh
echo $VAL
尚、この場合basic.shの一行目の"#!/bin/sh"は必要ではない。
ついでにいえば、その場合はbasic.ahの最後の行のexportも不要だな。
>>565-568 ありがとう。
ちょうど痒いところに手が届き無茶苦茶すっきりしました。
>>565 最初せっかくレスしてくれてるのに気がつかなんだよ(w
570 :
名無しさん@お腹いっぱい。:03/09/03 16:20
下記のスクリプトについてなのですが。
テキストファイルを読みこませて、延々とゆっくり標準出力に吐かせようとしてます。
最初は^Cや^\で終了しなかったので、二行目を追加して終了するようにはしたのですが、
それでも子プロセスの終了を待ってからの終了になります。#送るシグナルを9番にしても同じでした。
どのようにすれば即座に終了するように出来ますか?
--------
#!/bin/sh
trap "/bin/kill -15 $$" 1 2 3
while :
do
cat $@ | awk '{ line = $0
while ( length(line) > 0 )
{ printf substr(line, 1, 1)
line = substr(line, 2)
system("sleep 0.1s") }
printf "\n" }'
done
571 :
名無しさん@お腹いっぱい。:03/09/03 16:54
初歩的質問で申し訳ないです・・。
#!/bin/csh -x
@ data_num = 1
while ( $data_num < 300 )
set F1=`awk "NR=="$data_num" {print}" datalist.txt`
ftp -n -i 123.45.6.789 <<"END"
user hoge hage
prompt
cd /aa/
bi
get $F1
bye
END
@ data_num++
end
実行すると$F1というファイルを探してしまいます。
datalist.txtの中のファイル名のものをgetしてほしいのですが。
どなたかご教授を。
>>571 << "END" を << END にする(ダブルクォートやめる)といいんじゃないの。
でもそれ以前に csh スクリプトやめれ。
シェル講座じゃなくてシェルスクリプト講座だよねw
>>571 それだとファイルの1行ごとに ftp セッションを張ることになるので、
すんげー迷惑なんですが…。
#!/bin/sh
awk 'BEGIN{print "user hoge hage\nprompt\ncd /aa/\nbi\n"}
NR<300{print "get", $0}
END{ print "bye"}' datalist.txt | ftp -n -i 123.45.6.789
とても参考になりました。
皆さんありがとうございました。
結局、ファイルに命令書き出してそれをリダイレクション入力しました。
576 :
名無しさん@お腹いっぱい。:03/09/05 10:54
shループ内の読み込みを一つ先に進ませるってどうすればできますか?
例えば、
./exec.sh -f filename
とオプションに応じて実行される処理を変えたいのですが、
#!/bin/sh
for i in $*; do
case $i in
-f)
# この部分でfilenameを読み込ませたい
# filename=$i
esac
done
どうかご助言くださいませ。
>>576 % env PAGER='less -p getopts' man sh
% man getopt
サンクス。
$1とshiftの組み合わせでできました。
説教好きなご隠居さんですか?
>>580 ちがうよ。俺もgetopts何か使うよりshiftしながら$1読む方を選ぶ。
でも578の「サンクス」が妙におかしかったので聞いてみただけ。
こういう場合は「サンクス・エニウェイ」でよろしこ。
>>579 えーと、getoptの使用は全く思いつかなかったので、
とりあえずサンクスと書かせていただきました。
スクリプト元のC++プログラムの方でgetoptは使わせていただきます。
こんな便利そうな関数があるのに、
車輪の再発明に陥っているじゃないか!Σ( ̄ロ ̄ll)ガーン
てな感じで参考になりました。
thanks anyway!
[0-9]{8}\_[0-9]\.jpgというファイルたちを
[0-9]{9}\-[0-9]\.jpgという風にリネームしたいのですが,
どうやったらいいですか?
ごめんなさい.ちょっとわかりにくかったですね.
しかも2行目の{9}は{8}の間違いです.
たとえば20030501_1.jpg
というファイルを
20030501-1.jpg
という風に替えたいのです.
よろしくです.
ついでにいうと,
20030501-1.jpgというファイルを
./2003/200305/20030501/
というディレクトリに入れたりもしたいです
echo *.jpg | sed -n 's/\(....\)\(..\)\(..\)_\(.\)\.jpg/mv & \1\/\1\2\/\1\2\3\/\1\2\3-\4.jpg/p' | sh
>>586 サンクスコ! そうか,sedを使うんですね.なんかgrepで躓いていました.
ありがとうございます.
それにしても,「小さいツールを組み合わせて使う」って素敵ですね.
echo *.jpg じゃなくて ls *.jpg だな。
>>587 perlでもでくるよ。awkでもtrでも。pythonでも。CでもC++でもでくる。COBOLはちょっときびしい。
>>589 sedでできるものはsedでしたほうがいいね.
せっかく果物ナイフがあるのだから,わざわざ牛刀を使わなくてもいい.
環境によっては牛刀をおいていないところもあるだろうし.
sedが果物ナイフ...
もはや awk や perl は果物ナイフ扱い
じゃあPythonはレーザーメスかな
awkってV7からあるよな。
Coherent とか XINU には載ってないでしょ。
Ruby最高!黄色人種の恥さらし!
pythonでできるものはpythonでしたほうがいいね.
せっかくレーザーメスがあるのだから,わざわざ果物ナイフを使わなくてもいい.
病院によっては果物ナイフをおいていないところもあるだろうし.
>>598 果物を食うのにレーザーメスを使う馬鹿はいない
果物を食うのにレーザーみみかきを使う馬鹿はいない
みみかきを食うのに果物レーザーを使う馬鹿はいない
604 :
名無しさん@お腹いっぱい。:03/09/18 16:19
telnetでサーバーにログインしたいのですが
下のように書くと結果を全部サーバーの方に送ってしまいます
コマンドを実行した結果をローカル側?に出したい時はどうしたらいいのでしょうか
#!/bin/sh
(
while true
do
tail -n 1 buff.txt | awk '{print $1}' >a
read B=<a
if [ B = "Login:"] ; then
...
fi
done
) | telnet $SERVER $PORT > buff.txt
606 :
名無しさん@お腹いっぱい。:03/09/28 16:28
最後の文字を落とす方法は?
perlのchopみたいなの。
chop呼べば?
>>607 bash: chop: command not found
と出ますた。
610 :
名無しさん@お腹いっぱい。:03/09/28 21:01
>>604 hoge | (mona > giko) と
(hoge | mona) > giko と
hoge | mona > giko の違いを述べよ。
初歩的な質問ですみません。
あるディレクトリとその回のディれくとにあるすべての*~なファイルを消すにはどうしたらいいですか?
rm だけでは出来ないようだし,sedを使うのでしょうか?
>>612 「その回のディれくと」ってのが何だかわからんが
ヒントは find とか xargs とか。
>>613 ヒントありがとうございます
find ./ -name '*~' | rm
でできました
間違えた
rm `find ./ -name '*~'`
でした
>>616 find . -name '*~' -exec rm {} \;
619 :
名無しさん@お腹いっぱい。:03/09/29 12:14
いや、せっかくだから なぜそうなのか 616と617に説明していただきたい
初心者質問ですいません
root以外のユーザで
シェルを呼んだ時にシェル内容だけはroot(su)扱いで実行するように
記述することって可能でしょうか?
624 :
名無しさん@お腹いっぱい。:03/10/08 15:00
#! /bin/sh
ftp -nv ***** <<EOF
user user
hash
bin
get ****
EOF
上のシェルでゲットの部分を引数で渡された回数だけ実行するには
どうすればよいでしょうか?
EOF〜EOFの間にはループ分とか記述できないので困っています・・
ヒアドキュメントを使わなければいいだけの話では。
目的がよくわからんが
wget とか curl を使った方がよいのでは。
here document のところをプログラムで生成すればいいんじゃ?
echo 嵐 マンセー
630 :
名無しさん@お腹いっぱい。:03/11/10 11:31
hoge.txt に
fuga = foo
という行があるとしますよね.
シェルスクリプトでシェル変数 $FUGA に,
この foo を設定してやるにはどうしたらいいのですか?
FUGA=`awk '{ print $3 }' hoge.txt`
>>630 eval $(echo 'g/^\([^ ][^ ]*\) *= *\([^ ][^ ]*\)$/s//\U\1\e=\2;/p' | ex - hoge.txt)
FUGA=`awk '$1 ~ /fuga/ { print $3 }' hoge.txt`
ある実行ファイルにパスが通っているかどうかで
if 文で処理を分けたいんですけどどうすればいいのですか?
例えば, awk にパスが通ってるかどうかで分岐させるには?
637 :
名無しさん@お腹いっぱい。:03/11/13 14:11
シェルスクリプトの中で,
ユーザ定義函数を使おうとして,
以下のように書きました
#!/bin/bash
question 'Hello World!!'
function question()
{
echo $1
}
ところが,「question なんか知らない」というエラーが出ました
何が悪いんでしょう?
>>637 先に定義しておかないと使えないヲカン
function question()
{
echo $1
}
question 'Hello World!!'
関数を定義するときに
function を使うなんて初めて知った・・・
hoge()
{
hage $@
}
が正式な文法だとばかり思ってた・・・(恥
>>640 調べてみたらfunctionを使うのはbashの拡張みたいですね。
やっぱりなるべく使わないでおこ。
>>641 ほんとに?
POSIX標準(1003.2)で、そういう形式もOKって決まってなかったっけ?
643 :
名無しさん@お腹いっぱい。:03/11/17 12:13
シェルスクリプトから他のシェルスクリプトファイルを
include することはできます?
もしできるなら,どうやってやるんですか?
646 :
名無しさん@お腹いっぱい。:03/11/20 10:28
$ bash hoge.sh *
としたら,現行ディレクトリの
すべてのファイルの先頭行に,
//hoge
という行が追加されるようなシェルスクリプトはどう書くの?
#!/bin/sh
tmpfile="/tmp/hoge.$$"
for d in "$@" ; do
if [ -f "$d" -a -w "$d" ]; then
echo "//hoge" > $tmpfile
cat "$d" >> $tmpfile
cp $tmpfile "$d"
fi
done
shシェルスクリプトにて、
PATH_INFO="/home/test/image/abc.jpg"
であるとき、
eval `echo $PATH_INFO | sed /^(.*\/)([a-z]+)\.([a-z]+)$/{
$Path=$1
$FileName=$2
$Ext=$3
}`
としたら、根本的に違うらしい。
どうしたらパターンマッチさせて、任意の文字列を取り出せるのでしょう
>>649 正規表現は悪くないんだけど perl っぽかったり、
変数を使えない sed で代入しようとしてたりですごいことになってるねw
さらには sed の置換処理部分をクオートしてないんで
シェルが解釈しようとしてエラーになるはず。
Path=`dirname $PATH_INFO`
FileName=`basename $PATH_INFO | sed 's/\(.*\)\..*/\1/'`
Ext=`basename $PATH_INFO | sed 's/.*\.\(.*\)/\1/'`
なるほど、置換した結果を拾う。
ただ、
test.sh________________
#!/bin/sh
Path=`dirname $PATH_INFO`
FileName=`basename $PATH_INFO | sed 's/\(.*\)\..*/\1/'`
Ext=`basename $PATH_INFO | sed 's/.*\.\(.*\)/\1/'`
echo 'Content-type: text/plain'
echo
echo \PATH_INFO = $PATH_INFO
echo \$Path = $Path
echo \$FileName = $FileName
echo \$Ext = $Ext
exit 0
では、実行してみても
bash$ sh ./test.sh
$Path =
$FileName =
$Ext =
bash$
それで、
・・・値が無い。それで
PATH_INFO="/img/src/eee.jpg"
Ext=`echo $PATH_INFO | sed 's/.*\.\(.*\)/\1/'`
Path=`echo $PATH_INFO | sed 's/\(.*\)\/[^\/]*\..*/\1/'`
FileName=`echo $PATH_INFO | sed 's/.*\/\([^/]*\)\..*/\1/'`
echo 'Content-type: text/plain'
echo
echo \PATH_INFO = $PATH_INFO
echo \$Path = $Path
echo \$FileName = $FileName
echo \$Ext = $Ext
exit 0
としてみた。
なんとなくカッコ悪いような・・
>>652 test.sh呼ぶ前にPATH_INFOをexportしてるのかと問い詰めたいところだが、
#拡張子が必ず存在するなら、このほうが見やすいかも。
export Ext
Path=`dirname "$PATH_INFO"`
Ext=`basename "$PATH_INFO" | sed 's/.*\.//'`
FileName=`basename "$PATH_INFO" $Ext`
#evalだとこんな感じ?途中にスペースがあるとダメだけど。
set `echo $PATH_INFO | sed 's|^\(.*\)/\([^/]*\)\.\([^.]\)|\1 \2 \3|'`
Path=$1
FileName=$2
Ext=$3
#拡張子が存在するかどうかもアヤシイんだったら、こんなのとか。
Path=`dirname "$PATH_INFO"`
FileName=`basename "$PATH_INFO" | sed 's/\.[^.]*$//'`
Ext=`basename "$PATH_INFO" | sed "s/^$FileName\.//"`
もっと気楽にいこーよ!
awk -F/ '{ print $NF }' とか
awk -F. '{ print $NF }' とか
LIST="a b c"
HOGE="hoge."
から、
"hoge.a hoge.b hoge.c"を生成するにはどうしたらいいのかな。
for i in $LIST
do
RESULT="$RESULT $HOGE$i"
done
>>655 % export LIST="a b c"
% export FOO="foo."
% for i in `echo $LIST`; do echo $FOO$i; done
foo.a
foo.b
foo.c
do echo を do touch にする。
>>656 なるほど。${bar#word}系の類いに気がいってて思い付かなかったよ。
>>657 例示した文字列が紛らわしくてスマソ。
659 :
名無しさん@お腹いっぱい。 :03/11/27 16:42
unix(solaris)で使っていたシェルがRedHatでつかえません。
どうしてでしょうか?
>>659 shellってなんだか理解してからがんばれ
661 :
名無しさん@お腹いっぱい。:03/12/02 20:03
/usr/bin/env の挙動が理解できません.例えば,
#!/usr/bin/env /usr/bin/clisp
(format t "Hello, world.~%")
このようなファイルに chmod u+x して実行するとします.
1 行目が上のときにはうまく動作しますが,可搬性を考えて
1 行目 を #!/usr/bin/env -i PATH=/usr/bin clisp とすると
env: オプションが違います --
詳しくは `env --help' を実行して下さい.
と言われてしまい,#!/usr/bin/env PATH=/usr/bin clisp とすると
メッセージが出ないまま固まります.
可搬性のある書き方で正しく動作させるには,どうしたらいいのでしょうか?
>>661 それは俺も悩んだことがある。
どうやら引数がまとめられて1つになるらしい。
#!/bin/ls -l -a
/bin/ls: オプションが違います --
この場合ls '-l -a'となってしまう。
#!/usr/bin/env clisp
というか、普通はこうじゃないか?
>>662 うちのマシンではそれでいいのですが,
CGI として使いたいところが,PATH=/usr/bin という素敵なシステムなんです.
ますます #!/usr/bin/env clisp でいいと思うのだが
>>663 #!/usr/bin/clisp
でいいじゃないか。
説明不足スマソ.
>>664-665 非常に残念なことに,その某大学のシステムでは (大学名を foo とします),
PATH=/bin:/usr/bin:/usr/foo/bin:/usr/foo/gnu/bin:
/usr/foo/pub/bin:/usr/foo/pub/lib/teTeX/bin:/usr/ucb:
/usr/foo/X11/bin:/usr/foo/bin/isc:/usr/ccs/bin の他にも,
/opt 以下に多数の bin を加えてはじめて実用になるシステムなのであります.
#! の行は,なるべく書き換えたくないものです.
どうか一人前の env 使いにしてください.お願いします m(_ _)m
連続スマソ./usr/foo/pub/bin/clisp にあるので PATH の追加無しには使えません.
#! の後には実行ファイルと引数1つまでしか書けないと思った方が良い。
特に可搬性を求める場合は。
PATH を変えたいといった場合は、シェルスクリプトにするとかしか無いと思う。
#!/bin/sh
PATH=/bin:/usr/bin/:...
clisp filename
>>668 どうもありがとう.悲しい index.cgi になりそうです...
引数は「ひきすう」と読むのだぞ(w
.htaccess で SetEnv PATH ... とすればいいのでは?
(´-`).。o(…Solaris か…あればイイ OS だ…)
>>671 .htaccess 禁じられてそうなヲカン。
>>670 俺は昔「いんすう」と読んでいた。
ちなみに返値のことを「へんち」とも読んでいた。うはは
>>671-672 .htaccess は使えますが,cgiwrap は必ずしないと実行できないんです.
そのせいか,cgi で呼ばれると .htaccess を無視しているようです.
\ │ /
/ ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
─( ゚ ∀ ゚ )< かえちかえち!
\_/ \_________
/ │ \
∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< いんかずいんかずいんかず!
いんかず〜〜〜! >( ゚∀゚ )/ | / \__________
________/ | 〈 | |
/ /\_」 / /\」
 ̄ / /
引き吸うも返り血も漏れには適当な命名とは思えない。
意味的、日本語的に。一体どんなDQNの思いつきだよ..
さらに
>>670 みたいなタイプが助長していて最悪だな。
・食わせ値
・戻り値(現行)
に汁
不特定多数の数なんぢゃないの?<引数の数
>>678 引いて、吸って、返り血なんだよ。日本語的には
筋が通ってるがな
682 :
名無しさん@お腹いっぱい。:03/12/10 20:00
シェルスクリプトの中で,
例えば,$SQL というシェル変数に,
ある sql 文の文字列をもっているとします.
この sql を(シェルスクリプトの中で)
psql を使って,database という名前のデータベースに
かましてやるにはどうしたらいいのでしょうか?
>682
echo $SQL | psql database
685 :
名無しさん@お腹いっぱい。:03/12/11 11:38
バイナリの置換はをする方法はありますか?
具体的には,あるテキストファイルの
0x0D というバイトをすべて削除したいんですけど
687 :
名無しさん@お腹いっぱい。:03/12/11 15:14
ありがとうございます
cat hoge.txt | tr -d '\015'
で解決しました.
>>687 catいらんやろ。trの入力をredirectすりゃ済むやん。
もれ、grep を使うときでさえも
cat hoge.txt | grep fuga
とかやるよん。経験的にこのように書いておくと、あとで修正・改造が楽なのだ。
>>690 >>689 じゃないけど、自分の経験では、
% cat hoge.txt | grep fuga
% cat hoge.txt | grep -i fuga
% cat hoge.txt | grep -i "fuga|foo"
% cat hoge.txt | grep -i "fuga\|foo"
みたいに続けて入力する時に、
カーソル移動が少なくて済む。
まぁ、カーソルを一字づつ移動させんな、とか
正規表現くらい一発で書け、とか
「% <hoge.txt grep fuga」でいいじゃん、とか
言われれば、そのとおりだが。
>>691 $ grep fuga < hoge.txt
$ grep -i fuga < hoge.txt
$ grep -i "fuga|foo" < hoge.txt
$ grep -i "fuga\|foo" < hoge.txt
とやってもカーソル移動は同じですが。
もしかしてDOSシェルかなんか使ってる?
>>692 % head hoge.txt
% ^head^cat
% cat hoge.txt | grep fuga
% cat hoge.txt | grep -i fuga
とか、いきなり grep じゃない事は多い(例がいけてないな・・・)。
grep | sort | uniq みたいな多段パイプを
いろんなファイルに対して繰り返しやるときは、
最初を grep RE hoge.txt とか grep RE fuga.txt とかにするよりも
cat hoge | grep RE にしておいた方がラク。
そんなことよりも、grep | awk とやってる奴をどうにかしてほしい。
たしかに。
まず最初にファイルの中身を確認してから、grep 操作をするじゃん。
$ less hoge.log
$ less hoge.log | grep fuga
$ less hoge.log | grep fuga | cut -f 1 -d " " | sort | uniq -c
とか。
less からパイプで渡すのはなんかヤだな。
grep | awkってなんかまずいの?
grep pattern | awk '{action}'
awk '/pattern/{action}'
意味ないでしょ。
>>694 > cat hoge | grep RE にしておいた方がラク。
はあ。なにが楽なんかよくわからない。
シェルに何を使っているかとかにもよるだろうし。
viモードなのかemacsモードなのかにもよるだろうしなあ。
標準入力と標準出力でインターフェースを共通化しておくことのメリットが分からないなんて
>>699はUnixをあまり使わない人間だと思う。
vi モード使ってるやつっているの? 一々 "^[" 押すのは面倒じゃないかな。
エディタは vi 愛用してるけど、コマンドラインのキーバインドは emacs 風だな。
好きなように使えばいいさ。
そうだね、スナフキン。
vi キーバインドは、コマンドが長くなった時にちょと便利かなと思ってたよ。
ところで emacs キーバインドで、ワード単位でジャンプする方法無いかな?
ごみん。M-f, M-b ででけた。
>>701 は〜い。俺tcshでもzshでもviのキーバインドだよ。
f,t,で目標の文字まで飛べたりとか、ct}なんかで括弧のなかを全書き換えとか
便利だと思うんだけどな。
でもさすがにhistoryは入力モードの^P,^Nに割り当ててます。
#でも厳密にキー叩く回数数えたら、
#emacsバインドに比べて少なくはないなと思いますが慣れました。
>>700 それがコマンドラインの編集にも適用できると思っているのって
なんだかあれですね
つかシェルあんまし使ってないんじゃないかな.>700は。
知識はあるんだけど現実に応用できないよくいるUnix馬鹿。
一番ダサい。
699 == 706 == 707 は具体的な例を挙げてみてよ。UNIX 使った事が
あるならだけど。
>>708 すんませんが日本語しゃべってください。
何の具体的な例ですか?
699=706=707=709はLinuxを使いはじめて1年目の厨房なんだから。反抗期なんだよ。
>>709 取りあえず cat を噛まさない方がキー入力回数が減るところからだな。
>>711 とりあえず 'cat ' 、'|' という最初にいれる文字列分はキー入力が少ないですね。
本人かどうかわからんけど(つうかそもそも2ちゃんねるではそれを推測したりする
のはナンセンスだが)
>>700 とか
>>708 ってなんか空疎なんだよな。
>>691からはじまる薀蓄は「どっちが楽か」という現実の使用に直結した
話なんですが、
>>700 「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
(これ自体もかなり意味不明だが)
これが今の話題にどう関係しているのかが示されてないんだよ。
もしよければ ***具体的*** にシェルでのコマンドライン編集とどう関係するのか
教えてくれ。
俺が書いたUnix馬鹿ってのは「インターフェイスが共通化できる」とか
「直交性が…」という言葉と辞書的意味は知っているが実際にそれがどう便利
なのかが分かっていないやつのことで
>>700はまさによい標本なわけだす。
以上、必死な反抗期のオコチャマの反論でちた。
ksh でかつ vi モードだと
ファイル名が最後にあると Esc + _ が使えて便利だね。
>>712 煽りはスルー。
もれは
>>695を書いた人間だけど、これってひとつの答えになっていないかな?
>>713 はいはいご苦労さん。
内容に一言も言及できないってことは理解できてないってことですな。
2ちゃんねるとはどういうところなのか勉強しなおしてください。
ちなみに君のレスは「禿同」と書いたのとほぼ等価ですw
>>712 それがスレの流れを無視して、煽り文句書いていた理由ですか?
あおる訳じゃないが、をれ的には
cat hoge.txt | grep foo
cat -n hoge.txt | grep foo
とかよく切り替えるからってのがある・・・
>>720 の例はあんまりよくないかも。。。
grep にも -n オプションがあるぞ、とか突込まれそうだし。
>>720 そういう時はこうしてる。cat ではあまり使わないけど。
% cat foo.txt | grep bar
% ^ ^ -n
cat -n foo.txt | grep bar
レスがあると思ったらこれかよ・・・
おまいは何を期待してるんだ?
>>718 ?
どの辺が「スレの流れを無視して、煽り文句書いていた理由」にみえまっか?
指摘は具体的によろしく。
>>712 >
>>700 > 「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
> (これ自体もかなり意味不明だが)
単に「UNIXにはパイプがあって便利だね」といってるようにしか読めないよな。
コマンドラインの操作性を語るときは、どのシェル使っての話か書いたほうがよいね。
(なんか粘着されてるっぽいな・・・。)
あるスクリプト x があって、x の中身は下のような感じです。
#!/bin/sh
コマンドA
コマンドB
コマンドC
exit 0
スクリプト x を、
$ cat hoge.txt | ./x
としたとき、このスクリプトへの標準入力をCに食べさせたいのですが、
どうすればよいでしょうか。
AとBが標準入力を食べないプログラムならCが食べてくれるようですが、
AとBが標準入力を食べるプログラムだとCに回ってきませぬ。
>>729 コマンドA,B,Cをリストにして
for i in $list ; do
cat hoge | $i
done
でいけないかな・・・。
>>730 レスありがとうございまする。
標準入力から入るのは無限長のデータの可能性もあるので
% uuencode /dev/urandom hoge | ./x
のような感じで実行しても動作して欲しいなぁ、と考えています。
>>728 言い訳探しをしても有益ではないと思うよ
#!/bin/sh
コマンドA < /dev/null
コマンドB < /dev/null
コマンドC
exit 0
じゃあかんの?
>>732 まともな返事をしても、応えを期待出来る相手じゃないじゃん。
何時まで続けるの?
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|
>>734 |
| 馬鹿は放置! l
|_________|
∧∧ ||
( ゚д゚) ||
/ づΦ
そだね。スマソ。
>>734 また言い訳ですな。正直になったほうがよいとおもいまつよ。
>>735 翻訳:「理解できないものにはフタをしよう」
質問です。
「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
とはどういう意味ですか?
>>739 いきなり宿題丸投げみたいなこと聞かれても(以下略
シェルのコマンドを
$ date
のようにするのではなく
$ { date ; }
のように { ... ; } で挟むとどういった違いがあるのですか?
コマンドリストを一括りにする。その例では違いはでないね
「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
というのを先日聞いたのですが、Unix関係の文書とか書籍とかでも見聞きした
ことがないセンテンスなんですが、これってUnixのどの特徴を指して言ってるの
でしょうか?
宿題の丸投げ禁止。
先生の意図していることを汲み取って回答してあげないと単位はもらえないよ(w
シェルスクリプトが一番多く書かれて技巧の研究が進んだ時代は
perl出現以前の1980年代だと思うけど、当時は
>>689,691のような
方式を見た記憶ないし、
>>700のような主張もされなかったはず。
(スクリプト内での話ね。他人のコマンドライン操作はよく見てない。)
もちろん、当時はtcshのコマンドライン編集なんてなかったとか、
大きく状況が変化したから、21世紀の今は今なりでいいよ。
個人的には、
>>700のメリットはやっぱわからん。結構考えたけど。
>>748 あなたはもしかして AranSK さん?
FP が理解出来なくてシェルスクリプトスレに来たの??
>>739=
>>744=
>>747=
>>748 は必死なジサクジエンと言うことでよろしい?
昔話をしてもいいのなら、昔の方が「一つのコマンドの機能は必要最小限に」
というポリシーが強かったよ。複雑なことをするときは複数のコマンドの組み
あわせでやる(そして組み合わせにはパイプをつかう)、というのがUnixという
もののポリシーだと思われていたしね。
たとえば tar とかは、今時の GNU tar なら単独で tar.gz の展開もできるように
なっているけど、昔は gzip で展開してから tar に渡す、ということをしなくちゃ
いけなかった。
GNUツールは確かに便利だけれど、コマンドラインでのオプションが増えて
増えて、いわゆる昔の「Unix的」でなくなってきたような気がするなぁ。
>>750 自作自演ではないと思いますが。(つうかそんなこと推測するのはそもそも無意味)
でですね
>>700のようなことを書いた文献とか一切見当たらないのですよ。
だから単なる脳内妄想なのか、他のことと間違えて覚えているのか…
>>751 パイプに関する資料を調べれば?
プロセス間通信手段としてのパイプは古典的ながらも依然優れた手法だよ。
標準入力で読み込んで標準出力に吐出すタイプのプログラムは、そのパイプの
メリットを享受できるよね。
というわけで宿題の解答としては、
「複雑な処理をさせるプログラムを1つのプログラムとして記述することは、
デバッグするときや、後に一部の機能を使い回すときに作業効率が悪い。
例として信号のパワースペクトルを求める場合をあげる。
この場合、
* wavファイルをcsv形式に変換するプログラム(wav2csv)
* csvを読込んでそれを離散フーリエ変換するプログラム(fft)
* 読込んだ値の絶対値を求めるプログラム(abs)
にわけ、
$ cat test.wav | ./wav2csv | ./fft | ./abs > test.pow
と処理させる。
すると、wav2csv , fft , abs は他の場面でその機能が必要なときに使い回す
ことができる。
このように入力と出力を標準入力と標準出力で統一しておくことにより、
プログラムを機能にわけて部品化させることができ、
後にその部品を再利用することが可能になる。
パイプはこのようなプロセス間通信を実現する手段として最も容易であり、
かつ高速である。」
というようなことを書けば良いのではないかと。
って、宿題、というわけではないのか。。。。ごめん。
どうもまだわかってないようだな
>>754 ここでの議論はcatを使うことのメリットは何かってことだろ。
cat test.wav| ./wav2csv
>>688はcatのかわりにリダイレクトすればよいと言っている。
./wav2csv < test.wav
>>700はcatを使うと
>標準入力と標準出力でインターフェースを共通化
と言っているのだが、これが意味不明。
>>757はプログラムを書いたことがないんかな?
> ここでの議論はcatを使うことのメリットは何かってことだろ。
プログラムを書く側からすれば、プログラムの入力インターフェースとして
stdin だけ見ていればいいのは非常に楽だな。cat を使ってデータを stdin
にいれてくれるのならプログラムは書きやすい。
>
>>688はcatのかわりにリダイレクトすればよいと言っている。
> ./wav2csv < test.wav
それでどうやって多段パイプをする?
あぁ、誤解。すまん。
>>758 は読み違えていた。
死んだ馬にムチ打つのは少々気が引けるが…
「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
でググッてみたらこのスレしかヒットしなかったよ。
762 :
貝バンドのアンナ:04/01/09 18:07
シェルでpsqlコマンドを使いたいのですが、
下記の様にSQL文内の'の所はどの様に記述するのでしょうか?
sh-2.05b$ psql -c 'select to_char(update,'yyyy/mm/dd') from user;' database;
実行結果
ERROR: Attribute "yyyy" not found
となってしまいます。
>>762 一旦quote(')から抜けて、escapeした'を挿入し、再びquote(')に入ると
よいにゃん。例えば、「abc'def」をシェルに与えることを考えるなら、
echo 'abc'\''def'
とか試してみると原理がわかるにゃん。
escapeじゃなくdouble quoteで'をかこってもいいにゃん。
echo 'abc'"'"'def'
とか試してみると前のやつと同じ結果が見えるワン。
shell に展開されちゃうような記述がなければ、全体を double quote すればよさそうな気がする。
psql -c "select to_char(update,'yyyy/mm/dd') from user;" とか。
>762
ヒアドキュくわせればいーだろ。
766 :
名無しさん@お腹いっぱい。:04/01/10 00:02
すいめせーん。
bashスクリプトで、引数のリストを配列として扱うにはどう書けば良いですか?
${@[0]}
↑これだとbad substitutionって言われちゃいます。。
元々配列じゃないものを無理矢理配列として扱う事はできません。
768 :
名無しさん@お腹いっぱい。:04/01/10 14:23
どこに書くべきかわからないので, ここに書かかせてください.
tcsh の補間機能を使って screen -x の後にプロセスIDの一覧を出そうと
しています. 今こんな感じです.
complete 'n/-x/`screen -ls | awk ' "'" '{print $1}' "'" '`/'
で, awk でマッチする行を絞るのに,
complete screen 'n/-x/`screen -ls | awk ' "'" '$1 ~ /^[0-9]+\./ {print $1}' "'" ' `/'
としたのですが, 以下のエラーが出てうまくいきません.
Missing separator '/' after completion "`screen -ls | awk '".
これはどう修正すればいいのでしょうか ? screen -ls 以下を
別のシェルスクリプトにしておかないとだめですか ?
769 :
名無しさん@お腹いっぱい。:04/01/11 00:58
770 :
名無しさん@お腹いっぱい。:04/01/11 01:10
while文の中でrshを使うと1回実行されてループから抜けてしまいます。
正しくループさせる方法教えてください。
例)
『HOST_LIST』にはrshを許可したホスト名の一覧が含まれています
set -x
cat HOST_LIST|while read a;do
rsh $a date
done
>>768 tcsh を使わくなって暫くなるけど、クオートその他の代替表現は用意されていないのかな。
ネストできないのがつらい。解読するのが面倒なので自分の好きなように書くと
complete screen 'n@-x@`screen -ls | awk -F "\t" '\''/^\t/{print $2}'\''`@'
こんな感じだろうか。
>>770 read は一行しか読込まない。こんな風でいいのでは。
set -x
for h in `cat HOST_LIST`; do
rsh $h date
done
>>770 ごめんボケけてた。それで別に構わんよね。何故成功した時点で打ち止めに
なるのかはよくわかりません。
ああ、入力を取りあうことになるからか。
rsh $a date </dev/null
とでもすればいいのかな。
>>771 ありがとうございます.
>>771 の書き方でも,
>>768 の書き方でも
セパレータを @ にすることでうまくいくのを確認しました.
いつも vi を使ってるのに, complete でもセパレータを変えられるかもとは
全然思いつきもしませんでした.
あと
>>771 のクォートの書き方も, 私のより綺麗に見えて勉強になります.
bashであるプロセスが終了してたらそのプロセスを起動するスクリプトを
cronに登録したいのですが、
もし"ps aux | grep プロセス名"が空なら"プロセス実行"
をどうやってスクリプトで書いていいかわかりません。
どうやって書けばいいでしょうか?
>>775 俺だったら、cronよりも、プロセスが終了したときに再起動する
wrapperを書くかな。↓こんなの
#!/bin/sh
while true
do
"常に立ち上げておきたいプロセス"
適当なエラー処理とかログとか。場合によってあきらめてexitとか。
done
777 :
名無しさん@お腹いっぱい。:04/01/14 18:34
サブシェルで設定した変数の値を取得したいのですが
例)
#! /bin/ksh
export st=0;
(st=1)
echo $st
>775
ps aux|grep /usr/bin/hogehoge > /dev/null 2>&1
if [ $? != 0 ]
then
/usr/bin/hogehoge
fi
gnu grep だったら
ps aux|grep -q /usr/bin/hogehoge
779 :
名無しさん@お腹いっぱい。:04/01/14 23:02
>777
サブシェルが短いなら、
st=`(st=1;echo $st)`
複雑なことしてるなら、一旦ファイルにおとして、
親シェルで読み込む。
でもこれってそもそも、盲点チックな方法だから
用途はかんがえたほうがいいんじゃ。
>>778 ありがとうございました。
grepが見つからない時エラーを返すってところと、$?という変数があるところが
勉強になりました。
781 :
名無しさん@お腹いっぱい。:04/01/25 05:03
テキストファイルから、全角2バイトの文字列を検出(grep?)させるには、
どうしたらよいでしょうか?
>781
漢字コードに依存してしまうけど、
ぼくだったら、
nkf -e <hoge.txt|grep "ほげ"
みたく、一旦eucにしてしまう。
いートシして、マルチにひっかかってしまった!
ぎゃふん
とあるフォルダの中にあるファイルすべての名前を変更しようと思っている。
123あひゃ.txt
1234あひゃ.txt
ファイル名先頭の数字をすべて4桁で統一しようと思った。
そこで俺が書いたスクリプトは
mv $filename `echo $filename | sed 's/^[0-9][0-9][0-9]^[0-9]/0&/'`
これでめでたくフォルダの中身は
0123あひゃ.txt
1234あひゃ.txt
に統一された。
だがあらたな問題が生じた。
ファイル名の先頭に数字以外の文字が来ているのだ。
A123あひゃ.txt
B1234あひゃ.txt
これらを
A0123あひゃ.txt
B1234あひゃ.txt
に統一したいんだがどんなスクリプトを書けばいいんだろうか?
>785
むりくり一行にするんだったら、これ。
mv $filename `echo $filename | perl -ne 's/^(\D+)(\d+)(\D+)$/printf("%s%04d%s",$1,$2,$3)/e'`
>>785 一度4桁以上にしてから減らすのがミソ
mv $filename `echo $filename | sed 's/\([^0-9]*\)\([0-9]*\)\(.*\)$/\10000\2\3/;s/0*\([0-9]\{4\}\)/\1/'`
>>757 亀レスだが…最初の入力リダイレクトの前にフィルタを一つ追加する際の
手間が変わってくるということではないだろうか。
cat ファイル名 | sort | uniq | wc -l
に対し、最初のフィルタに「grep HOGE」と思った時
cat ファイル名 | grep HOGE | sort | uniq | wc -l
とすればよい。この場合、修正は
(1) 「 | grep HOGE| 」挿入
のみ
だが
sort < ファイル名 | uniq | wc -l
と直接書いていると
grep HOGE < ファイル名 | sort | uniq | wc -l
と
(1) 先頭に grep HOGE |」を挿入
(2) sort の後の「< ファイル名」をカット
(3) grep の後にペーストする
と3操作が必要となる。
これが面倒と言っているのでは?(それ以外、思いつかん)
長過ぎるスクリプトって読みづらいしメンテしたくないと
思うのですが、もともと構造のなさげなもの、どうやって
整理するのが正しいのでしょうか?
cat 云々よりも
>標準入力と標準出力でインターフェースを共通化
ケチが付いてたのはこっちの方。でも、もういいだろこの話は(w
>>788 >>691にもあるけど、これだと修正の手間が同じだ。
<ファイル名 sort | uniq | wc -l
794 :
名無しさん@お腹いっぱい。:04/03/24 00:50
ご教授ください。
別のスレに以下のような書き込みがあったんですが、
> "2001050202:20:26" (もしくは"20010502022026")
> みたく変換する関数をshellで定義すれば、
> この文字列は時系列的に大小比較可能
これは、「yyyymmddhhmm」の並びの文字列を、
指定された時間内か否かを、以下のような条件式で
判定できることを言っている?
200403011200 < &NOW < 200404011200
[ 200403011200 \< $NOW -a $NOW \< 200404011200 ]
>>795 \<って使えるのか? -gtじゃないの?
それを言うのなら -lt じゃないのか。bash とかの組み込みコマンドでは、
< や > は文字列の比較に使うようだ。
「使い方が Perl と逆」で覚えてる。きっと俺だけじゃないハズだ。< or -lt
>>797 -ltでしたスマソ。zshではだめだったが、bashは使えた。
皆さん、いろいろありがとうございました。
こんな感じ↓でもできました!
#必要な時間部分をファイルから抽出(":"区切りのファイル)
cut -c45-56 tmp1.txt > tmp2.txt
#第二フィールドの値をSTART_TIMEとEND_TIME内かどうか比較し、別ファイルに出力
awk -F: '{if( '$START_TIME' <= $2 && $2 <= '$END_TIME' ){ print $1 }}' tmp2.txt > tmp3.txt
また別件で質問があります。
trコマンドで、ファイル内のNULL文字を、半角スペースに置換
しようとして、以下のようにコマンドを実行しました。
# tr '\000' '\020' < input.txt > output.txt
しかし、NULLが半角スペースに置換されるのではなく、
NULL文字部分が削除されて出力されました。
半角スペースに置換させたいのですが、この使い方は
間違っているのでしょうか。
ちなみに、Solaris8、コードはEUC、Bシェルを使用してます。
>801
Solaris8がどうなのかは分からないけど、tr が \0 を食ってしまうのは
ありえるような。
tr 以外で頑張ってみたら?
#!/bin/sh
tmpsrc=/tmp/junk$$.c
tmpbin=/tmp/junk$$
cat > $tmpsrc << END
#include <stdio.h>
int main(void) {
int ch;
while ((ch = getchar()) != EOF)
putchar(ch ? ch : ' ');
return 0;
}
END
cc -o $tmpbin $tmpsrc > /dev/null
$tmpbin
rm $tmpsrc $tmpbin > /dev/null
804 :
名無しさん@お腹いっぱい。:04/03/28 21:14
すいません、初心者なんでくだらない質問しますが
シェルを使ってテキストファイルに書きこんだり、読みこんだりするにはどうすれば良いですか?
>>805 ありがd
漠然とした質問でスマンカッタ
ちょと調べて見ます
うーん書き込みは分かったのだけれども
桁数を指定してシェル内変数に読み込むにはどうすれば良いのでしょうか…
808 :
名無しさん@お腹いっぱい。:04/03/28 23:16
read使えばいいんでない?
809 :
名無しさん@お腹いっぱい。:04/03/28 23:28
>>808 うーん、でもreadだと桁数の指定できないんじゃないですか?
>>807 適当なツール(sedとか)で加工すりゃいいだろ。
お前、その頭の固さじゃshellプログラミング向いてない。
811 :
名無しさん@お腹いっぱい。:04/03/29 00:11
>>809 readで、無駄に変数たくさん作ってみる。
read a b c d e f g h i j k
必要な桁だけ使えばいい。
echo $c $f $k
>>810 組み込みコマンドだけでやりたいってことじゃないの?
組込みコマンドだけでシェルスクリプトが書けるはずがない。
すみません。対話式のコマンドをシェルスクリプトで実行することは
できるのでしょうか?
例えばあるコマンドにおいて、パラメータですべてを指定できるなら
シェルで実行できるのですが、パラメータには用意されていない
ものを、コマンド実行中に入力しなければいけない場合、
どのように記述すればいいか分かりませんでした。
できない場合はその旨を教えていただけると幸いです。
よろしくお願いします。
>>814 command <<EOF
parameter1
parameter2
EOF
で無理な場合は
expect
俺は使ったことないけど。
>>814 #!/bin/sh
read d
echo $d
>>815 ありがとうございます。eofでは無理だったのですが、
expectではできそうです。ありがとうございました。
>>814 autoexpect使えば簡単。
勝手にシェルスクリプトができていく。
すみません、シェルスクリプトで、
set res = `cat test.txt`
echo "$res"
としても、test.txtの中身が取得できていません。
何が悪いのでしょうか?
すみません、自己解決しました。
スペースをあけてはいけなかったんですね。
res=`cat test.txt`
でなりました。
test.txtが空とか?
822 :
名無しさん@お腹いっぱい。:04/03/30 21:30
>>819 cat test.txt | ......処理..............
でいいだろうに。
824 :
名無しさん@お腹いっぱい。:04/04/03 10:48
おせーて下さい
Linuxのbashなんですが
echo "aa bb cc"| read dd ee
でdd,eeがNULL何ですが、これってダメなんですか?
もう一つ
cat aa |while read aa
do
if [ $aa = "hoge" ]
then
bb=1
fi
echo $bb
done
echo $bb
ループ内のecho $bb は1が表示されますが
一番最後の echo $bb は値が表示されません
ループ内で定義した変数をループの外で使うことは出来ないのですか?
>>824 >echo "aa bb cc"| read dd ee
read はサブシェルで実行されるので、サブシェルが終了すると dd, ee は忘れられる。
>cat aa |while read aa
while はサブシェルで実行されるので(ry
ksh だとこれでもうまくいったような記憶が。
>>824,825
サブシェルで実行されるのはシェルスクリプト内でパイプを使って while に渡したときのみ。
-- fuga.sh --
#!/bin/bash
while read aa
do
if [ $aa = "hoge" ]
then
bb=1
fi
echo $bb
done
echo $bb
としておいて、
$ cat aa | ./fuga.sh
とすれば望み通りになる。
827 :
名無しさん@お腹いっぱい。:04/04/03 11:27
>>825-826 ありがとさんです。
そうなんですよ、Solaris/kshで動いてたスクリプトを
Linux/bashにコピーしたら動かないんで悩んでました
(Linux初体験)
それまでkshでしかスクリプト書いたことが無かったもんで、
組み込み関数とかは同じようなものみたいだったんで
いけるかな、と思ったんですが、甘かった。
まぁ、そんなに複雑なスクリプトじゃないんで
ご助言を生かして、ぼちぼち改修していきます。
cat で渡さなくてもリダイレクトでいいのでは
#!/bin/bash
while read aa; do
if [ $aa = "hoge" ]; then
bb=1
fi
echo $bb
done < aa
echo $bb
>>824 826とほとんど同じだけど、パイプの後ろを単純に括弧で括ってしまうのが
簡単だと思います。元のスクリプトをほとんど変更しなくて済むし。
cat aa | ( while read aa
##echo $bbまで
)
>>825,826
パイプに参加しているものはすべてサブシェルになるので、その解説を読んで
「パイプの後ろだけサブシェルになるのか」と誤解する人がいそうな希ガスる。
実際、後輩でそう信じてたのがいたから。kshって結構違うんだよね。
>>801 trでNULLは使えなかったような。perlでも使った方が簡単で高速だと思います。
まあ、シェルのスレなんで、スレタイ的にこんなのどーですかw
od -v -t o1 | sed 's/^[0-9]* *//;s/ *$//' | egrep -v '^$' |\
sed 's/000/040/' | tr ' ' '\n' | sed 's/./& /g' |\
awk '{printf("%c",($1*64+$2*8+$3));}'
>>586 >echo *.jpg | sed -n 's/\(....\)\(..\)\(..\)_\(.\)\.jpg/mv & \1\/\1\2\/\1\2\3\/\1\2\3-\4.jpg/p' | sh
これってどういう仕組みで動いてるの?
sedの置換コマンドの中に入ってるmvがどういう処理をするのかわからない。
&はバックグラウンドで実行するということはなんとなく分かるけど。
元のファイル名はechoから受け取って、移動先のファイル名はsedから
受け取ってるのかな?
だれか教えてください
>>830 ''でかこってるから、&はsedに渡されると思うけど。
>>830 うしろの | sh をはずして試してみるべし。
あとでフォローされてるように echo は ls の間違いなので注意。
>sedの置換コマンドの中に入ってるmvがどういう処理をするのかわからない。
どういう処理もしない。ただの文字列。
>&はバックグラウンドで実行するということはなんとなく分かるけど。
違う。man をよく読むべし。
>>831 & の意味を man を読んで理解しました。
>>832 教えてもらったとおり echo を ls に変えて、
後ろの | sh を外してやってみたら...
おー!こういうことだったのか!
こんな方法考えもつかなかった。
>>831-832 ありがとうございました
834 :
名無しさん@お腹いっぱい。:04/04/09 10:30
#!/bin/sh
i=1
while [ $i -le 100 ]; do
echo $i
i=`expr $i + 1`
done
これで1〜100まで表示されるんですが、
頭をそろえて
001
002
と表示したいのですが、どうやればいいのか教えていただけないでしょうか?
>echo $i
expr 00$i : '.*\(...\)'
>>834 for i in `seq -f %03g 1 100`
zshなら
for i in {001..100}
837 :
名無しさん@お腹いっぱい。:04/04/09 10:53
いまどきだとprintf(1)なんてのもあるよ。
840 :
名無しさん@お腹いっぱい。:04/04/23 08:43
>>840 csh は「たのしい UNIX」のせいで、利用者が増えてしまったからなぁ。
お世話になった人もいると思うが、結果的に見ると、悪所になって
しまったような気がする。
842 :
名無しさん@お腹いっぱい。:04/04/26 16:02
typeコマンドで見たら、printfは外部コマンドでした…失礼
まずはposixを参照のこと
845 :
名無しさん@お腹いっぱい。:04/04/29 13:21
このスレいいっすね。「へー知らんかった」ということ多々あり。
ところで私もシェルスクリプトには非常にお世話になっていて、仕事でも
cygwin入れていろいろやっています。で、できたスクリプトを人にあげたり
いじってもらったりしたいという局面が出てきているのですが、今の職場では
シェルスクリプトは殆ど認知されておらずちょっと無理そうです。
で、代替を探しているんですが Java でシェルスクリプト感覚の文字列処理を
行える環境ってありませんか?あればそいつを ant 込みで配布してイイ感じ
に使えると思うんですが。。。みんなJavaはできるので。
具体的にはパターンや簡易なオプションでのファイル名取得やイテレート処理、
comm,sort,diffやらの文字列処理があればいいのかな。
ちなみに職場に受け入れられるかどうかを置いておくとベストソリューションは
Rubyかな、って思っています。日本語ファイル名もへっちゃらで
機能豊富、とっつきやすいから。#自分がRuby使えないんだけど。。。
偉大なシェルスクリプトマスターの皆様は私のような環境におかれたら
どうしますか??
python
>Java でシェルスクリプト感覚の文字列処理を
>行える環境ってありませんか?
Java っぽくて Java とシームレスに使えるスクリプト言語としては pnuts とか。
でも Java で文字列処理って明らかに無駄な労力のような気がする。
そんなこといったらサーブレットやJSP(まぁ文字処理が主な目的じゃないけども)、
1.4で導入された正規表現はどうなるんだ。
>>847 ほしいのは UNIX の shell utility の「機能」といっても
いいかもしれません。sort, sed, awk, find, comm などの
洗練された入力、出力のフォーマット、機能などが Unix に拒否反応を
持っている人達に受け入れやすい環境で適用できたら、と思っているのです。
perl のモジュールにそんなのがあったような、なかったような。
個人的には perl や cygwin を入れさせたいんですがそれも一苦労だし
日本語関係でトラブルが予想されるのがちょっと…なのです。
WSH ってそういうやつじゃなかったっけ
>>846 python は日本語ファイル名でこけませんか?
日本語の含まれるファイルの文字列処理は大丈夫ですか?
その調子じゃ布教は無理だろう
Perlでいいんじゃないの?
同感
javaやる人が日本語のファイル名なんか使うの?
>>863 まさに布教するどころかこちらが宗旨変えしたほうがよいのではないか、
という状況です。手順書作って「手でやれ」文化なんですよ。バッチ化は少し
時間がかかるから最初の2回ぐらいは手でやるほうがコスト安ですし。
ちょっとした処理はみなさんエクセルとか使ってその度手でやっているようです。
私自身は日本語ファイル名は使わない、とかいろいろ束縛を作ってその中で
作業してきたので、いざ何でもありの現場に入ってみるといろいろ試すのが
怖くなってます。CVS に日本語ファイルが突っこまれていたこともあって
自分が cygwin で作ったスクリプトがこけました。
>>364 やっぱ perl になるんですかね。
日本語を含むファイルに正規表現使うと変なことになった記憶が
あるんですが回避策(jperl 以外)はありますか、ここらへんに
関して安心させてくれるドキュメントがありましたら教えてくださいませ。
Web開発をやっている職場なので Perl なら使ってもあまり
批難は受けずにすみそうです。これまで「シェルスクリプトで
できるからいっかー」と避けてきた Perl をやることに
しようと思います。心の中の声は「今さらPerl? Ruby とか Python とか
もっと洗練されているものを使えば〜」と言ってますが (^^;
もはや板違い
アンカーがグダグダ
>>853の意図を誤読?
洗練?
釣り?
黄金?
とりあえず上司に「もっと洗練されている社員を使えば〜」と言っておいて下さい。
>>860 >とりあえず上司に「もっと洗練されている社員を使えば〜」と言っておいて下さい。
Web開発なんて職場にそんな事考えられる上司すら居ないんじゃないかと思われ(ry
rubyもいいよ
>>860 853の意図は存じておりますよ♪アンカーずれてごめんね。
混沌状態を飛ばしてひとあしとびに洗練された社員にはなるのは
難しいんですよ。うちも人的リソースは厳しいんで私が
頑張って洗練された社員になる予定です(w
おかげさまで考えがまとまりました、とりあえず UNIX shell 環境は
一時おさらばします。
>>849 >>850 >>852 >>858 >>859 このレスは全部
>>845 なんだろ?
なんで 761 なんだ?
>>761 と同一人物なのか?
仮にそうだとしても分かりにくいぞ。
==
From: [859] 761 <>
Date: 04/05/01 14:03
>>364 やっぱ perl になるんですかね。
==
>>364 は awk について書いてくれてるんじゃないのか?
とりあえず少し落ち着いて整理してくれ。
コメントができない。
>>860 ももう少し優しくしてやれよ…
確かにイケテナイけど、せっかく聞いてくれてるんだからさ
はいな。
>>864 >>865 やばっ 761 を詐称してしまった…、それにアンカーも酷い…。
厳しいお言葉をいただくのもごもっともです。失礼すました。
868 :
名無しさん@お腹いっぱい。:04/05/07 11:19
コマンドラインの結果を1行ずつ読んで細工する方法で
綺麗なのってないでしょうか?
例えば、あるディレクトリのファイルに .txt って拡張子をつける場合、
for i in `ls -1`
do
mv $i $i.txt
done
でいけそうですが、スペースもセパレートされてしまうので、
スペースを含むファイル名があると対応できません。
それで、こんなのを考えてみましたが、無駄が多すぎます。。
j=`ls -1 | wc -l | awk '{print $1}'`
c=0
while [ $c -lt $j ]
do
c=`expr $c + 1`
i=`ls -1 | head -${c} | tail -1`
/bin/mv "$i" "$i.txt"
done
確かこんなだったような。
一応自分で動作確認してくれ
set "*"
for i in $@
do
mv "$i" "$i.txt"
done
>>868 ディレクトリにファイルしかないというのなら、
ls | while read file ; do
mv "$file" "$file.txt"
done
list1.txtからlist2.txtに書かれているものを除外して表示するスクリプトを作っているのですが、綺麗な書き方を教えてください。
シェルはkshです。
自分が作ったのはコレです。
#!/bin/ksh
while read A
do
if grep -x "${A}" list2.txt > /dev/null 2>&1
then
true
else
echo "${A}"
fi
done < list1.txt
>>872 cat list1.txt list1.txt list2.txt | sort | uniq -c | grep 2
もし list1.txt や list2..txt の要素に 2 という文字が含まれるなら
最後の grep 2 をもう少し工夫しろ。
>>873 なるほど、ありがとうございます。
「2」含まれる可能性あるのでこうゆう風にしますた。
cat list1.txt list1.txt list2.txt | sort | uniq -c | grep -E '^ *2' | cut -f2-
list1.txtを2個catしてるのはなにか意味があるのでしょうか?
↓でも(・∀・)イイ!!??
cat list1.txt list2.txt | sort | uniq -c | grep -E '^ *1' | cut -f2-
list1.txt を 2 個 cat すると、、、
list1.txt にも list2.txt にも含まれる場合は 3 個
list1.txt だけに含まれて list2.txt に含まれない場合は 2 個
list1.txt に含まれず list2.txt だけに含まれる場合は 1 個
となる。1 個しか cat しなかったら
list1.txt だけに含まれて list2.txt に含まれない場合と
list1.txt に含まれず list2.txt だけに含まれる場合が区別できない。
grep -v -f list2.txt < list1.txt
でいいような気がするが違うんか?
俺もそれでいいと思うが、-f が使えない grep があるかもしれない。
メタ文字の扱い次第では fgrep の方がいいのだろうか
list1.txt にダブリがないかチェックする必要があるな
>>879 メタ文字については-F(--fixed-strings)使えばいいだろう。
あと部分文字列の扱いをどうするかが明確じゃないような。
list2.txtにfooという行があったときにfoofooはどうなるか。
行全体でマッチなら-x(--line-regexp)も併用することに
なるだろう。
普通に
>>872を読むと、行全体の完全マッチのように思うけど。
でもこの仕事はawkやperlで書いたほうが同じぐらいのコードで
しかも速くできるような気がする。list2.txtがそれほど大きく
ないなら、list2.txtの内容をhash setに突っ込むのが一番はやいんじゃないの
ワンパスで済むし。
awk使っていいなら
awk 'BEGIN{ while(getline l < "list2.txt"){a[l]=1}} {if(!a[$0]){print}}' list1.txt
てなとこかなー。300行ぐらいのてきとうなファイルで
grep -v -x -F -f list2.txt list1.txt
と比べてみたけれども、grepは0.4秒ぐらいでawkは0.01秒(あまり正確じゃない)
だった。
>>884 予想通りawkのが速いけど、その程度ではあまり意味のない差とも言えるな(w
まーまじめにリレーショナルの差集合じみた演算を実装したいんなら
オンメモリの連想配列頼りというのも不安だから、実はまじめに
プログラムを書く余地があるということか。
「まさにそのもの」というコマンドが無いのは結構意外かも。
>>885 どっちも1秒以内だしこれならタイピング時間の差でgrepが速い
ことになりそうだ(笑)
grepの方はlist1.txtとlist2.txtの行数の積に比例するのですぐに
とんでもないことになるかもな。
連想配列がメモリにのらないほどになったら、perlでdbmにtieした
ハッシュ使えばいいだろう。ほとんど手間は変わらない。
join
>>886 あ、確かにPerlならそれが一番賢いわな。
ってどんどん原始的でなくなってるが……(w
>>887 そんなコマンドがあるなんて、しらなかったYO.
しかもPOSIXで定義されてる……。
commってのもあるね
あれ?
いま、joinのman読んだけど、これってリレーショナルで言う
INNER JOINしか実現できないんでないの?
これで差集合、とれる?
3パターンで試してみますた。
list1.txt 13062行
list2.txt 11792行
$time grep -v -x -F -f list2.txt list1.txt
real 4m0.58s
user 3m48.96s
sys 0m0.27s
$time awk 'BEGIN{ while(getline l < "list2.txt"){a[l]=1}} {if(!a[$0]){print}}' list1.txt
real 0m0.78s
user 0m0.72s
sys 0m0.03s
$time cat list1.txt list1.txt list2.txt | sort | uniq -c | grep -E '^ *2' | awk '{print $2}'
real 0m2.04s
user 0m1.94s
sys 0m0.05s
2番目のawkが断然速いのですが、変数にガンガン入れてメモリが心配になったので3番目のやつを使うことにしますた。
/. より参考になる(+1)
メモリ使用量という観点からは、3番目のsortの使用量が、2番目のawkの使用量より
3倍近く多くなると思うが実際のところはどうなんだろう。awkの配列が冗長だと
3番目より多くなるのかな。
>>892 わざわざ質問して→複数の回答をもとに性能比較して
などという検討フェーズ持つ時間があるんなら、もっと凝ればいいのに(w
それ、どれも使い捨てのワンライナーじゃん。
メモリが不安ならDBM使えばヨシ、という案も出てるでしょ。まあperl他が前提に
なっちゃうけどな。
>>894 変数いっぱい使ってるから重くなるんじゃないか?っていう素人な考えなのですが、実際のとこどうなんでしょうかね。
本番機で流すのでなるべく負荷が少ないほうがいいんですが・・・。
>>896 ちょいかえて、
cat list1.txt list1.txt list2.txt | sort | uniq -c | awk '$1==2 {print $2}'
が一番かな?メンテ効率を考えると、3秒で理解できるし。
awk '$1>2 {print $2}'
にも変更きくのが強み。
comm -23 list1.txt list2.txt
>>898 まさにコレっていうコマンドあったんですね。
ありがとうごぜいます。
.
902 :
名無しさん@お腹いっぱい。:04/06/24 02:01
コマンド | while read LINE
do
処理
echo '次逝って(・∀・)イイ??'
read ANSWER
処理
done
ってことをしたらコマンドの結果が'read ANSWER'にも食われちゃいました。
正しく動作させるにはどーしたら良いでしょーか?
read ANSWER </dev/tty
#!/bin/sh
/bin/sh $0
>>903 やってみたらbashではうまくいったけどzshではうまくいかなかった。
なぜだろう?
ありがとうございます。kshでうまくいきました。
ちなみに私の環境だとzshでもいけました。
$ zsh --version
zsh 4.0.6 (i386-redhat-linux-gnu)
/
emacsをemacsclientとして起動してるんですが、、emacsがひとつも起動してない場合はemacsclientではなくemacsを起動する、みたいなscriptはどのように書けばよろしいのでしょうか?
909 :
名無しさん@お腹いっぱい。:04/07/17 00:28
シェルの中のコマンドの戻りがほしいんだすが。
例)
aaaを実行するとパスワードを聞かれます。
確認の為、2回パスワードを聞かれます。
それをシェル実行時のパラメータで渡して、実行しいのですが
うまくいきません。
ヘルプミー
#!/bin/sh
/usr/local/bin/aaa
$1
$1
echo "Finish"
そうすれば2回のパスワードを入力した状態にできるのでしょうか?
>>908 emacsclient || emacs
>>910 レスthxです。
動くのですが、1回目は必ず失敗します。
Ctrl+Cで抜けて、もう一回叩くと成功します。
一回目失敗するのは
Enter password: test
ここで止まってしまいます。
2回目は必ず成功します、、、、、
何か間違った記述をしていますでしょうか?
#!/usr/bin/expect
set passwd [lindex $argv 0]
set timeout 10
spawn /usr/local/bin/aaa
expect "Enter password:"
send "$passwd\n"
expect "Verify password:"
send "$passwd\n"
interact
>>912 自己解決しました
send "$passwd\n"
ダブルクォーテーションがいりませんでした。
send $passwd\n
とやったらうまくいきました
ログイン中に実行した全てのコマンドの出力をログファイルに逐一記録していくというのはどうすれば実現出来ますか?
全コマンドにパイプでteeを通せばいいと思うんですが・・・。
>>915 ttyrecとは面白そうなものがあるんですね。
文字列が取れれば良いだけなので、これの元版である script コマンドを利用することにします。
ありがとうございました。
ちなみに、用途はリモートのサーバ管理でrpm等のコマンドログを記録し、後でアンインストールや
分析のために使うといったものです。完全な依存性解決が出来ないものや、アンインストール時に
残る設定ファイルのバックアップを削除する、等に有用そうです。(常識なのかもしれませんが)
shell の history って話ではないの?
(-_-)ウツダ
そんな話ではなかったですね
920 :
名無しさん@お腹いっぱい。:04/07/27 19:12
$cat set.txt
export A="hogehoge"
$cat hoge.sh
#/bin/sh
. ./set.txt
echo "$A"
ってな感じで変数をセットして処理してるんですが、外部ファイルからセットするやり方はコレで正しいですか?
それとも専用のコマンドとかありますか?
あと、set.txtのような設定ファイルの拡張子は慣習的にコレ!ってゆうのはありますか?iniかな?
>>920 私はこんな感じでやってます.
$ cat set.txt
#!/bin/sh
COMMAND='A="hogehoge" '$@
eval $COMMAND
exit $?
$ cat hoge.sh
#!/bin/sh
echo "$A"
$ ./set.txt ./hoge.sh
hogehoge
./configureする前にCFLAGSとかCXXFLAGSとかに最適化フラグを設定したいときなどは,
これでやってます.
ですんで,上記set.txtにあたるファイルの名はexecute_with_flag_optimaizeにしてて,
$ execute_with_flag_optimaize ./configure --prefix hoge
なんてやってます.
>>921 なかなかいいんだけど、evalのところで、""の情報が消えないか?
./set.txt touch "hoge fuga"
とかやったとき
こんなかんじで一応できるようだ。
$ cat quote.sh
#!/bin/sh
for i
do
echo -n \"$i\"" "
done
$ cat set.txt
#!/bin/sh
COMMAND='A="hogehoge" '`quote.sh "$@"`
eval $COMMAND
exit $?
というか
#!/bin/sh
A="hogehoge" "$@"
これでいいじゃん。
>>925 !なるほど.
しかし私はなんで921みたいにやったんだろう?
927 :
名無しさん@お腹いっぱい。:04/07/31 02:11
変数に文字列を入れたいのですが,その文字列はいろいろなコマンドや awk をパイプで
通ってきたものなんです.
一旦ファイルに入れる以外に,どう書いたら良いのでしょうか.
クォートやエスケープだらけで混乱してしまいます.
emacs のモードがやってくれれば,いくらかマシなんですが...
hoge=`while test -ge 1; do ... ; shift; done | awk '... {...} ...'`
>>927 一行野郎でやりたいわけ?
#ところで'-ge'の左辺はどこに消えた?
つか、具体的にどんな処理をしたいの?
それを書かなきゃ何も判らん罠。
ちゃんと相談する気があるなら、今宵は暇だから付き合ってやってもいいぞ。
>>927 その「いろいろなコマンド」を ` ` の中に書けばいいだけでは。
「いろいろなコマンド」の中で ` ` を使ってるようなら、
最近のシェルの場合は ` ` の変わりに $( ) を使うとネストしやすい。
shiftを使ってるって事は一行野郎ではなさそう。
awk絡みのクオートがややこしいと感じるならawkスクリプトを別ファイルに書いたら?
hoge=`while test $# -ge 1; do ... ; shift; done| ./fuga.awk`
レスが遅れました.ごめんなさい.
夜遅くでしたので,既に考え方に無理があったのかも知れません.
>>928 ファイルに書いて使うシェルスクリプトです.
「こんな感じ」という意味で書いたのに間違えていましたね.左辺は $# で,
ファイル名です.awk が gnuplot に与えるコマンドの一部を作ります.
それを後でちょっと変えて,最後に gnuplot の set と一緒に gnuplot <<EOF の中に
書こうと思ったのです.
>>929 あぁ...書いた後すぐダウンしました.夜は粘れなくて...
引数に与えたファイルの数だけ
"filename" using 1:2 ,\
"" using 1:3 ,\
を増やそうと思ったのですが,最後のファイルについての 2 行目は
,\ を出力してはいけないんです.
なので,ここは awk でやり,文字列を変数に受け取ろうと思いました.
gnuplot には,グラフの設定にあたる部分と,このプロットをする部分とを
gnuplot <<EOF の中で結合して渡そうとしました.
そこで,どうすればプロットする部分を変数に入れておけるのかな,と思ったのです.
>>930 こんなのがあるんですか.
bash なのに bourne shell っぽくストイック書いていましたが,
この際 bash をフルに使ってみようと思います.
>>931 あまりファイルを増やしたくないのと,中途半端な機能しかないのを分離すると
ディレクトリが汚れてしまうので...
934 :
名無しさん@お腹いっぱい。:04/08/05 13:59
対話的に現在入力中の一つ前の引数に置換されるのってありましたよね?
なんでしたっけ?
% cp file !$.bak
みたいにやって、file.bak にしたいのですよ。
使ってるのはzshです。
% cp file !#$.bak
みたいなのでいいのかな。
でも、対話的に使っているのなら zsh では copy-prev-word を使った方が楽なような。
大抵の端末なら Esc-C-/ で OK
>>936 おー知らなかった。結構使い道ありそうだね。
938 :
名無しさん@お腹いっぱい。:04/08/07 11:31
bshで環境変数に環境変数名がある時、その環境変数名の値を取り出すにはどうしたらようですか?
AAA="aaa"
BBB="AAA"
のときにBBBからaaaを取得したいんです
>>938 eval echo \$$BBB とか。
つーか、環境変数じゃなくてただの変数では。
940 :
名無しさん@お腹いっぱい。:04/08/07 20:58
>>939 ありがとうございます
で、またまた質問なんですが
====test.sh===========
#!/bin/sh
AAA="aaa"
BBB="AAA"
CCC=`eval echo \$$BBB`
echo "CCC [$CCC]"
===============
で
$ test.sh
としたばあい
CCC [2256BBB]
となってしまいます
予想では
CCC [aaa]
となつと思ったのにさっぱりわかりません
#!/bin/sh
AAA="aaa"
BBB="AAA"
eval CCC=\$$BBB
echo "CCC [$CCC]"
漏れは aaa command not found とかになるかな,とか思ったのに,
なぜか実行できた.どうして? エロい人!
>>940 ` ` の中の \$ が $ に置換され
その後 $$ が PID に置換されてるんでは。
だから
CCC=`eval echo \\\$\$BBB`
とすればいい。
945 :
名無しさん@お腹いっぱい。:04/08/08 15:29
csh使ってるんですが、あるコマンドが";"で区切られた引数を要求するんで
#!/bin/csh
set cmd="/usr/sbin/foo --options='100;200;1;3' -exec"
$cmd
とscriptに書いたのですが、";" が邪魔をして上手く実行できません。
どのように書けば ";" に邪魔されずに $cmd が実行できるんでしょうか?
エスケープしてみろ
動くかどうかは知らんが。
947 :
名無しさん@お腹いっぱい。:04/08/08 21:30
grep "hoge" $file | while read tmp
do
done
echo $tmp
とすると、$tmpの中身が表示されません。
echo $tmp
をdoの中に入れると表示されるんですが、
doの外でも動作させるにはどうすればいいですか?
>>947 そのスクリプトがやりたいことは,
grep "hoge" $file | tail -1
ですよね?
while ...; do ...; done
内の変数を外に出したいとすれば,,,,,,$(...) に入れるとか?
>>947 それ、別プロセス以前に、最後の read が $tmp を空にしてる気がする。
とりあえず、
seq 10 | ( while read tmp; do tmp1=$tmp; done; echo $tmp1 )
みたいにしたら、 tail -1 みたいな動作はしたよ。
>>948-950 あ、そうか。
whileでEOFを読んじゃってるのか。
そりゃ空になってますね。
ありがとうございました。
他の方法でやってみます。
すみません質問なんですが、
Kshで、片方若しくは両方の変数に2ギガを超える数値を設定して
[[ $inumA -gt $inumB ]]
のような条件式を使うと期待した結果が出ないのですが
対応策のようなものをご存知の方居たらご教授いただきたく。
ちなみにOSはHP-UXです
perlかawk使えと怒られそうですが。
cshでファイルに書かれている内容を1行ずつ処理をしたいのですが、これって
やっぱり無理なんでしょうか?
>>952 ハードのモデルは?
HP-UX のバージョンは?
>>952 確か、桁が多い数値の比較はbcコマンドでやればいいんじゃなかったかな。
>>954 ハードは多分HPです。
OSは11.00でした。
>>955 シェルでbcコマンドって使ったことがないのですが
自分の例で行くと
[[ `echo $inumA | bc -l ` -gt `echo $inumB | bc -l ` ]]
のような形になるのでしょうか。(-gtは>になる??)
ともあれ早速試してみます。ありがとうございます(ぺこり)
>>956 確かこう。
A="1234567890999"
B="2234567890999"
if [ "$(echo "${A} < ${B}" | bc)" -eq 1 ]
then
echo ok
fi
>>956 スマソ。957のはcygwinでは出来たけどHP-UXじゃ出来ないかも。
こんなのはどお?
export A="12345678999999999"
export B="22345678999999999"
if awk 'END{if(ENVIRON["A"]+0 > ENVIRON["B"]+0) exit 1}' /dev/null
then
echo ok
fi
とある環境変数が、
- そもそも定義されていない
- 定義されているけれども、値が「""」(空白文字列)である
を sh で判定する方法を教えてください。
現在は set を使って以下のような醜い方法で判定しています。
#!/bin/sh
isDefined(){
set | grep "^${1}=" > /dev/null && return 0
return 1
}
x=""
isDefined x && echo "x is defined" || echo "x is not defined"
isDefined y && echo "y is defined" || echo "y is not defined"
% cat hoge.sh
#!/bin/sh
x=""
echo ${x+"x is defined"}${x-"x is not defined"}
echo ${y+"y is defined"}${y-"y is not defined"}
% sh hoge.sh
x is defined
y is not defined
>>960氏
以下のように試してみましたが、ヒントから手がかりがつかめません。
もうちょっとヒントください。(-人-)
#!/bin/sh
x=""
printenv $x
echo $?
printenv $y
echo $?
>>961氏
面白くて参考になります。ありがとうございます。
「定義されているかどうかをチェックする」関数にしたいという希望があったため、
以下のようにしました、、、んが、頭が悪く、スマートな方法が思いつきませぬ。
関数として定義する場合で、もっと頭の良い方法ってあるでしょうか?
#!/bin/sh
isDefined(){
if [ `eval "echo \\${$1+\\"0\\"}\\${$1-\\"1\\"}"` != "1" ]; then
return 0
else
return 1
fi
}
x=""
isDefined x && echo "x is defined" || echo "x is not defined"
isDefined y && echo "y is defined" || echo "y is not defined"
最初に環境変数って言ったから printenv が出てきたんだと思う。
本当に環境変数なら俺も printenv に一票入れるが、
どうもやりたいことは違いそうだな。
>>962 仕様をよく読んでないけど test -z じゃだめなん?
>>955氏
返事遅れてすみません。
>>957のほうは今日試してみて稼動確認取れました。
>>958はまだ試してないんですが、今度チャレンジしてみたいと思います。
本当にありがとうございました
>>965 957のほうで出来ましたか。オレが試したHP-UXだと出来なかった。
最近知ったんだけど、こっちのほうがいいかも。解かり易い。
if expr ${A} '>' ${B} > /dev/null
then
echo ok
fi
bc,awk,expr、桁の制限でいったらどれが一番イケるんだろ?
>>959 は、
環境変数→変数
空白文字列→空文字列
の間違いか。
>>962 961ではないが、こんな感じでいいのかな。
#!/bin/sh
isDefined () {
if eval [ x'${'"$1"'+0}' = x"0" ]; then
return 0
else
return 1
fi
}
x=""
isDefined x && echo "x is defined" || echo "x is not defined"
isDefined y && echo "y is defined" || echo "y is not defined"
zsh だと ${+name} みたいなものもサポートされているようだが。
isDefined(){
eval return \${${1}+0}\${${1}-1}
}
>>968 それだと値が入っているときにおかしくならないか?というわけで、、
isDefined(){
eval \${$1+true} false
}