07/02/27 22:51:13
>>125
その vi の実体は、賢い vi で、
シェルの ENV がついていけてないとか。
128:名無しさん@お腹いっぱい。
07/02/28 00:25:54
Cシェル、Oracle10gで
exp ~ query\"where column_name in\( select col from tableB \) \"
みたくqueryパラメータで副照会できないようなんで
exp ~ query\"where column_name in\( $COLUMN_NAMES \) \"
なんて具合に変数を埋め込みたい。
シェル変数が展開されてからexportに渡されるようにする方法ないかな?
129:名無しさん@お腹いっぱい。
07/02/28 00:54:58
>>126
nkf -g が無いバージョンかな?
130:名無しさん@お腹いっぱい。
07/02/28 01:00:16
おお、そんなものが。
nkf -wができることに最近気づいたくらいアップデートしてなかったんで。
131:名無しさん@お腹いっぱい。
07/02/28 09:20:31
浜田マキ子って人のジャーナル見てみなよ。
中国の恐さにぞっとすること請け合い。
あいつら本気で日本を侵略する気だ。
そして、手下はやはり立命館?
132:118
07/03/01 04:39:27
>>122
すんません書き漏れです
知りたいのはsh-posixとksh88の機能差です
kshにksh88とksh93があってかなり違うってのは知ってるというか
kshの情報には大抵2つのバージョンの比較が併記されてるもんだし
ただsh-posixとksh88の比較は見たことがないし違いも見つけられなかったもんで
133:名無しさん@お腹いっぱい。
07/03/01 06:28:17
>>132
・ パターンマッチングがegrep相当に拡張
・ [[ ほげ ]] (中身をメタキャラ解釈しないtestのようなもの)
・ 配列が使えた
・ emacs風コマンドライン編集
ってとこか。なおksh93はksh88と挙動が違ったりバグが直されたりしてるし、
ksh88とpdkshでも機能に違いがあるので、
ksh88で動けば他のkshで動作するとは限らない
134:名無しさん@お腹いっぱい。
07/03/01 22:50:40
ksh に限らないが、バージョン依存の対応は本当に面倒だな。
135:名無しさん@お腹いっぱい。
07/03/02 00:10:52
こういうデータを、
----
yes
・・・・
・・・
・・・・・
IPアドレス xxx.xxx.xx.54
----
no
・・・・
・・・・・
IPアドレス xxx.xxx.xx.123
----
yes
・・・・・・・・・
・・・・・
IPアドレス xxx.xxx.xx.23
こういうふうに加工したいのですが、
yes,xxx.xxx.xx.54
no,xxx.xxx.xx.123
yes,xxx.xxx.xx.23
・・・・・・・・・
・・・・・
の部分は2行のときもあるし10行のときもあります。
136:135
07/03/02 00:14:33
最初の
----
と
IPアドレス
という文字をうまく関連付ければ
加工可能とは思うのですが、
具体的にどうしたらいいのかよくわかりません。
最初の
----
を見つけたら
その次の「IPアドレス」という文字列を捕まえて
xxx.xxx.xx.123を確保する、
という形でしょうか。
うまい方法があればヒントをいただけますか?
cat、more、grep、cut、sedなど一般的なコマンドは習得しています。
137:名無しさん@お腹いっぱい。
07/03/02 00:19:45
1行1レコードじゃないときは
めんどくさいから perl 使っちゃうな。
138:名無しさん@お腹いっぱい。
07/03/02 00:34:22
csplit input '/^----$/' '{*}'
for file in xx*; do echo `sed -n '2p;${s/.* //;p}' $file`; done
csplitってPOSIX標準だっけ?
139:名無しさん@お腹いっぱい。
07/03/02 00:34:30
俺もperlかawkに1票。適材適所ってやつ。
140:名無しさん@お腹いっぱい。
07/03/02 01:17:00
awkで RSに---を入れてやればいいじゃない
141:名無しさん@お腹いっぱい。
07/03/02 01:52:51
ここはあえてCで
142:名無しさん@お腹いっぱい。
07/03/02 02:52:27
>>141
書いてみて
143:名無しさん@お腹いっぱい。
07/03/02 08:40:46
>>135
俺も awk に一票だが、
最初と最後をどうにかすれば grep と sed だけでもできそう。
grep -C 1 -x -e ---- | sed ....
こんな感じで。
144:名無しさん@お腹いっぱい。
07/03/02 08:56:59
143 | sed -n '
N;
N;
N;
s/¥(yes¥|no¥)¥n/¥1 /;
s/----¥n//;
s/--¥n//;
s/IPアドレス //;
p'
改行ってどこのsedでも¥nと書けるのだっけ?
145:名無しさん@お腹いっぱい。
07/03/02 09:03:20
あー、最後の部分がきちんと処理できないな。
146:名無しさん@お腹いっぱい。
07/03/02 09:10:43
sed -n '
/¥(yes¥|no¥)/h;
/IPアドレス /{
H;
x;
s/¥(yes¥|no¥)¥n/¥1/;
s/IPアドレス /,/;
p
}' input
どだっ!?
147:135
07/03/02 13:43:23
みなさんありがとうございます。
僕はまだレベルが低いですし
awkは(難しくて)使えないので
>>143さんの
grep -C
オプションでやってみよと思います。
148:名無しさん@お腹いっぱい。
07/03/02 15:27:32
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするにはどうすればいいですか。
149:名無しさん@お腹いっぱい。
07/03/02 15:32:33
>>148
ちょっと、質問が複数の意味に取れるけど、
ls > "$1"/"$2"
ってことか?
150:148
07/03/02 16:42:33
>>149 できたっす。バックスラッシュいれてたっす。
151:名無しさん@お腹いっぱい。
07/03/02 17:25:16
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするときに、すでにファイルが存在する場合、上書き確認のメッセージを出して処理を分岐させるにはどうすればいいですか。
152:名無しさん@お腹いっぱい。
07/03/02 17:27:36
test -f ファイル
[ -f ファイル ]
153:名無しさん@お腹いっぱい。
07/03/02 18:47:44
その調子で、1から10まで全部ここで聞くのか?
154:名無しさん@お腹いっぱい。
07/03/02 19:02:57
シェルスクリプトの犬小屋でも作るか?
155:名無しさん@お腹いっぱい。
07/03/02 19:07:44
いらね。
156:名無しさん@お腹いっぱい。
07/03/02 21:48:30
>>152
便乗質問ですが、よく、ファイルがあるかどうかを判断するのに、
test -fを使えと言われるのですが、実行しても何も起こりません。
何か設定が必要なのでしょうか?
157:名無しさん@お腹いっぱい。
07/03/02 21:58:24
test -f hoge && echo found
158:名無しさん@お腹いっぱい。
07/03/02 22:18:29
「ファイルがあるかどうか」なら、test -fじゃなく、test -e使え。
test -fだとレギュラーファイル以外はないものと判定されるぞ。
(デバイスファイルとか、broken symlinkとか、socketとか)
159:名無しさん@お腹いっぱい。
07/03/02 22:36:23
>>158
だめーっ。Bourneではtest -eは使えなーい。test -fが定石。
160:名無しさん@お腹いっぱい。
07/03/02 22:40:52
if exist %1
161:名無しさん@お腹いっぱい。
07/03/02 23:04:59
>>156
何かが起こるように書けばいい。
test を実行しただけで何も起こらないのは当たり前。
162:名無しさん@お腹いっぱい。
07/03/02 23:15:29
Bourne Shellのif文で、ifの次に来るのはコマンド(列)
test...も [ ... ] もコマンドを実行してる。
実行した結果のステータスコードで分岐するだけ。
163:名無しさん@お腹いっぱい。
07/03/03 00:09:47
>>159
>>162の通り、testはシェルの内部コマンドではない。Bourneかどうかは関係ない。
まあそれはそれとして、autoconf infoの"Limitations of Builtins"から抜粋。
POSIXも信用せずにportableにしたいならどおぞ。
... use `test -f' or `test -r'. Do not use `test -x', because 4.3BSD
does not have it. Do not use `test -e' either, because Solaris 2.5
does not have it. To test for symbolic links on systems that have
them, use `test -h' rather than `test -L'; either form conforms to
POSIX 1003.1-2001, but older shells like Solaris 8 `/bin/sh' support
only `-h'.
164:名無しさん@お腹いっぱい。
07/03/03 00:37:34
うちのシェルでは内部コマンドなのだが。
165:162
07/03/03 01:05:35
>>164
そういえばそうか。シェルの実装はtestを内部コマンドとして定義しても
いいんだっけか。すまん間違えた。
166:名無しさん@お腹いっぱい。
07/03/03 01:21:37
testは外部コマンドだから条件分岐は出来るだけcaseを使おうって話を
どっかで聞いたことがあるけど、
UNIX黎明期を除けばどのシステムでもシェル組み込みコマンドとして実装されている。
ループで最頻出のコマンドが外部呼び出しじゃ実用的な速度が出ないだろうしね。
167:名無しさん@お腹いっぱい。
07/03/03 01:30:36
>>166
KernighanとPikeのUnix Programming Environmentにそういう記述があった希ガス。
UNIX第7版とかの時代の話だが。
168:名無しさん@お腹いっぱい。
07/03/03 07:57:52
162は俺なのだが……、俺は「外部コマンド」とは書いてないぞ。
169:163=165
07/03/03 11:51:37
>>168
すまん番号間違えた。
漏れは163と165だた
170:名無しさん@お腹いっぱい。
07/03/03 12:08:23
>>166
適当なループ回して試してみろ。
testが内部コマンドである現在のシェルでも、
case使った方が、if [ ... ] よりも若干速いよ。
おそらく、内部コマンドとはいえ、独立したコマンドとして
内部的に実行するオーバーヘッドがtestにはかかるんだろう。
caseの場合はシェル本体が直接解釈するから
オーバーヘッドはtestよりも少ないと。
171:名無しさん@お腹いっぱい。
07/03/03 14:06:00
>>170
釣りか天然か... 判断に苦しむ。
172:名無しさん@お腹いっぱい。
07/03/03 14:20:05
>>171
釣りじゃないだろ。実験してみろ。time sh -c '...' とかで計れる。
確かに caseの方がちょっと早い。
173:名無しさん@お腹いっぱい。
07/03/03 14:34:36
>>171
おかしなところがあるなら具体的に指摘してみればいいじゃない
174:名無しさん@お腹いっぱい。
07/03/03 14:37:35
だね。あと、zshだと何故か違いが顕著になる。
$ time zsh -c 'for i in `seq 1 10000`; do [ a = a ] && :; done'
real 0m3.051s
user 0m2.705s
sys 0m0.207s
$ time zsh -c 'for i in `seq 1 10000`; do case a in a);;esac; done'
real 0m0.915s
user 0m0.703s
sys 0m0.204s
↓おまけ。[ ]の代わりに [[ ]] にすると、内部コマンドじゃなく、
直接のシェル文法になるので、早くなる。
$ time zsh -c 'for i in `seq 1 10000`; do [[ a = a ]] && :; done'
real 0m1.708s
user 0m1.201s
sys 0m0.402s
175:名無しさん@お腹いっぱい。
07/03/03 15:41:12
>>173
おかしなところは推測の部分。単に実装の違いだけでしょ。
ksh(93)
case 0.65 real 0.46 user 0.17 sys
test 0.58 real 0.46 user 0.10 sys
pdksh
case 23.23 real 22.45 user 0.20 sys
test 4.96 real 4.74 user 0.14 sys
bash2
case 3.52 real 3.21 user 0.24 sys
test 4.26 real 3.93 user 0.25 sys
ash
case 0.38 real 0.28 user 0.09 sys
test 0.52 real 0.45 user 0.05 sys
176:名無しさん@お腹いっぱい。
07/03/03 17:55:22
>>175
その実装の違いを推測してるのではないか? なので、おかしくない。
ちなみに俺の環境では、kshでもtestよりcaseの方が速かったよ。
177:名無しさん@お腹いっぱい。
07/03/03 18:59:53
つまり、testよりcase使え、って言うテクは今でも生きてるってわけか。
178:名無しさん@お腹いっぱい。
07/03/03 20:43:22
bash3 [[
real 0m1.758s
user 0m1.562s
sys 0m0.160s
bash3 case
real 0m1.515s
user 0m1.341s
sys 0m0.150s
確かに少しだけど、case の方が速いね
179:名無しさん@お腹いっぱい。
07/03/03 20:53:55
>>178
いや、[[じゃなくて [ と caseを比較するという話だが。
速い順に、
case > [[ > [
となると思う。
180:名無しさん@お腹いっぱい。
07/03/03 21:13:01
>>179
あ、そうだったっけか。
bash3 [
real 0m2.388s
user 0m2.042s
sys 0m0.370s
181:名無しさん@お腹いっぱい。
07/03/04 21:32:58
Bashにおいて以下の条件で動くシェルスクリプトを書く場合、どのように書けばよいのでしょうか?
ディレクトリ名とその中にあるファイルサイズが0のファイル名を出力する。
補足1:ディレクトリが特定されていない場合は、現在シェルが働いているディレクトリ名を出力する。
補足2:もし引数がディレクトリ名でない場合は、すべてのコマンドラインの引数にエラーメッセージを出力する。
補足3:ファイル名の一番最初の文字が、「.」の場合は無視するようにする。
182:名無しさん@お腹いっぱい。
07/03/04 21:54:16
>>181
問題に曖昧なところがあるけど、こういうことか?
bashじゃなくてもB-sh共通で動く。
dir=${1-.}
if [ ! -d "$dir" ]; then
echo "$dir is not a directory" 1>&2
exit 1
fi
for f in "$dir"/*
do
if [ ! -s "$f" ]; then
echo "$f"
fi
done
183:名無しさん@お腹いっぱい。
07/03/04 21:55:25
「すべてのコマンドライン」の意味がちょっと判らないけど、
大体こんな感じじゃない?
usage() {
echo "Usage: ..." 1>&2
exit 1
}
test -d $1 && find $1 -not -name '\.*' -size 0 -print || usage()
ただし補足1はGNU findの機能を使ってるので、どのfindでもということなら
$1が空だった場合の扱いを自分でする必要がある。あと、「.」で始まる
フォルダは処理したいのなら、find の条件をもうちょっと詰める必要がある。
184:名無しさん@お腹いっぱい。
07/03/04 21:59:31
宿題にマジレスはご遠慮ください。本人のためになりません。
185:名無しさん@お腹いっぱい。
07/03/04 22:01:31
>>182
レスありがとうございます。
問題文は元々英語の為、変な訳になって細かい部分が伝わらず申し訳ありません。
英文ですが、元の問題はこちらです。URLリンク(user.ftth100.com)
186:181
07/03/04 22:21:53
>>183
分かりやすい解説付でありがとうございます。
この場合、
test -d $1(ディレクトリ名を引数1に格納)
&& find $1 -not -name '\.*' -size 0(ファイル名の頭文字が「.」、サイズが0の物をはじく)
-print || usage() (結果をusage()に返し、出力)
usage() で、正常ならば結果を出力。エラーならば1>&2が働きエラーを表示。そしてexitで終了。
といった感じでしょうか?
187:名無しさん@お腹いっぱい。
07/03/04 22:46:22
>>185
この問題って出所はどこなの?
188:181
07/03/04 23:16:28
>>187
Unix and Shell Programmingという洋書です。
189:名無しさん@お腹いっぱい。
07/03/04 23:23:20
>>184
>>181 のいう通りなので、後は自分で解読してみてください。
190:名無しさん@お腹いっぱい。
07/03/04 23:24:06
しまた、181 <-> 184 ね
191:名無しさん@お腹いっぱい。
07/03/05 14:36:49
>>186
短絡評価でぐぐれ
192:名無しさん@お腹いっぱい。
07/03/05 15:46:28
>>135
sed -n '/^[yn][eo]/p;s/^IPアドレス.//p' data.txt | fmt -w 18 | tr ' ' ,
193:192
07/03/05 15:55:14
ああ先頭が ne とか yo で始まる行があるとだめなので、
yes/no 個別に書くべきですね。
それとスペースを数えると正しくは fmt -w 19 だ ww
194:192
07/03/05 16:14:27
ああ、やっぱ駄目だ。
スレ汚し済まない。
195:名無しさん@お腹いっぱい。
07/03/05 16:49:38
>>135
perl -ne 'BEGIN { $/ = "----\n" } /(yes|no).*(\d+(?:\.\d+){3})/s && print "$1,$2\n"'
196:名無しさん@お腹いっぱい。
07/03/05 17:46:13
>>135
sed -f 135.sed
$ cat 135.sed
/^----/{N
s/^----\n//
x
d
b
}
/^IPアドレス /{
s/IPアドレス /,/
x
G
s/\n//
b
}
d
197:名無しさん@お腹いっぱい。
07/03/07 17:04:39
一連のアクションが3回実施され(割り込み重複なし)
一行ずつ一つのログファイルに延々と結果が記載されます。
100
ABC
101
200
DEF
201
…こんな感じで3行ずつが一連のアクションです。
これを以下のように整形したいのですが、妙案は有りますでしょうか?
100,ABC,101
200,DEF,201
ご教示いただければ幸いです。
198:名無しさん@お腹いっぱい。
07/03/07 17:29:18
>>197
sed 'N;N;s/¥n/,/g'
む、あたまに余計な空行が付くな。
199:名無しさん@お腹いっぱい。
07/03/07 17:31:06
ああ、勘違いだった。198でいいわ。
200:名無しさん@お腹いっぱい。
07/03/07 18:03:28
>>199
やっぱりsedを使うのかな?と思い本を見ていたところでした。
なるほどNで行数分読み込んで、改行\nを,に置き換える…。
見れば直ぐに解りますが、これを0から考えるのは大変でした。
今度は誰かに教えれるよう、頑張ります。
素早いご解答ありがとうございました!
201:名無しさん@お腹いっぱい。
07/03/08 12:24:02
どうしても分からないので教えてください。
利用者が指定した文字列の書いてあるファイルを読み込んで、
配列に文字列を一つずつ格納し、その文字列を順番に出力させたいのですが、
どのようにすれば良いのでしょうか?
202:名無しさん@お腹いっぱい。
07/03/08 12:32:35
>>201
どのシェルよ?
少なくともピュアBourneシェルには配列はない。
203:名無しさん@お腹いっぱい。
07/03/08 12:33:26
>>202
申し訳ありません。bashです。
204:名無しさん@お腹いっぱい。
07/03/08 12:37:11
>>201
tr ' ' '¥012' < ユーザーが指定したファイル | sort
という意味?
指定したファイルの中はどんな構造なの?
1行に1語なのか、フリーテキストか。
205:名無しさん@お腹いっぱい。
07/03/08 12:40:27
>>204
指定したファイルは、おっしゃる通り、1行1語のテキストファイルです。
Sapporo
Tokyo
Osaka
Nagoya
Fukuoka
といった感じです。
単純に中身を表示するだけなら、
echo -n "ファイル名を入力してください:"
read x
cat $x
でよいと思われるのですが、一度配列に全文字列を格納してやるので困っています…。
206:名無しさん@お腹いっぱい。
07/03/08 12:46:39
言ってる意味が分からん。
sort そのファイル
とするのとは違うの?
207:名無しさん@お腹いっぱい。
07/03/08 12:55:10
>>206
sort ファイル とは違い、この場合だと、
array[0]=Sapporo
array[1]=Tokyo
array[2]=Osaka
array[3]=Nagoya
array[4]=Fukuoka
i=0
while [$1 -le 5]
do
echo ${array[$i]}
let i=$i+1
done
読み込んだテキストファイルをこのような感じで出力させたいです。
208:名無しさん@お腹いっぱい。
07/03/08 12:58:49
宿題は自分でやりましょう。
209:名無しさん@お腹いっぱい。
07/03/08 13:05:51
>>201
シェルスクリプトじゃなきゃいかんの?
perlかなんか使った方が楽じゃない?
210:名無しさん@お腹いっぱい。
07/03/08 13:12:43
とりあえず、「順番に」が読んだ順にという意味であって
「整列させて」という意味ではないことは理解した。
211:名無しさん@お腹いっぱい。
07/03/08 13:16:34
while read word; do
words=($words $word)
done < 指定したファイル
してあとは一緒。
212:名無しさん@お腹いっぱい。
07/03/08 13:43:20
>>209
perlじゃ駄目なんです。
>>211
echo -n "ファイル名を入力してください:"
while read word; do
words=($words $word)
done < $word
という事でしょうか?
213:名無しさん@お腹いっぱい。
07/03/08 14:02:36
違う。
214:名無しさん@お腹いっぱい。
07/03/08 14:07:43
>>213
すいません・・・
どうやれば良いのでしょうか?
215:名無しさん@お腹いっぱい。
07/03/08 14:10:26
<の後ろに書くのは、>>207のx
echo -n "ファイル名を入力してください:"
read source
while ....
done < $source
あとは出力のためのループ
216:名無しさん@お腹いっぱい。
07/03/08 14:52:24
>>215
echo -n "ファイル名を入力してください:"
read source
while read word; do
words=($words $word)
done < $source
cat $source | while read
do
echo $words
let source=$source+1
done
でやってみましたが、テキストの最初の文字列しか表示されません。
後半の出力ループがいけないのでしょうか?
217:名無しさん@お腹いっぱい。
07/03/08 15:06:49
ああ、ごめん、bashじゃなくzshでやってたわ。
218:名無しさん@お腹いっぱい。
07/03/08 15:12:44
bashで配列にpushする方法がわからん。
代わりに一パラメータで逃げてみた。
while read word; do
set -- $* $word
done < $source
for word in $*; do
echo $word
done
219:名無しさん@お腹いっぱい。
07/03/08 15:18:07
訂正
×一パラメータ
○位置パラメータ
あんど、こう書くらしい。
while read word; do
size=${#words[@]}
words[$size]=$word
done < $source
for word in ${words[@]}; do
echo $word
done
220:名無しさん@お腹いっぱい。
07/03/08 15:24:40
bash限定スクリプトは、以降はこちらへ
↓
スレリンク(linux板)
ここはBourneのみでよろしこ。
221:名無しさん@お腹いっぱい。
07/03/08 15:49:17
>>219
動作確認出来ました。本当にありがとうございました。
>>220
誘導ありがとうございます。
スレ違いで申し訳ありませんでした。
222:名無しさん@お腹いっぱい。
07/03/08 15:53:31
shです
教えてください
#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 100 ]; do
mv "$COUNTER".jpg /home/more/
let COUNTER=COUNTER+1
done
こんな感じのとき最初の10までが1桁になってしまうのですが
01 02 03,,,,
行頭に0を付けた2桁で処理するのはどうすれば良いのでしょうか?
00-09と10-99でループをわけるしか無いのでしょうか?
223:名無しさん@お腹いっぱい。
07/03/08 15:59:51
最近の環境ならprintf外部コマンドがあるんじゃない?
mv `printf %02d $COUNTER`.jpg /home/more
なければ
mv `echo "0$COUNTER" | sed 's/0*¥(..¥)$/¥1/'`.jpg /home/more
とか、
mv `echo "0$COUNTER" | rev | cut -b1,2 | rev` /home/more
とか。
224:名無しさん@お腹いっぱい。
07/03/08 16:09:12
>>222
for COUNTER in `seq -w 0 99`; do : ...; done
↑でループすれば桶。
あと、letコマンドは純粋な shには無いぞ。
225:名無しさん@お腹いっぱい。
07/03/08 16:11:22
ただ、>>222 がやっていることをやるだけなら、
そもそもループすら不要で、
mv [0-9][0-9].jpg /home/more
だけで一発。シェルは不要。
226:名無しさん@お腹いっぱい。
07/03/08 16:11:48
seqもあったりなかったり
227:名無しさん@お腹いっぱい。
07/03/08 16:12:07
>>223
ありがとうございました。
最終行でうまくいきました。
上の2個も含め手法を理解するように勉強してみます
228:名無しさん@お腹いっぱい。
07/03/08 16:15:29
(たとえば) [0-9][0-9] を展開しているのはシェルですぅ
ので不要じゃないわよ>>225
229:名無しさん@お腹いっぱい。
07/03/08 16:16:49
>>228
お約束どおり釣れましたよ。おめでとう。
230:名無しさん@お腹いっぱい。
07/03/08 16:18:58
>>224-226
ありがとう。
実際にはdateから自動生成された莫大な
画像データを部分的に抽出しながら動画生成を
行うので
例に出したのより多少複雑に書き直します
seqも実験してみます
231:名無しさん@お腹いっぱい。
07/03/08 16:20:11
touch [0-9][0-9].txt
[root@localhost /tmp]$ ls
[0-9][0-9].txt
となります。
00.txtから99.txtを作りたいのですが…
232:名無しさん@お腹いっぱい。
07/03/08 16:20:18
BSDだとseqの代わりにjotだったかな。
233:名無しさん@お腹いっぱい。
07/03/08 16:23:11
zsh があるなら
zsh -c 'touch {00..99}.txt'
とか
234:名無しさん@お腹いっぱい。
07/03/08 16:26:04
231は空のディレクトリで touch *.txt やったときに
どういう結果になってほしいんだろう。
235:名無しさん@お腹いっぱい。
07/03/08 16:27:16
zsh -c 'touch {00..99}.txt'
は、書かれてしまったから
touch `seq -s ".txt " -w 99"`.txt
236:名無しさん@お腹いっぱい。
07/03/08 16:27:59
シェルってゆうな。クズ。
237:名無しさん@お腹いっぱい。
07/03/08 16:28:49
>>234
00.txtから連番で99.txtまでのファイルが欲しいんでしょ
238:名無しさん@お腹いっぱい。
07/03/08 16:30:36
>>236
いつものお約束も釣れましたよ。おめでとう。
239:名無しさん@お腹いっぱい。
07/03/08 16:31:17
シェルっていうな
240:名無しさん@お腹いっぱい。
07/03/08 16:35:08
>>233 >>235
ありがとうございました!
zshって凄いですね。
でも、それに依存しないよう
>>235さんの方法を覚えます。
241:名無しさん@お腹いっぱい。
07/03/08 16:38:39
>>223 のprintf以外の方法だとちょっと無駄。
exprを使うのが定石。
expr 0$COUNTER : '.*\(..\)'
242:名無しさん@お腹いっぱい。
07/03/08 16:40:10
seqもない場合があるけどね
243:名無しさん@お腹いっぱい。
07/03/08 16:43:23
>>235 の seq、間違ってるよ。最後の .txtが余分なのと、"が1個余分。
244:名無しさん@お腹いっぱい。
07/03/08 16:46:42
>>235 よりも、
seq -f %02g.txt 0 99
の方がエレガント。
245:名無しさん@お腹いっぱい。
07/03/08 16:53:02
>>243
-sは間に挟む文字列だから最後の.txtがないと、
00.txt ... 98.txt 99 で終わってしまうぞ。
でも正解は>>244。
246:名無しさん@お腹いっぱい。
07/03/08 16:57:54
>>244
確かにこっちなら完璧に出来ますね。
ところで %02g と言うのは何なんでしょうか?
247:名無しさん@お腹いっぱい。
07/03/08 17:06:19
>>246
man seq
つーか
man 3 printf
248:201
07/03/08 18:43:31
>>219
最後にもうひとつだけ質問させてください。
出力をする時に配列の反対(リバースオーダー)から出力をするのはどうやれば良いのでしょうか?
例えば、
Tokyo
Osaka
Nagoya
とあったら
Nagoya
Osaka
Tokyo
と出力されます。
249:名無しさん@お腹いっぱい。
07/03/08 18:46:19
>>248
tac
250:名無しさん@お腹いっぱい。
07/03/08 18:51:21
for ...
done | tac
のようにパイプすればいいのではないでしょうか。
tacがない環境では、
for ...
done | sed '1!G;h;$!d'
251:201
07/03/08 19:14:20
ありがとうございました。
これでなんとか単位が取れます
252:名無しさん@お腹いっぱい。
07/03/08 19:25:38
はぁ? 単位?? 宿題禁止なわけだが、、答えて損した、、
253:名無しさん@お腹いっぱい。
07/03/08 19:46:30
上で指摘されてるのに気付けよ
254:名無しさん@お腹いっぱい。
07/03/09 00:33:46
ファイルを1行ずつ読み込んで配列に入れたいとおもってまつ。
↓みたいに書いてみたのですがエラーでちゃいます。なぜ??
#!/bin/csh
set ALLCOUNT = 5
@ CT = 1
@ NO = 3
@ CN = ""
while ( $NO <= $ALLCOUNT )
set CN[$CT] = `sed -n "$NO p " job.txt
@ CT ++
@ NO ++
end
255:名無しさん@お腹いっぱい。
07/03/09 01:11:36
シェルスクリプトでは、sh だろうと csh だろうと、
配列を使おうと思った時点で負け。別の方法を探すべし。
256:名無しさん@お腹いっぱい。
07/03/09 01:17:09
>>254
>>201と同じ学校の人?
257:名無しさん@お腹いっぱい。
07/03/09 01:19:14
>255
ダメっぽ?
>256
いや趣味
258:名無しさん@お腹いっぱい。
07/03/09 07:50:56
cshの時点で負け。
それが宿題だとすると、そんな教官がいるような学校に
進学した時点で負け。
259:名無しさん@お腹いっぱい。
07/03/09 07:52:39
思考停止論か
260:名無しさん@お腹いっぱい。
07/03/09 07:54:46
宿題で「cshで書け」と指定されている場合以外に、
cshで書かなければいけない合理的な理由は存在しない。
趣味なら自分で研究すること。
261:名無しさん@お腹いっぱい。
07/03/09 17:07:47
シェルスクリプトならファイルが配列ってことで
262:名無しさん@お腹いっぱい。
07/03/09 19:22:22
インデックスによるアクセスが必要ならポジションパラメータ使うだろ。普通。
263:名無しさん@お腹いっぱい。
07/03/09 21:47:41
配列も、位置パラメータも
所詮人間がデータ構造を解釈しているだけの話。
264:名無しさん@お腹いっぱい。
07/03/10 21:31:59
201が宿題やったせいで254も宿題思われてるのかw
というより口だけで実は分からないだけですかおまいら。
265:名無しさん@お腹いっぱい。
07/03/10 21:37:01
>>264
宿題かどうかが問題なんじゃなくて、cshのスクリプトは論外ということ。
誰も答えるはずがない。
266:名無しさん@お腹いっぱい。
07/03/10 21:44:39
自演乙
267:名無しさん@お腹いっぱい。
07/03/10 21:45:26
/ / ,. -'"´ `丶、、 ヽ
__l // / | \ \\ ゙、 / ̄ ̄ ̄ ̄ ̄ ̄
/ :::|| / / / l l ヽ ヽヽド、 /
l::::::::::|| / / / ! l ヽ ヽ ヽヽ ||:::::ヽ | l 十`` 十_ヽ
斤.::::::::||/ / //! ハ l ! ヽ ', ゙ヽ||::::::::勺 | レ d、 (_| _)
|ll|i :::::::|| l l イ l /!l | ヽ ト、|、 ト、 l l、||::::::::}ll| | ┼‐、ヽ ┴┴
|ll|ヽ:::::|l !l |l!‐!‐ト、l ヽ | l | ヽ | l i l l||:::::::/!l| | ノ 月 l |
|lll| `ー! l | l 」-=ミ|`ヽ ヽ | !-‐!‐|-l、|} l |r、〃|ll| | 二二`` l__ヽ
L!l | l | 〃{ノ::::iヾ ヽ! ,. =-ミ、!ハ l !"´ |ll| | ノ _)
{l |!l | ヽ `ー" ' トイ:::}ヾ | l | |ll」 | ─ァ
ヽ |l !| `二ノ '| || | /\
l |', | /)|l l | ┼‐、ヽ
l | ゙、 ` ´ /-イ| l | ノ
!| \ ヽニヽ , ′/゙! l ∠ '⌒)
| |ヽ、 ー / 〃 | ! | 「
,.rr| 丶、 ,.. '´ト、 l′ ヽ ゚
l::l {:| ` ´ |::}} \______
_. -‐1::ヽ' -、 _,.. -‐ン::|ヽ、
_.. -‐ "´ |:::::::::`ゝヽ /rJ::'"´:::::::! ` 丶、
268:名無しさん@お腹いっぱい。
07/03/10 21:52:54
だいたい木曜辺りに宿題が出るのか?
269:名無しさん@お腹いっぱい。
07/03/10 22:04:01
宿題は2chでやってもらうのが当たり前です。
270:名無しさん@お腹いっぱい。
07/03/10 22:11:17
逆に、宿題を出す立場の人間です。
毎回、問題を出すのにネタが尽き気味で大変です。
宿題が出た人、どんどんその問題を書き込んでください。
一部変えて出題に使わせていただきます。
271:名無しさん@お腹いっぱい。
07/03/10 22:19:47
2ちゃんを使わせない方法
272:名無しさん@お腹いっぱい。
07/03/10 22:29:26
>>270
分かった。
うちで使うスクリプトを問題として出してやる。
273:名無しさん@お腹いっぱい。
07/03/12 10:34:35
>>270
tacをシェルスクリプトで書かせる。
274:名無しさん@お腹いっぱい。
07/03/12 10:47:03
>>273
そういえば、まだ bash の回答がない。
URLリンク(golf.shinh.org)
この問題にかぎらず、sh で参戦してる人が少ないのでおまいらもやってみてくれ。
おれもがんばってみる。
275:名無しさん@お腹いっぱい。
07/03/12 17:31:24
sedの解が出てるんだからそれを呼べばよいのでは。
何も無理してshだけで文字列操作するこたーないと思うけど。
#!/bin/sh
f () { local l; read -r l && { f; echo "$l"; }; }
f
276:名無しさん@お腹いっぱい。
07/03/12 18:28:56
>>275
readの -r オプションはbash依存。localコマンドは Bourneで使えない。
あと、再帰呼出しは重い。非再帰版の方がエレガント。
出題ネタにしたいので、回答は省略。
277:名無しさん@お腹いっぱい。
07/03/12 18:44:38
#! /bin/sh
txt=
IFS='
'
while read line
do
txt="${line}
${txt}"
done
echo -n "$txt"
278:名無しさん@お腹いっぱい。
07/03/12 19:10:00
>>276
CodeGolfが出ちゃったからbashism上等の答えになったんだと思う。
279:名無しさん@お腹いっぱい。
07/03/12 19:18:19
localはどうか忘れたがread -rはPOSIXにもあったんじゃないか?
280:名無しさん@お腹いっぱい。
07/03/13 01:40:57
そーすpls
281:名無しさん@お腹いっぱい。
07/03/13 02:44:26
>>280
>>3
> POSIX: Shell & Utilities (標準規格)
> URLリンク(www.opengroup.org)
282:名無しさん@お腹いっぱい。
07/03/13 09:45:19
URLリンク(www.opengroup.org)
なるほどね
283:名無しさん@お腹いっぱい。
07/03/13 20:53:58
awkについて質問します。
single quotation mark("'")をエスケープしたいのですが、
次のコードは×となります。
どなたか、どうやって、"'"をエスケープするのか
教えていただけますか?
たとえば、
awk '{printf "\'%s\'", $2}' file
として、
$2フィールドの値を
'AX'
'PY'
'CU'
のように''で囲みたいのです。
284:名無しさん@お腹いっぱい。
07/03/13 20:57:48
シェルレベルで '...' と ¥' からなる並びに見えるようにする。
'{printf "'
¥'
'%s'
¥'
'¥n", $2}'
見やすいように改行入れてみたが実際にはくっつけて記述。
285:名無しさん@お腹いっぱい。
07/03/13 21:15:45
>>284
できました!
ありがとう。
なんでできるのか、もう少し詳しく
教えていただけないでしょうか?
286:名無しさん@お腹いっぱい。
07/03/13 21:48:08
awk に渡したい文字列を分解するだけだよ。
シェルの解釈する文字をエスケープしながらね。
だから、
'{printf "'"'%s'"'\n", $1}'
などでもいい。
287:名無しさん@お腹いっぱい。
07/03/13 21:49:44
$1じゃなくて$2だったか
288:名無しさん@お腹いっぱい。
07/03/13 22:15:15
wgetの実行結果をファイルに書き込みしたいんですけど
wget アドレス >>ファイル名
で実行して失敗しました。
どうしたらいいかわかりますか?
289:名無しさん@お腹いっぱい。
07/03/13 22:19:00
わかりますよ。
290:名無しさん@お腹いっぱい。
07/03/13 22:25:01
wget --help
291:名無しさん@お腹いっぱい。
07/03/14 17:16:17
テキストファイルのある行が2chのdat形式かどうかを
正しく判別するにはどうすればいいでしょうか?
grep -E ".*<>.*<>[0-9]+/[0-9]+/[0-9].* [0-9:.]+ ID:[a-zA-Z0-9+-/]+<>.*<>.*"
こんな感じでひっかけようと思ったのですが、
何かの間違いでメール欄やレス欄に <> が
まぎれこんでしまってる場合でもマッチしてしまいます。
やりたいことは、このようなゴミのまじった行を削除することなのですが
どうするのがよいでしょうか?
292:名無しさん@お腹いっぱい。
07/03/14 18:47:38
あ、しまった。
293:名無しさん@お腹いっぱい。
07/03/14 21:33:18
> ゴミのまじった行を削除する
全部捨てたらいいんじゃないか。
294:名無しさん@お腹いっぱい。
07/03/14 22:54:48
無理にシェルで書かんでもいいんでは。
295:名無しさん@お腹いっぱい。
07/03/14 23:24:19
>>288
-O
296:名無しさん@お腹いっぱい。
07/03/15 03:28:47
>>270
宿題にするな。テストにしとけ。
297:名無しさん@お腹いっぱい。
07/03/15 09:45:11
ペーパーテストで一発完動のスクリプトかける奴なら即戦力だな。
298:名無しさん@お腹いっぱい。
07/03/15 23:41:20
ShellScriptの中でscpとsshを使用しようと思っているのですが
普通に構文を書くとパスワード入力等を求められると思うのですが
手動入力でなく、完全自動化にできないでしょうか?
Shellは「sh」です。
OSはRedhatです
299:名無しさん@お腹いっぱい。
07/03/15 23:42:09
>>298
ssh-agent
300:名無しさん@お腹いっぱい。
07/03/15 23:53:17
ssh-agent を使用するしか方法はないですか?
他のプログラムとかの絡みで使用できるか・・・・
301:名無しさん@お腹いっぱい。
07/03/16 00:12:20
リモートの.ssh/authorized_keyにローカルの公開鍵を書いとく
302:名無しさん@お腹いっぱい。
07/03/16 00:13:16
>>298
板違い。
【sed】シェルスクリプト総合@LINUX Part2【awk】
スレリンク(linux板)
むしろこっちか。
くだらねえ質問はここに書き込め! Part 142
スレリンク(linux板)
303:名無しさん@お腹いっぱい。
07/03/16 07:56:47
>>300
ssh-agentを知ってるなら質問するなよ!
304:名無しさん@お腹いっぱい。
07/03/16 08:32:48
自分の鍵を暗号化しないでおくというのはどうだろう
305:名無しさん@お腹いっぱい。
07/03/16 08:33:30
パスフレーズを空にする。
ただし、秘密鍵を盗まれないように。
306:名無しさん@お腹いっぱい。
07/03/16 10:28:23
ssh-keychain は?
307:306
07/03/16 10:30:13
gentoo が作ってるやつな
URLリンク(www.gentoo.org)
308:名無しさん@お腹いっぱい。
07/03/16 22:01:18
>>298
expect
309:名無しさん@お腹いっぱい。
07/03/16 22:13:13
困ったときは~expect
310:名無しさん@お腹いっぱい。
07/03/18 18:56:13
expectって標準ではいってたっけ?
311:名無しさん@お腹いっぱい。
07/03/18 22:20:49
なんの標準だかわからんけど
入ってないなら入れればいいじゃん。
312:名無しさん@お腹いっぱい。
07/03/18 23:45:58
>>310
お馬鹿さん?
313:名無しさん@お腹いっぱい。
07/03/20 00:15:56
仕事の場合、そうホイホイと入れるわけにはいかないんだな
314:名無しさん@お腹いっぱい。
07/03/20 00:34:23
じゃあしかたないな
315:名無しさん@お腹いっぱい。
07/03/20 00:46:09
必要ないものはホイホイ入れられないだろうが
必要あるなら入れなきゃいかんだろ。
316:名無しさん@お腹いっぱい。
07/03/21 00:06:29
あたらしい言語処理系が入るというと嫌がられそうだから、
perlの小さなライブラリを追加といってExpect.pmでよくない?
かなりプログラム臭くなるのでexpectに比べてはいけないが、次善の策ではあるはず。
317:名無しさん@お腹いっぱい。
07/03/21 01:28:07
なんでexpect入れる話になってんだ
318:名無しさん@お腹いっぱい。
07/03/21 01:51:29
今回は>>298からの流れ
319:名無しさん@お腹いっぱい。
07/03/21 02:25:07
telnetならexpect使うのがいいだろうけど、sshとscpならパスなしのkeyを使うのが無難だと思うけどな。
パスなしでログインできるのが怖いなら、authorized_keysにcommandを書いて、できることを限定しておくといいよ。
スレ違いだったらすまん。
320:名無しさん@お腹いっぱい。
07/03/28 01:47:01
sedで、最後の行から逆順に文字列検索していって、1件目を出力して終わらせることできるかな?
321:名無しさん@お腹いっぱい。
07/03/28 02:04:06
cat hoge.txt | grep ほげ | tail -1
322:名無しさん@お腹いっぱい。
07/03/28 02:30:58
>>320
awkでやれ
awk '{line[NR]=$0}END{for(i=NR;i>0;i--){if(line[i]=="検索パターン") print line[i];}}' input.txt
323:名無しさん@お腹いっぱい。
07/03/28 02:50:52
tac filename | sed -n '/hoge/{p;q;}'
324:名無しさん@お腹いっぱい。
07/03/29 16:52:36
二つのテキストファイルA.txtとB.txtがあります。
行数は同じでそれぞれの行が関係のある物になっています。
現在、その二つの行をそれぞれスペースで区切って接続を行いたく考えています。
A.txt
山田
山下
B.txt
太郎
二郎
AB.txt
山田 太郎
山下 二郎
A.txtとB.txtからAB.txtを作成する妙案などございましたらご教示いただけませんでしょうか?
よろしくお願い致します。
325:名無しさん@お腹いっぱい。
07/03/29 16:56:53
>>324
paste A.txt B.txt > AB.txt
326:名無しさん@お腹いっぱい。
07/03/29 17:09:44
>>325
PASTE(1)
名前
paste - ファイルを行単位でマージする
大変失礼いたしました…orz
シェルスクリプトとかそう言うレベルで無かったことをお許し下さい…。
327:名無しさん@お腹いっぱい。
07/03/30 09:37:33
b.txt の内容で
幸子の場合、a.txtが山田となっていたら
里中に変更する。という条件付きくらいにしとけば
スクリプトでしなきゃいかんけどな。
328:名無しさん@お腹いっぱい。
07/03/30 15:20:07
~/.forwardに記述して、メールを標準入力から読み込んで
そのenvelope Fromを、実データのFromに置換して/usr/bin/vacation
に渡すスクリプトを書きたいのですが・・・
sed -n 's/^From: [^<]*<\([^>]*\).*/\1/p'の内容を覚えさせておいて、
もう一度先頭から読み込んで置換すればよいと思いますが、
その方法がわからないのです。
微妙な内容なのでググるためのキーワードもいまいちで、ヒットしません。
別にsedでなくてpealやawkでもよいのですが、何かいい方法はありますでしょうか?
329:名無しさん@お腹いっぱい。
07/03/30 15:26:46
>>328
そのまま
・覚えさせる->ファイルに書く
・もう一度先頭から読み込んで置換する->そうする
でいいんじゃないの?
330:名無しさん@お腹いっぱい。
07/03/30 16:01:32
URLが一行ずつずらーと並んでいるのですが
頭とケツにそれぞれ「”」を付けたいです。
何か良い方法は有りませんでしょうか?
331:名無しさん@お腹いっぱい。
07/03/30 16:08:36
sed 's/^/”/' | sed 's/$/”/'
332:名無しさん@お腹いっぱい。
07/03/30 16:17:30
>>331
パイプが無駄。一発でできる。
sed 's/\(.*\)/"\1"/'
333:名無しさん@お腹いっぱい。
07/03/30 16:24:13
pealのようなもの
334:328
07/03/30 16:31:53
>>329
難しく考えずに、そうすることにします。
335:名無しさん@お腹いっぱい。
07/03/30 16:44:44
>>331-332
ありがとうございます。
頑張ってsed覚えます。
336:328
07/03/30 17:10:27
>>334
と思ったら、メール出力から起動されるプログラムは
きわめて弱い実行権限(nobody)しかないので、/tmpにさえ
ファイルを作れません。(人間がテストしたときは巧くいきましたが・・)
権限を強めればセキュリティーリスクが増大するし、
やはり、スクリプトの中で記録と標準入力の再読み込みが必要な模様です。
まあ記録は置換文字列に変数を使えることが判ったので何とかなりそうですが、
「初めからもう一度実行」が途方に暮れてしまいますね。
何かよい方法ありますでしょうか?
337:名無しさん@お腹いっぱい。
07/03/30 17:14:32
・nobody でも /tmp に書ける。
・そもそも sendmail でも postfix でも .forward のファイル所有者と
同じ権限でプログラムが起動する。nobody にはならない。
338:328
07/03/30 18:36:24
>>337
なるほど
では、ほかの原因を考察して見ます。
ありがとうございます。
339:名無しさん@お腹いっぱい。
07/03/30 22:30:53
>>335
sed 's/.*/"&"/'
でもいいな。
340:名無しさん@お腹いっぱい。
07/03/30 23:05:57
>>335
正規表現は使わない方が速いかな。
awkで、
awk '{print "\""$0"\""}'
341:名無しさん@お腹いっぱい。
07/04/03 01:43:34
awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
「\」を前に置いても駄目でした…
342:名無しさん@お腹いっぱい。
07/04/03 02:26:06
>>341
system が起動しているシェルに食われたんじゃね?
343:名無しさん@お腹いっぱい。
07/04/04 00:17:45
>>342
例えばこんな感じ。実際はこんなシンプルじゃないけど。
awk '{system("grep \"^$\" $1")}' input.file
systemが食われたのか、systemの引数の中では引用符が使えないのか、切り分けができません。
344:名無しさん@お腹いっぱい。
07/04/04 00:26:48
>>343の例だと$1に何も入らないから、とか?
345:名無しさん@お腹いっぱい。
07/04/04 01:00:44
>>344
あそっか、$1は""の外でした。。
awk '{system("grep \"^$\" "$1)}' input.file
本物は業務で使う予定だからコピペできないんだよね。
346:名無しさん@お腹いっぱい。
07/04/07 02:11:04
find /日本/関東/女/ mtime +7300でリダイレクトしたら彼女が出来た
347:名無しさん@お腹いっぱい。
07/04/08 22:55:59
>>345
ちゃんと伝わっていなかったようで。
awkの中にシェルの変数の$1入れてもawkがもっていっちゃうからダメなんだって。
348:名無しさん@お腹いっぱい。
07/04/09 22:22:34
>>347
そうか?普通に↓とか使えてるぞ?
awk '{sum[substr($0,a,b)]+=substr($0,c,d);}END{for(n in sum)print n,sum[n];}' input.txt
349:名無しさん@お腹いっぱい。
07/04/10 20:40:57
なんかかみ合わないんだけど、
>>343や>>345の例だと、$1をシェルがもっていっちゃって動かないだろうから、
本来やりたいことである
>awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
の問題とは違ったところでハマっているでしょ、ってことを書いただけなんだけど。
($1にはinput.txtを入れたいのだろうと推測)
それに対して、$数字は awkで使用できるよ、と書かれても困っちゃうんだが。
350:名無しさん@お腹いっぱい。
07/04/11 06:22:32
>>349
言いたいだろうことは理解するが、347がそれが伝わる書き方とは思えなかったぞ。
例えば、何を誰がもっていっちゃうと書いたか、347と349を比較してみ。
351:名無しさん@お腹いっぱい。
07/04/13 00:00:33
ふいんき(なぜか略)を悪くしたようで正直スマンカッタ
352:名無しさん@お腹いっぱい。
07/04/13 01:37:02
awkは読み込んだレコード全体を$0で参照できて、
フィールドセパレータ(デフォルト空白文字)で区切られたn番目のフィールドを
$nで参照できるんだよな。
awk '{system("grep \"^$\" "$1)}' input.file
で$1はinput.fileから読み込んだカレントレコードの1番目のフィールドを
参照すると。
$数字がawkで使えるのは良いとして結局"や'は
system関数の引数の中で使えるのかどうか?
353:名無しさん@お腹いっぱい。
07/04/13 16:02:04
DebianとFreeBSDを使っていて、共通の.bashrcを参照しているのですが
Debianを使っているときにはUTF-8を、
FreeBSDを使っているときにはEUC-JPを
環境変数LANGに設定するようにしたいのですが
どのようにコードをかけばよいのでしょうか?
354:名無しさん@お腹いっぱい。
07/04/13 16:07:45
>>353
uname とか hostname あたり見るとか。
355:353
07/04/13 16:42:04
>>354
unameとif文を使えばできると思うんですけど
それでsourceコマンドを実行したときに
ちゃんとわりあたるかどうか・・・
356:名無しさん@お腹いっぱい。
07/04/13 16:54:07
>>355
おいおい、sourceなんて使わないよ。
あと、ifじゃなくてcaseを使うのが定石。
case `uname -s` in
Linux) export LANG=ja_JP.UTF-8;;
FreeBSD) export LANG=ja_JP.eucJP;;
esac
357:名無しさん@お腹いっぱい。
07/04/13 16:55:19
別に if 使ってもいいと思うけど、
なんで source が出てくるのかよくわからん。
358:名無しさん@お腹いっぱい。
07/04/15 15:34:49
>>356
Cとかだとswtichは敬遠される傾向にあるけどな。
359:名無しさん@お腹いっぱい。
07/04/15 17:19:24
お前の周りだけだろ。
360:名無しさん@お腹いっぱい。
07/04/15 17:33:16
ifを使うとすると、
if [ `uname -s` = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ `uname -s` = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi
となって、unameの実行が2回になって無駄になる。
かと言ってunameを1回にしようとすると、
tmp=`uname -s`
if [ $tmp = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ $tmp = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi
となって、シェル変数1つが余分に要るので美しくない。
よって、caseを使うのがモストエレガント。
361:名無しさん@お腹いっぱい。
07/04/15 17:37:03
>>360
お前の美学はよくわかった。
362:名無しさん@お腹いっぱい。
07/04/15 17:41:22
で、source はなんで出てきたんだ?
363:名無しさん@お腹いっぱい。
07/04/16 19:45:58
そうっすねぇ…。
364:名無しさん@お腹いっぱい。
07/04/16 19:58:24
審議せずに却下
365:名無しさん@お腹いっぱい。
07/04/16 20:37:02
sh にそんなコマンドがないからか?
366:名無しさん@お腹いっぱい。
07/04/16 22:11:51
.があるじゃん。
367:名無しさん@お腹いっぱい。
07/04/16 22:42:57
. はあるけど source はないってオチなのかなと。
368:名無しさん@お腹いっぱい。
07/04/16 23:46:40
source がない sh ってたとえばどれ?
369:名無しさん@お腹いっぱい。
07/04/16 23:52:07
J
370:名無しさん@お腹いっぱい。
07/04/17 00:16:38
>>368
sh
371:名無しさん@お腹いっぱい。
07/04/17 00:41:10
>>370
どの OS の?
372:名無しさん@お腹いっぱい。
07/04/17 00:47:25
>>371
普通のbshなら.しか使えない。
HP-UXやAIXのshは中身がkshなんで。
373:名無しさん@お腹いっぱい。
07/04/21 02:11:17
zsh 4.3.4登場 - マルチバイト文字の対応を強化
URLリンク(journal.mycom.co.jp)
374:名無しさん@お腹いっぱい。
07/04/24 14:20:37
/bin/zsh
375:名無しさん@お腹いっぱい。
07/04/25 21:35:53
シェルいい本知りません?初心者向けで
376:名無しさん@お腹いっぱい。
07/04/25 21:45:15
UNIXプログラミング環境
377:名無しさん@お腹いっぱい。
07/04/25 21:50:11
マジレスをおねがいします
378:名無しさん@お腹いっぱい。
07/04/25 21:52:27
どのへんが冗談だと?
379:名無しさん@お腹いっぱい。
07/04/25 21:55:09
初心者向きじゃないし、内容が古い
380:名無しさん@お腹いっぱい。
07/04/25 22:01:27
対案を出してから批判しろ
381:名無しさん@お腹いっぱい。
07/04/25 22:06:43
「試験に出るシェルスクリプト」
382:名無しさん@お腹いっぱい。
07/04/26 00:34:12
>>381
その筋質問箱は付いてますか?
383:名無しさん@お腹いっぱい。
07/04/26 04:36:49
Z80は最強だから大丈夫
384:名無しさん@お腹いっぱい。
07/04/26 10:22:57
じゃあ「できるシゥルスクリプト」
385:名無しさん@お腹いっぱい。
07/05/02 17:38:53
英小文字からなる文字列の最初の一文字だけを大文字に変換するには
どうすればよいのでしょうか?
sedだと只それだけで一文字目の後ろに改行を挿入してホールドスペースに入れて、
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ てなことして
また連結して改行を削除みたいな、バカ手間が掛かるので投げ出してしまった。
もっと簡潔に出来たら良いなと思うのですが・・・
386:名無しさん@お腹いっぱい。
07/05/02 17:42:25
>>385
echo aaa | sed 's/\(.\)/\U\1/'
387:385
07/05/02 18:01:30
>>386
それは。どこのsedですか?
うちではそれはUaaaと出力します。\Uという正規表現はUそのものを表すようです。
388:385
07/05/02 18:42:47
ちょっと調べてみたらGNUのsedだと、>>385の動作が出来るようです。
しかし、なんでもコマンドを高機能なやつに入れ替えるのもどうかと思うし、
使っているOSがGNUツール群を標準装備していないのもそれなりに理由があるだろうし
高々文字列変換で新たなツールを使うのには、消極的になりますね。
389:名無しさん@お腹いっぱい。
07/05/02 19:11:07
echo "abc" | awk '{print toupper(substr($0,1,1))substr($0,2)}'
echo "abc" | perl -pe 's/(.)/\U\1/'
390:名無しさん@お腹いっぱい。
07/05/02 19:18:21
echo aaa | awk -v FS= -v OFS= '{$1=toupper($1);print}' はどう。
391:385
07/05/02 20:06:42
>>389
有り難うございます。
awkのsubstrで文字位置指定して、toupperで大文字に変換ということですね。
perlの方はgsedと互換な感じの構文ですね。(てかgsedが模倣した?)
>>390
済みません。
awk: illegal statement
input record number 1, file
source line number 1
と成ります。
いずれにしてもいろいろと勉強になります。
>>386,>>389,>>390の皆さん、ありがとうございました!
392:名無しさん@お腹いっぱい。
07/05/03 02:41:58
GNU の sed でも y/a-z/A-Z/ みたいな表現できないんだよね。
互換性維持のためなんだろうけど。
393:名無しさん@お腹いっぱい。
07/05/03 09:18:45
kshのコマンドヒストリで矢印キーが使いたいのだが、
emacsのCTRLキーはめんどい。
エロい人、設定のしかた教えてチョ。
394:名無しさん@お腹いっぱい。
07/05/03 10:08:20
>>393
くだらない質問はここに書き込め!Part 52
スレリンク(unix板)
395:名無しさん@お腹いっぱい。
07/05/03 18:24:22
>>393
bashつかえw
396:名無しさん@お腹いっぱい。
07/05/04 16:26:20
cshで変数の中に空白文字で区切られた複数のワードからなる文字列が代入されてる。
例:「aaa bbb ccc ...」
各ワードに接頭辞と接尾辞を付加したいが、sedでできるかな?
例:「prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix ...」
ちなみにワード数は不定。
置換後の文字列長はLINE_MAX以下でないと駄目?
397:名無しさん@お腹いっぱい。
07/05/04 16:44:54
はい、cshはスルー、次の方どうぞ
398:名無しさん@お腹いっぱい。
07/05/04 16:56:59
こんなんでよい? bashだけど
$ s="aaa bbb ccc"
$ echo $s | sed -e 's/\([^ ]*\)/prefix.\1.postfix/g'
prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix
399:名無しさん@お腹いっぱい。
07/05/04 23:17:48
Gnomeなどのデスクトップ環境でxxx.shに何らかのファイルをドロップしたとすると、そのファイル名はどういった変数に格納されているのでしょうか。
tex処理を簡単にしたいと考えたのですが、これが分からずにつまっています。
400:名無しさん@お腹いっぱい。
07/05/05 00:39:09
$1, $2, ...
401:名無しさん@お腹いっぱい。
07/05/05 06:17:46
>>398
$1,$2...って9個までしか使えないんじゃ?
396は「ワード数不定」って言ってるから、10個以上もありうるだろ。
402:名無しさん@お腹いっぱい。
07/05/05 06:21:09
↑gオプション付いてるやん。何かみついてんだコイツ
403:名無しさん@お腹いっぱい。
07/05/05 14:01:50
>>401
アホー
>>400は>>399へのレスだ。
404:名無しさん@お腹いっぱい。
07/05/05 23:04:16
>>399
多分、コマンドでこう起動したのと同じ扱いになっている思う。
$ xxx.sh < "abc.tex"
スクリプト側でリダイレクトされる前のファイル名を
取得する方法が分かれば、どうにかなるんじゃないかな。
405:名無しさん@お腹いっぱい。
07/05/06 01:12:45
画像変換するスクリプトを作っています。
スクリプ中で使用するコマンド(今回はmogrify)がインストールされているかどうか
調べるのに手っ取り早い方法ありますか?
今のところ思いつくのは、PATHから「:」で区切って1つづつ抜き出し、その直下に
mogrifyがあるか「test -x」する方法です。
406:405
07/05/06 01:26:07
ちょっと自己解決
whereis使えばいいか。
whereisって見つからなくても0返すんですね・・・
whereis -b mogrifya | grep -v ':$' > /dev/null
if [ $? ...
って感じかな
もっとスマートな方法ありましたらご教授ください。
407:名無しさん@お腹いっぱい。
07/05/06 01:47:14
whichは?
408:名無しさん@お腹いっぱい。
07/05/06 02:09:28
if which mogrify > /dev/null 2>&1 ; then
...
は?
409:名無しさん@お腹いっぱい。
07/05/06 02:18:36
>407,408
whichか、なるほど
解決しましたありがとうございました。
410:405
07/05/06 02:45:19
たびたびすいません
&&や||の後に複数のコマンドを書くにはどうすればいいのでしょうか?
見つからなかった場合、NGと表示しexitしたいのですが、
which mogrify > /dev/null 2>&1 && echo 'bc ok' || (echo 'bc NG'; exit 1)
としてもミニシェルから抜けるだけなのです
if文で書けばいいだけなのですが、勉強の意味でも知っておきたいのです。
411:名無しさん@お腹いっぱい。
07/05/06 03:18:41
function echo_exit() {
echo $*
exit
}
とか定義しちゃえば?
412:名無しさん@お腹いっぱい。
07/05/06 03:28:54
>>410
... || { echo NG; exit 1; }
は?
413:410
07/05/06 11:45:38
>411
いいですね。たくさんコマンド実行したいときに使わせていただきます。
>412
おー、意図したとおりになりました。今回はこちらを使わせていただきます。
ありがとうございました。
ちなみにcommand1が成功したときはcommand2、失敗したときはcommand3という時に、
command1 && command2 || command3
という書き方は問題ないですか?
動作は意図したとおりなんだけど、「|| command3」はcommand2の結果に
かかってくるように見えるのでちょっと気持ち悪い・・・
414:名無しさん@お腹いっぱい。
07/05/06 12:35:35
>>413
>command1 && command2 || command3
>という書き方は問題ないですか?
command2が falseを返した時、command3まで実行されてしまうのが問題。
if - else の代わりにするなら、
command1 && { command2; true; } || { command3; }
と書けば完全。command2や command3は、; で区切って複数コマンド可能。
415:413
07/05/06 14:40:39
>414
なるほど。
command2にはechoとかしか入れてなかったので気づかなかった・・・
勉強になりました。ありがとうございます。
416:名無しさん@お腹いっぱい。
07/05/11 23:38:51
tail -f ログファイル名 | awk -f 手続きファイル
上記コマンドを指定の条件をつけてwhileによる繰り返しでログを整形する
シェルをつくりたいのですが、末尾に">>ファイル名"としても指定のファイル
にリダイレクトできません。
while~doneの後、シェルスクリプト実行時の末尾に>>を指定してもだめです。
出力は画面のままです。(通常のtail -fのイメージ)
&でバックグラウンドで実行しても同様です。
tail -f で読み取っている内容を別のログファイルに出力するにはどうすれば
よいですか?
417:名無しさん@お腹いっぱい。
07/05/12 09:13:18
teeじゃだめ?
418:名無しさん@お腹いっぱい。
07/05/12 10:06:11
シェルってゆーな。クズ。
419:名無しさん@お腹いっぱい。
07/05/14 21:13:31
tail -f って終了しないじゃん
420:名無しさん@お腹いっぱい。
07/05/15 00:34:17
tee -a hoge.log
421:名無しさん@お腹いっぱい。
07/05/15 17:57:30
hoge%68%6F%67%65 のような文字列を
%68%6F%67%65%68%6F%67%65 のように
%表記に直すにはどうしたらよいでしょうか?
422:名無しさん@お腹いっぱい。
07/05/15 18:50:16
perlつかえ。
423:名無しさん@お腹いっぱい。
07/05/15 18:50:23
>>421
よく意味がわからんが、URLエンコーディングとかの話か?
424:名無しさん@お腹いっぱい。
07/05/15 19:05:07
>>423
よく意味がわからんなら答えなくていいよ。
425:名無しさん@お腹いっぱい。
07/05/15 19:25:20
>>421
s/hoge%68%6F%67%65/%68%6F%67%65%68%6F%67%65/g
426:名無しさん@お腹いっぱい。
07/05/15 19:27:18
>>425
できました!! ありがとう!!
427:名無しさん@お腹いっぱい。
07/05/15 19:28:00
自演乙
428:名無しさん@お腹いっぱい。
07/05/16 01:53:36
ESP発揮して混じれ酢すると
hogeを%表記しようとしたときに
右側の既に%表記されてる部分が
さらに%表記に変換されてしまうことを
回避したいと思っているのではないかと
429:名無しさん@お腹いっぱい。
07/05/16 02:00:50
一旦デコードしてからエンコードするのが確実だな
430:201
07/05/16 02:03:24
01.jpg 02.jpg 03.jpg 04.jpg ...
と沢山のファイルがあってfor文(じゃなくてもいいけど)により
convert +append 01.jpg 02.jpg 03.jpg out1.jpg
convert +append 04.jpg 05.jpg 06.jpg out2.jpg
...
というように、3つずつ抜き出して一気に処理したいのですが、どうすればいいのでしょうか?
431:名無しさん@お腹いっぱい。
07/05/16 02:23:41
>>430
100個ずつとかだと別の方法を使うが、3個ずつならこんなもんか
#!/bin/sh
set -- ??.jpg
i=1
while :; do
case $# in
0) break;;
1) convert +append $1 out$i.jpg; break;;
2) convert +append $1 $2 out$i.jpg; break;;
*) convert +append $1 $2 $3 out$i.jpg; shift; shift; shift; i=`expr $i + 1`;;
esac
done
432:名無しさん@お腹いっぱい。
07/05/16 02:27:07
set -- *.jpg
i=0
while [ $# -gt 0 ]; do
i=`expr i + 1` #式使えるならそれでも。
convert +append $1 $2 $3 out$i.jpg
shift 3
done
shiftの数引数ってBourne Shellでも使えるのかな。
使えないなら3回shift。
433:名無しさん@お腹いっぱい。
07/05/16 02:27:49
ああ、ちょうど3の倍数になっていない場合は考慮してなかったな。
434:名無しさん@お腹いっぱい。
07/05/16 02:28:55
ちょうど3の倍数になっていない場合はどうすんの?
435:名無しさん@お腹いっぱい。
07/05/16 02:29:55
/dev/null とかで補完
436:名無しさん@お腹いっぱい。
07/05/16 02:37:35
名前欄は無視でお願い
437:430
07/05/16 02:45:01
おお、夜食食べている間にこんなにもレスが
3の倍数になっていないときは私自身考慮してませんでいした。
431さんの set だけ使ったことがないのですが、とにかく
>431-435 で十分対処できそうです。
setも調べてみます
ホントにありがとうございます。
438:430
07/05/16 02:46:51
よく見たら432さんもsetありましたね。
とにかくありがとう
439:421
07/05/16 11:12:47
>>422
シェルスクリプトで難しいならperlを使ってもかまいません。
>>423
URLエンコーディングならアルファベットはそのままだと思うのですが、
アルファベットも16進数表示したいわけです。
pukiwiki のバックアップをローカルに落とすのに、
ファイル名を知りたいんです。
440:名無しさん@お腹いっぱい。
07/05/16 11:21:18
>>439
pukiwikiスレあたりで「戻し方教えれ」って聞いた方がいいんじゃね?
441:416
07/05/16 23:44:33
ご返事いただきありがとうございます。
tail -f ログファイル名 | awk -f 手続きファイル
上記コマンドではawkによる整形結果を標準出力できる状態で、
さらにパイプでteeコマンドを実行してみましたがうまくログが
出力できませんでした。
名前付きパイプを作成し、オリジナルログの出力先を名前つきパイプにして
直接awkで名前つきパイプを標準入力状態にしても、tail -f のような画面に
標準出力はできますがファイルへのリダイレクトは無理でした。
難しいですねぇ。。
442:名無しさん@お腹いっぱい。
07/05/17 00:48:16
tee の使い方間違ってるだけだろ
443:ウサチャソ
07/05/17 00:52:02
>>441
tail -f をパイプすると、上手く動かないよ。
GNUのだとどうなんだろ?
「tail パイプ バッファリング」
でググると、それっぽい事いっぱいでてくるYO
444:名無しさん@お腹いっぱい。
07/05/17 18:41:18
a.shに . b.sh として読み込まれるb.shが自分の名前がb.shであると知る方法はありますか?
445:名無しさん@お腹いっぱい。
07/05/17 18:50:24
>>444
ない。
. で読む場合は $0もセットされないし。
446:名無しさん@お腹いっぱい。
07/05/17 19:05:57
>>445
ありがとうございます。
あらかじめ埋め込んでおくしかなさそうですね…。
447:416
07/05/17 23:00:53
>>443
バッファの問題だったんですね。
通常のawkはやめて、gawkのfflush関数を使うことでうまくいきました。
ありがとうございました。
448:名無しさん@お腹いっぱい。
07/05/18 19:10:57
シェルスクリプトでログインログアウトを自動化するにはどうしたらいいでしょうか?
もし良かったら数行のコマンドでレスお願いします。
449:名無しさん@お腹いっぱい。
07/05/18 19:15:55
>>448
何をやりたいのかもうちょい詳しく。
450:448
07/05/18 19:59:20
>>449
1.現在rootでログイン中。
2.testユーザーでログインして何か作業をする。
3.そしてまたrootに戻る。
これを自動化したいです。
451:名無しさん@お腹いっぱい。
07/05/18 20:03:21
>>450
su test 何か
もしくは
su - test 何か
違いについては man su 等を参照。
452:名無しさん@お腹いっぱい。
07/05/18 20:30:15
>>451
間違ってるよ。man su 等を参照するべきなのはオマエ。
453:名無しさん@お腹いっぱい。
07/05/18 20:59:46
>>450
sudoじゃダメなんか?
454:名無しさん@お腹いっぱい。
07/05/18 21:30:20
>>448
testユーザで実行するバッチファイルを作っておいて、
su - test -c バッチファイル
で実行しる。
455:名無しさん@お腹いっぱい。
07/05/18 21:35:19
バッチファイル
バッチファイル
バッチファイル
バッチファイル
wwww
456:名無しさん@お腹いっぱい。
07/05/19 00:37:47
ほんとうにloginしたいならexpectを使うとか
457:448
07/05/19 03:04:26
rootでログイン中
expectでsu - testとして
touch /home/test.txtを実行して
再度expectでsu - rootでrootになっても
/home/test.txtは作成されてませんでした
なぜでしょう?
458:名無しさん@お腹いっぱい。
07/05/19 10:21:42
パーミッションじゃないの?
/homeにtestユーザは書き込めないんでは。
459:名無しさん@お腹いっぱい。
07/05/20 04:33:32
質問。
11.22.33を
33.22.11に文字を反転させたい。
460:459
07/05/20 04:42:15
459は取り消し!
11.22.33を
a[0]=11
a[1]=22
a[2]=33
のように配列に代入したい。
よろしくお願いします。
461:名無しさん@お腹いっぱい。
07/05/20 05:39:47
宿題でつか
462:459
07/05/20 06:19:25
宿題でつ
463:459
07/05/20 07:14:05
スレ汚してごめんなさいできまつた
464:名無しさん@お腹いっぱい。
07/05/20 21:56:12
テキストファイルに、ファイルの場所がずらずら書かれていて
-----
/usr/local/etc/pussy001.jpg
/usr/local/etc/pussy002.jpg
/usr/local/etc/pussy003.jpg
:
-----
そこに書かれているファイルを指定した場所に移動させたいんです。
で、こんな感じで動くスクリプトを書きたいなぁと考えているんですが
cat list.txt | grep jpg | mv.sh /work/pussy
この mv.sh の書き方が分かりません。
465:名無しさん@お腹いっぱい。
07/05/20 22:02:27
>>464
mv `grep jpg list.txt` /work/pussy
で、一発。・・・で、pussyってww
466:名無しさん@お腹いっぱい。
07/05/20 22:47:23
>465
残念ながら、ファイル名にスペースがあるとだめでした。
sh, tcsh, bashで試してみましたが、どれも同じです。
467:名無しさん@お腹いっぱい。
07/05/20 23:18:02
>>464 の例では、ファイル名にスペースが入ってないじゃないか。
そういう条件は先に例に含めて書くこと。
ファイル名にスペースがある場合のやり方ももちろん知ってるが、
わざわざ教える気にならないので俺はパス。
468:名無しさん@お腹いっぱい。
07/05/20 23:25:45
>>466
IFS='
' mv `grep jpg list.txt` /work/pussy
469:名無しさん@お腹いっぱい。
07/05/21 00:42:01
(while read f; do mv "$f" dest/ ; done) < file
>>467
ファイルの長さを考慮しないgrep戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
470:名無しさん@お腹いっぱい。
07/05/21 06:22:05
>>469
残念ながら、ファイル名に \ があるとだめでした。
471:名無しさん@お腹いっぱい。
07/05/21 10:38:53
じゃあ諦めな。
472:名無しさん@お腹いっぱい。
07/05/21 11:09:30
>>471
ファイル名の \ を考慮しないを考慮しないwhile read戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
473:名無しさん@お腹いっぱい。
07/05/21 11:17:06
というか、>>469 って、元の質問の jpg で grepするの忘れてるじゃん。
テストだったら0点。
474:名無しさん@お腹いっぱい。
07/05/21 11:25:38
でもテストじゃないよ。
475:名無しさん@お腹いっぱい。
07/05/21 11:33:37
そういう香具師が、「それはケアレスミス。答えはわかってた」とか後で言うんだよな。
476:名無しさん@お腹いっぱい。
07/05/21 11:37:45
なんでそんな完璧にこだわるんだろ。
質問者のヒントになればいいじゃん。
477:名無しさん@お腹いっぱい。
07/05/21 16:16:07
低能同士、仲良く!
478:464
07/05/22 00:44:46
すみません、御礼が遅れました。
という訳で >465 >468 >469 全て参考になりました。特にIFS=~は初めて
知ったので成程と関心しました。
この場をお借りして厚く御礼申し上げます。
479:名無しさん@お腹いっぱい。
07/05/22 00:59:36
xargsは?
grep jpg list.txt | xargs -i mv {} /work/pussy
480:名無しさん@お腹いっぱい。
07/05/22 12:09:35
>>479
空白が含まれているとダメだろ。
481:名無しさん@お腹いっぱい。
07/05/22 14:28:33
grep jpg list.txt | tr '\n' '\0' | xargs -0 -i mv {} /work/pussy
482:名無しさん@お腹いっぱい。
07/05/22 14:39:38
>>481
ファイル名に改行が含まれてるとだめだろw
483:名無しさん@お腹いっぱい。
07/05/22 19:06:13
sudo find / -name '*pussy*' -exec rm -rf \{\} \;
484:名無しさん@お腹いっぱい。
07/05/22 19:18:18
デリミタが改行なリストなんだから要素に改行は含められないんじゃ?
改行入りファイル名を考慮するならリストは改行文字以外で区切るべき
だと思う.
485:名無しさん@お腹いっぱい。
07/05/22 19:20:20
ファイル名に改行を入れるアホなんてほっとけ(w
486:ウサチャソ
07/05/22 21:00:22
試しに作ってみた。
% touch aaaa^Maaaa
% ls -lF
aaaa*--r-- 1 ウサチャソ users 0 5月 22 20:58 aaaa
表示バグってるよ…
487:名無しさん@お腹いっぱい。
07/05/22 21:19:38
改行と復改の区別ができないお子様は犬... 以下略
488:ウサチャソ
07/05/22 21:37:01
>>487
改行のみ入れるのは面倒臭かったんだスマソ
489:名無しさん@お腹いっぱい。
07/05/22 21:57:27
>>488
$ touch 'aaaa
aaaa'
だろ。
$ > 'aaaa
aaaa'
でも可。
490:ウサチャソ
07/05/22 22:14:31
CTRL+Vが楽だったんで、つい…
ちなみに、>>489 でも >>486 でもCygwinだと同じ表示。
-rw-r--r-- 1 ウサチャソ なし 0 May 22 22:10 aaaa?aaaa
今日始めて知った。
491:ウサチャソ
07/05/22 22:15:58
あ゛っごめん、Cygwinは「--show-control-chars」が必要だった…。
スレ違いなんでもう消えます、スマソ
492:名無しさん@お腹いっぱい。
07/05/24 20:33:53
質問します。
lsnrctl >>_EOF_
set log_file listener.tmp
RET=$?
if [ $RET -ne 0 ];then
logger -t loglog -p local1.notice "切り替えに失敗しました"
exit 1
fi
exit
_EOF_
という事をしたいのですがどうしてもsetコマンド以降エラーに
なってしまいます。
対処法を教えていただけないでしょうか?
493:名無しさん@お腹いっぱい。
07/05/24 20:51:21
逆だ。
lsnrctl <<_EOF_
494:名無しさん@お腹いっぱい。
07/05/24 20:55:16
あと、ヒアドキュメントの部分は、LSNRCTLのコマンドしか受け付けないぞ。
495:名無しさん@お腹いっぱい。
07/05/24 21:23:10
すいません逆に書いてました。
やはりLSNRCTLコマンドしか受け付けないですか・・・
う~ん、どうしてもLSNCTLの中でシェルスクリプトの処理の記述を
したかったのですが無理そうですね。
ありがとうございました。
496:名無しさん@お腹いっぱい。
07/05/28 07:13:03
質問。
ファイルの最終から20行を削除したい。
どうしたらいいでしょうか?
497:名無しさん@お腹いっぱい。
07/05/28 07:46:41
>>496
wc で数えて、head で切り出すぐらいしか考え付かない
498:名無しさん@お腹いっぱい。
07/05/28 08:09:27
awk
499:名無しさん@お腹いっぱい。
07/05/28 08:33:29
tac なんてLinuxでもないかぎり標準装備じゃない罠
cat file | tac | sed '1,20d' | tac
500:名無しさん@お腹いっぱい。
07/05/28 12:43:49
無意味なcat出た
501:名無しさん@お腹いっぱい。
07/05/28 14:05:40
tacが使えなければ sed '1!G;h;$!d' すればいいじゃない。
502:名無しさん@お腹いっぱい。
07/05/28 15:55:05
cat!出た!cat出た!得意技!cat出た!cat!これ!cat出たよ~~!
503:名無しさん@お腹いっぱい。
07/05/28 16:13:35
>>502
楽しそうだな
504:名無しさん@お腹いっぱい。
07/05/28 18:27:43
俺は限界だと思った
505:名無しさん@お腹いっぱい。
07/05/29 00:14:45
tail つかって最後から20行みれ
で、>>499しる
506:名無しさん@お腹いっぱい。
07/05/29 00:58:13
基本的にサブシェルはshを新たに起動するよりは動作が軽いですよね?
507:名無しさん@お腹いっぱい。
07/05/29 01:26:05
>>498
awkには入力ファイルの行数を保持する組み込み変数はないんじゃね?
だから、結局wcでカウントしないとダメだったり。
508:名無しさん@お腹いっぱい。
07/05/29 01:47:08
は?
awk '{a[NR]=$0}NR>20{print a[NR-20]}'
509:名無しさん@お腹いっぱい。
07/05/29 02:37:14
>>508 短くていいが、でかいファイル通すとメモリが…
510:名無しさん@お腹いっぱい。
07/05/29 02:54:34
無理して一行でやるより、行舐めの回数が少ない方が好きだな。
511:名無しさん@お腹いっぱい。
07/05/29 02:57:15
>>510 ワンパスだし。消費メモリを考えればいいと思うが。
512:名無しさん@お腹いっぱい。
07/05/29 03:15:32
>>499
は論外。
513:名無しさん@お腹いっぱい。
07/05/29 09:33:18
awk '{if (FNR>20) print a[FNR%20]; a[FNR%20]=$0}'
514:名無しさん@お腹いっぱい。
07/05/29 10:12:43
20行分だけバッファして遅延して出力させて
ファイル末尾に到達したら終了させるとか。
515:名無しさん@お腹いっぱい。
07/05/29 19:07:30
>>514
書いてみよう
516:名無しさん@お腹いっぱい。
07/05/29 19:20:43
>>514 は
>>513 がやろうとした事(間違ってるがw)
517:名無しさん@お腹いっぱい。
07/05/29 19:44:45
>>496
こういう場合、ed を non-interactive に使うのがいい。
最後20行ということは、$-19から $までだから、
echo '$-19,$d
w outfile
q' | ed infile
↑で桶。
518:名無しさん@お腹いっぱい。
07/05/29 21:46:07
sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'
519:名無しさん@お腹いっぱい。
07/05/30 08:58:50
>>516 間違ってる?
520:名無しさん@お腹いっぱい。
07/05/30 19:17:11
質問なんですが・・
#!/bin/sh -
tmpfile=/tmp/program.$$
cat "$1" | tr ' ' '\n' > tmpfile
while read word
do
grep ${word} "$2" | いろいろと処理・・・
done < tmpfile
てな感じのスクリプトなのですが、
第一引数のファイル中に、例えば -i と言うような語があると
grep がオプションと解釈するのか何なのか、直後に while ループが
終了してしまいます。
'${'"$word"'}' だと grep には ${word} として渡されてしまいます。
何とかシェルを騙して grep に '-i' として渡す方法は無いでしょうか?
(渡す前に条件判断して先頭文字が - なら sed などで先頭に \ を
付加すると言うのも行けそうな気はしますが、出来れば余計なIFとか
変数とか無しで行きたいものです)
521:名無しさん@お腹いっぱい。
07/05/30 19:35:35
grep -e
grep -
522:520
07/05/30 19:53:07
>>521
ありがとう。
シェルを騙さなくても grep の方で用意されていましたか、
良く考えりゃ当然ですね。
523:名無しさん@お腹いっぱい。
07/05/30 21:22:55
オプション -- で、それ以降はオプションとは解釈しないってのは
結構な数のコマンドで使える。
524:520
07/05/30 23:07:09
>>523
ですね。
これまで -- なんて、はぁ?って感じでしたけど、
実に有用性が高いですね。
勉強になります。
525:名無しさん@お腹いっぱい。
07/06/02 11:43:37
質問
インターネットに接続できるか試すコマンドってありますか?
やりたいこと
インターネットに接続できたら echo "できます"
インターネットに接続できなかったら echo "できません"
としたいです。
526:名無しさん@お腹いっぱい。
07/06/02 11:59:13
インターネットとLANの区別をしなくていいのかな?
527:名無しさん@お腹いっぱい。
07/06/02 12:05:24
多分、この程度の精度でOKなんだろ。
if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
echo "出来ます"
else
echo "出来ません"
fi
528:525
07/06/03 03:05:39
>>562>>527
ありがとうございます
できればヤフーなどの特定のサイトに依存せず
確実にインターネットに繋がるかどうか判断したいです。
もし無理なら特定のサイトでも構いませんが
こういう場合通例としてyahoo.comを使うのが適切でしょうか?
529:名無しさん@お腹いっぱい。
07/06/03 07:09:14
接続できていると分かったら、どこかと通信するんでしょ?
その通信相手にすればいいよ。
530:名無しさん@お腹いっぱい。
07/06/03 07:21:06
>>528
何が目的なん?
531:名無しさん@お腹いっぱい。
07/06/03 08:59:25
その通信相手がICMPブロックしてるかも知れないから、ブロックしてない
www.yahoo.comとかwww.google.comとか使えばいい。
532:名無しさん@お腹いっぱい。
07/06/03 11:01:00
>>528
君のほうから、どことつながったらインターネットに繋がっていると言えるかの
判断基準を出してくれないと先に進めないと思うよ。
533:名無しさん@お腹いっぱい。
07/06/03 12:04:41
相手もそうだがプロトコルもな。
ファイアウォールの具合でICMP通らないかもしらんし。
534:名無しさん@お腹いっぱい。
07/06/03 23:19:33
まぁ、スレ違いだな。
535:名無しさん@お腹いっぱい。
07/06/04 07:59:35
>>527
>if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
関係ないが、この 2>&1
エラー対策でつか?
536:名無しさん@お腹いっぱい。
07/06/04 14:12:29
遅レスだが、
tail -r ファイル名| tail +20 | tail -r
でもいけた(tailばっかりでカッコ悪いか)
537:名無しさん@お腹いっぱい。
07/06/04 21:46:12
>>535
終了ステータスだけとれりゃいいので、エラーメッセージとか捨てる。
538:名無しさん@お腹いっぱい。
07/06/04 21:50:18
それを捨てるなんて、とんでもない!
539:ウサチャソ
07/06/04 23:49:23
きのうはおたのしみでしたね。
ウホッ
540:名無しさん@お腹いっぱい。
07/06/04 23:51:56
*「おお しんでしまうとは なにごとだ!」
*「アッー!」
541:名無しさん@お腹いっぱい。
07/06/05 06:33:28
vmstat 1 の結果の左側に`date +%H:%M:%S`(時分秒)を付けて流して表示させようとしています。
以前、gawkでstrftimeを利用して同じ事をしたのですが、今回使ってるサーバのawkは
gawkでない為に別の方法が必要です。
どうもウマイ方法が思いつきませんで・・・ご教示お願いします。
542:名無しさん@お腹いっぱい。
07/06/05 08:54:12
Perlあるなら
vmstat 1 | perl -MPOSIX -pe 'BEGIN{$|=1} print strftime q{%H:%M:%S }, localtime'
543:名無しさん@お腹いっぱい。
07/06/05 08:59:20
これは重そうだけど
vmstat 1 | while read line; do echo `date +%H:%M:%S` $line; done
544:名無しさん@お腹いっぱい。
07/06/05 20:13:14
>>539-540
DQ I ?
545:541
07/06/05 22:31:39
>>542
HP-UX10.20だったのですがperlが入っていませんでした(汗
でも、これを機会にperlもちょっとづつ勉強したいと思います。どもでした。
>>543
readがそんな使い方できるとは知りませんでした。
おかげさまでばっちり動きました。ありがとうございます。
546:名無しさん@お腹いっぱい。
07/06/05 23:39:38
bash.infoの説明だと
echo hoge | read v
で
echo $V →hoge
になるように読める
で、できないってことはわかったんだけど結局readはどう使うんですか
なんでwhile中だとうまく動くんでしょう
547:名無しさん@お腹いっぱい。
07/06/06 00:17:57
サブシェルが起動するから。
read で代入する変数はサブシェルのものだから、親シェルに戻ると忘れる。
while でなくても、下のような書き方をすれば {...} の中にかぎり有効。
echo hoge | {
read v
echo $v
}
あと、ksh はふつーに可能だったような記憶がうっすらとあるが自信ない。
548:名無しさん@お腹いっぱい。
07/06/06 15:14:41
質問
シェルスクリプトを、windowsでCD-Rに焼き、linuxで実行すると
改行がコマンドとして認識され、command not foundとなってしまいます。
普通に改行を改行として認識させることはできないのでしょうか?
549:名無しさん@お腹いっぱい。
07/06/06 16:33:41
よくわからんが改行コードの問題? 改行コードをLFで保存できるテキストエディタ使えよ
550:名無しさん@お腹いっぱい。
07/06/06 16:52:46
>>549
ありがとうとざいます
LFで保存したところ大丈夫でした。
ただし1行目だけはなぜかcommand not foundとなってしまう。。
551:名無しさん@お腹いっぱい。
07/06/06 20:15:14
log=20070101.log
$logを 2007-01-01
という風に、[西暦]-[月]-[日]な形にしたいのですが、どすればよいでしょうか?
どなたか、お力をお貸し下さいませ。
.log と取って、4桁、2桁、2桁ごとに「-」を挟む。というのはわかるのですが
方法や何のコマンド使ってよいものやら見当もつきません。お願いします!
552:名無しさん@お腹いっぱい。
07/06/06 20:26:09
echo $log | sed 's/\(....\)\(..\)\(..\).*/\1-\2-\3/'
553:名無しさん@お腹いっぱい。
07/06/06 20:30:18
>>552 ありがとうございました!出来ました!
sedは使えるつもりでいたんですが、まだまだの若輩者でしたorz
こんなに早く答えて頂いて本当に助かりました。
554:名無しさん@お腹いっぱい。
07/06/06 23:42:52
じぇっとすとりーーーむ~
555:名無しさん@お腹いっぱい。
07/06/06 23:42:59
シェルが何かは分かったのですが、シェルスクリプトが良く分かりません…
専門用語を交えないで言うと、どういったものなのでしょうか?
556:名無しさん@お腹いっぱい。
07/06/06 23:44:51
シェルが何かどうわかったか、専門用語を交えずに説明してからだ
557:名無しさん@お腹いっぱい。
07/06/07 00:11:41
レストランのメニューがシェル。コース料理がシェルスクリプト。
大分違うな…
558:名無しさん@お腹いっぱい。
07/06/07 00:35:32
URLリンク(e-words.jp)
専門的な概念なのに専門用語使うなというのは無理な話。
559:名無しさん@お腹いっぱい。
07/06/07 02:08:21
>>557
その説明で開眼しました!!
今ならどんなプログラムも書けそうです!!
(^ω^)
560:名無しさん@お腹いっぱい。
07/06/08 00:50:30
if [ -e foo ] ;
then
echo "foo exists."
else
echo "foo does not exist."
fi
これを Solaris 8の bash, cygwinの sh, bashで実行するとOK。
でも Solaris 8の shで実行した時だけ
test: argument expected
と出てしまいます。どうにも分かりません。助けて下さい…
561:名無しさん@お腹いっぱい。
07/06/08 03:13:50
Solarisなどの旧式shのtestコマンドには-eというものはない。
これは外部コマンドのtestも同様。
562:名無しさん@お腹いっぱい。
07/06/08 06:27:46
>>561
ダウト。
Solarisの外部コマンド版のtestの実体はkshスクリプトだから、
Solarisでも外部コマンド版のtestには -eオプションがある。
ただし、純正Bourneには -eがないので、使わないこと推奨なのは同意。
[ -f foo ] あたりで代用だな。
563:名無しさん@お腹いっぱい。
07/06/08 08:29:58
grepコマンドで検索した行の前後三行を出力するコマンドってないすか?
たとえば、以下のようなファイルがある。
----------------------------
aaa
bbb
ccc
ddd
eee
fff
ggg
----------------------------
grepコマンドをつかって、
$ grep ddd -a 333
とすると
bbb
ccc
ddd
eee
fff
と表示されるようなやつよ。
564:名無しさん@お腹いっぱい。
07/06/08 08:45:56
>>563
-A とか -B とかない?
565:名無しさん@お腹いっぱい。
07/06/08 10:35:48
>>563
普通にgrepだけで行けるぞ
grep -A 3 -B 3 'ddd' filename
566:名無しさん@お腹いっぱい。
07/06/08 10:44:10
普通は-Aとか-Bなんてない。
567:名無しさん@お腹いっぱい。
07/06/08 11:01:46
何が「普通」かなんて人それぞれでしょ。
-A がある grep とない grep がある。
それだけ。
568:名無しさん@お腹いっぱい。
07/06/08 11:02:54
目的達成できるなら、それでいいじゃん
569:名無しさん@お腹いっぱい。
07/06/08 11:03:45
grep -n して
sedで : より前だけ取り出して
awkにくべて前後の必要な行番号を全部計算して
sort -nuして
sedでsedのコマンドに成形しなおして
sedで抽出。
てゆうか、grepにこだわらずにawk1個の方がめちゃ楽そう。
570:名無しさん@お腹いっぱい。
07/06/08 11:04:44
>>569
awkだけだとどうなるの?
571:名無しさん@お腹いっぱい。
07/06/08 11:29:37
FreeBSDは変にsed使うよりawk1本に絞った方が軽い。
572:名無しさん@お腹いっぱい。
07/06/08 11:43:53
複数行のテキスト整形には弱い
普通は、prelとかrubyを使う
まあ、perlとかruby使えないから聞いてるんだろうけど
573:名無しさん@お腹いっぱい。
07/06/08 11:52:15
>>572
sedやgrepでどうしようかななんて考えてる時間が無駄だよな
perl覚えちゃたほうがいいのにね、これを機会に
574:名無しさん@お腹いっぱい。
07/06/08 11:55:16
これを機会にGNU grep入れちゃえ。
575:名無しさん@お腹いっぱい。
07/06/08 12:00:44
パタン行より前の行も表示しないといけないのでawk一本だとちょっと手間でしょ。
perlやrubyを使ってもそれは同じじゃないかな。
sed+awkなら
sed -e "$(awk '/pattern/{for (i=-2;i<=2;i++)if(i+NR>=0)print (i+NR) "{p;d;}"}' file|sort -nu)"';d' file
zshでしか試してないのでクォート回りはshだと違うかも知れんが、
だいたいこんな感じで。
576:名無しさん@お腹いっぱい。
07/06/08 12:19:38
GNUは偉大だな、改めて思った
577:名無しさん@お腹いっぱい。
07/06/08 12:26:01
当たり前じゃね?
だってGNU拡張は、ユーザが便利だと思うものを実装して
拡張していったんだから
きっと、>>563みたいなことを、数年前にも同じといってる人が
現れてんだよw
それで拡張されてる
578:名無しさん@お腹いっぱい。
07/06/08 12:40:49
GNU sed awk grep を使いましょうね
579:名無しさん@お腹いっぱい。
07/06/08 15:54:55
俺はgawk派
580:名無しさん@お腹いっぱい。
07/06/08 16:04:21
ガウォーク
581:名無しさん@お腹いっぱい。
07/06/08 16:14:46
GNU is Not UNIX
の意味がやっとわかったようでなにより
582:名無しさん@お腹いっぱい。
07/06/08 16:21:47
んでけっきょく >>563 はどうしたの?
583:名無しさん@お腹いっぱい。
07/06/08 16:25:28
GNU教に入信する準備をしてます
584:名無しさん@お腹いっぱい。
07/06/08 16:29:28
しこしこ、書いてんじゃね
585:名無しさん@お腹いっぱい。
07/06/08 17:38:00
mac でターミナルで操作しているのですが、safariでgoogleなどのページで
キーワードを打ち込んで検索させたりはできないものなんでしょうか?
初心者なんで仕組みなどわかりませんので構造上できないものなら教えてください
586:名無しさん@お腹いっぱい。
07/06/08 17:49:58
>>585
URLリンク(pc11.2ch.net)
587:名無しさん@お腹いっぱい。
07/06/08 21:02:22
シェルスクリプトとGUIアプリの連携ってか?
588:名無しさん@お腹いっぱい。
07/06/08 22:41:28
質問です!
---hoge.txt---
aaa
bbb
ccc
これを
---hoge.txt---
aaa
ccc
こうしたい。
sed -i "s/bbb//g" hoge.txtだと
---hoge.txt
aaa
ccc
こうなってしまう・・・
589:名無しさん@お腹いっぱい。
07/06/08 22:49:06
sed -i -e '/bbb/d'
590:名無しさん@お腹いっぱい。
07/06/08 23:03:06
>>589
ありがとうございます!
591:名無しさん@お腹いっぱい。
07/06/08 23:37:42
GNU sedは正規表現のエスケープまわりが腐ってるんだよなあ
それに、わざわざBourne Shellに縛ったスレなのに、GNU拡張に依存するのもどうかと思う
ポータビリティも勘案すると、perl使った方がいい
592:名無しさん@お腹いっぱい。
07/06/09 10:18:52
GNU grepの-oは便利
593:名無しさん@お腹いっぱい。
07/06/09 11:53:54
>>592
モレも-Po がマジ便利だと思う。
594:名無しさん@お腹いっぱい。
07/06/09 12:23:49
それを言ったらshよりzshのが便利だ
595:名無しさん@お腹いっぱい。
07/06/09 12:49:24
そうだよ
596:名無しさん@お腹いっぱい。
07/06/09 14:42:53
FreeBSDよりWIndowsのが便利だ
597:名無しさん@お腹いっぱい。
07/06/09 14:54:08
当たり前だろ
598:名無しさん@お腹いっぱい。
07/06/09 15:01:51
perlの書法がもっと自由度低かったら決定版たったのだが。
お行儀悪く書けてしまうのが悩みの種
599:名無しさん@お腹いっぱい。
07/06/10 01:08:21
お行儀良く書きたいならRubyなりPythonなりへ行けば良い
お行儀悪く書いても心が痛まないのがPerlの長所
600:名無しさん@お腹いっぱい。
07/06/10 01:10:39
use strict; するんだからそれほどひどいコードにはならないような
601:名無しさん@お腹いっぱい。
07/06/10 22:37:24
どーせワンライナーか数行でやれるようなのしかPerlで書かないから
どうでもいい
602:名無しさん@お腹いっぱい。
07/06/15 02:31:42
cshを勉強し始めたものです。
研究室で使うためです。
C言語もほとんど知らないので、取っ付きにくく、苦労してます。
今よく分からないのは、シェル変数と環境変数です。
普通に話に出てくるのですが、変数だとは理解してますが、違いが分かりません…
どなたか教えて頂けませんか?
603:名無しさん@お腹いっぱい。
07/06/15 02:41:57
シェル変数はシェルが使う
環境変数は(主に)呼び出されたコマンドが使う
それはいいとして、なんでcshかちゃんと確認しろ
csh使う必然性がなければ、shにしとけ