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にしとけ
604:名無しさん@お腹いっぱい。
07/06/15 03:12:03
環境変数は子プロセスに引き継がれる。
シェル変数はそのシェルのみが使い、
子プロセスに引き継がれない。
605:602
07/06/16 01:09:53
レス有り難うございます。
なぜcshなのかと言うと、 今研究室で使われてるのがcshだとしか…
Cで書かれたソースプログラムをcshに渡して、
結果を他のプログラムに渡して……
って感じらしいです。
まだ学部なので、難しいプログラムは書けず、
既成のプログラムの値を変えて走らせたりするようです。
最近の課題が、あるcshの中身を渡され、理解してくるものでしたが、
プログラムの知識が無い自分にはさっぱりというわけです…
606:名無しさん@お腹いっぱい。
07/06/16 01:58:47
そんなに何種類もcshがあるのか?
607:名無しさん@お腹いっぱい。
07/06/16 03:31:44
cshで書かれたシェルスクリプトってとこじゃないか?
608:名無しさん@お腹いっぱい。
07/06/16 15:17:35
いや、cshの中身だぞ?
609:名無しさん@お腹いっぱい。
07/06/16 15:47:46
とりあえず>>605よ、
cshの中身というのはcshスクリプトという意味か?
610:名無しさん@お腹いっぱい。
07/06/16 16:11:27
こらこら、cshの話はもう終り。禁止。
611:名無しさん@お腹いっぱい。
07/06/16 16:53:10
GNU grepの話をしてもいいなら、cshも良くないか
612:名無しさん@お腹いっぱい。
07/06/16 18:01:05
良くない。
613:名無しさん@お腹いっぱい。
07/06/16 18:02:26
シェルスクリプトのスレでシェルのソースコードの話かぁ……
614:名無しさん@お腹いっぱい。
07/06/16 19:35:05
質問です。
ファイルの内容が同じものをリストアップする目的で、
対象ファイルのmd5sumを計算したいと考えています。
ただし、ファイルが大きいと時間がかかってしまうので、まずはファイル頭の
512バイトだけでmd5sumしたいです。以下のようなものを書いたのですが、
ファイル数が多い(1000とか)とプロセスの起動がボトルネックになってしまう
ようで、遅いです。
while read -r filename
do
dd if="${filename}" ibs=512 count=1 2> /dev/null | md5sum >> output
done < ${tempfile_prefix}2_filesize_onajiyatu
md5sumに先頭から512バイトだけで計算しろと指示することはできますか?
もしくは何かいい案ありますでしょうか?
615:名無しさん@お腹いっぱい。
07/06/16 19:45:20
えろ画の整理スクリプトかよ
616:名無しさん@お腹いっぱい。
07/06/16 19:49:09
違います。
エロ動画です。
だからでかいのです。
617:名無しさん@お腹いっぱい。
07/06/16 19:52:32
>>614
プロセス起動がネックならperlとかpythonとかrubyとか好きなのでやれ。
618:名無しさん@お腹いっぱい。
07/06/16 19:53:08
>>614
perl を使う
619:名無しさん@お腹いっぱい。
07/06/16 20:02:27
まずはファイルサイズで比較すればいいのに
620:名無しさん@お腹いっぱい。
07/06/16 20:11:47
粗く分けるのにmd5なんか使わんでも。
>>619 の通りファイルサイズが手軽だし、もし同じサイズで内容が違うものが
沢山ならファイル中の適当なところをhexdumpでもいいんじゃないの。
621:名無しさん@お腹いっぱい。
07/06/16 20:37:43
横から済まぬが
>>619,620
>> ${tempfile_prefix}2_filesize_onajiyatu
って書いてあるから、そもそも同じサイズ限定ではないのか?
622:名無しさん@お腹いっぱい。
07/06/16 20:40:36
同じファイルサイズのものだけでも1000ファイルもあるって、
結構集めまくったね、絵炉動画をw
623:名無しさん@お腹いっぱい。
07/06/16 21:03:28
>617,618
perlか・・・ついに手を出すときが来たか
>619,621
失礼しました。サイズ比較をあらかじめこんなのでやってます。
ls -l "$@" | sed 's/ \+/ /g' | cut -d ' ' -f 5,8 > ${tempfile_prefix}1_filesize_all
awk '{ if(a[$1,0]==0){a[$1,0]=1;a[$1,1]=$0;} else{if(a[$1,0]==1){print a[$1,1];} a[$1,0]++;print $0;} }' \
${tempfile_prefix}1_filesize_all > ${tempfile_prefix}2_filesize_onajiyatu
>620
ためしに512byteのgomi.txtを作ってみて、以下試しました。
%time (for i in `seq 1 1000`; do cat gomi.txt > /dev/null 2>&1 ; done;)
-> 1.486sec
%time (for i in `seq 1 1000`; do md5sum gomi.txt > /dev/null 2>&1 ; done;)
-> 1.510sec
これくらいのサイズだと処理内容はあまり影響なさそうです。
md5sumの方が比較しやすかったのです。
>622
いやいや、得ろ動画とか1000個とか例えばの話ですよw
624:名無しさん@お腹いっぱい。
07/06/17 00:32:06
>>614
まずは、ファイルサイズではじいたら?
625:名無しさん@お腹いっぱい。
07/06/17 00:34:24
すまん。@bitwarpなもんで、更新漏れだった。
忘れてくれ
626:名無しさん@お腹いっぱい。
07/06/17 03:14:21
xargsでもつかえば?
627:名無しさん@お腹いっぱい。
07/06/17 04:00:08
気が向いたんでやってみた
$ time (for f in tmp/*; do dd if=$f bs=512 count=1 2>/dev/null | md5sum; done)
065d30715dcffa21596406373a9124ac -
...中略...
ed4cf7b8f209f9ce630b5e76219357ae -
(; for f in Desktop/*(.); do; dd if=$f bs=512 count=1 2> /dev/null | md5sum; ) 0.09s user 0.38s system 49% cpu 0.960 total
$ time perl -M'Digest::MD5(md5_hex)' -e 'for (@ARGV) { open F,"<$_"; read F,$a,512; print md5_hex($a),"¥n" }' tmp/*
065d30715dcffa21596406373a9124ac
...中略...
ed4cf7b8f209f9ce630b5e76219357ae
perl -M'Digest::MD5(md5_hex)' -e Desktop/*(.) 0.02s user 0.02s system 18% cpu 0.193 total
628:名無しさん@お腹いっぱい。
07/06/17 17:51:50
xargs使えって
629:名無しさん@お腹いっぱい。
07/06/17 20:19:20
絵炉動画ファイルは、ファイル名にスペースとか特殊記号とか入りまくりである
ことが多いため、xargsは全く持って不適当。
630:名無しさん@お腹いっぱい。
07/06/17 21:13:28
それならfor文やreadでも難しくならないか・・
まxargsのほうがもっと不適当なのだろうが
631:名無しさん@お腹いっぱい。
07/06/17 21:16:22
>>629
man xargs
632:名無しさん@お腹いっぱい。
07/06/17 21:24:09
>>631 は何がしたいんだろうか? まったく外してるわけだが、、
633:名無しさん@お腹いっぱい。
07/06/17 21:26:16
>>631
$ ssh solarishost man xargs
634:名無しさん@お腹いっぱい。
07/06/17 21:33:38
ファイル名の問題以前に、個々のファイルごとに頭の512バイトを切り出したいわけ
だから、xargs使ったところでプロセス起動数は節約できない。
よって、>>626 >>628 は全く的はずれ。
635:名無しさん@お腹いっぱい。
07/06/17 21:34:10
>>632
はずしているのはお前の方。
find ~ -print0 | xargs --null
636:名無しさん@お腹いっぱい。
07/06/17 21:47:33
>>635
はずしているのはお前の方。
-print0 や xargs --null は、一般には使えない。(たとえばSolaris)
あと、>>634 が指摘してるように、今回の件は xargsでは解決しない。
よって、そういう意味でも外しているのは >>635 の方。
637:名無しさん@お腹いっぱい。
07/06/17 22:10:53
-print0で喜んでるのは石器人。
現代人はふつー find ... -exec ... +
638:名無しさん@お腹いっぱい。
07/06/17 22:21:02
>>632 から某頭の悪い粘着君臭がする。
639:名無しさん@お腹いっぱい。
07/06/17 23:03:19
て言うか、プロセス起動数が云々と言うなら md5sum を改造するなり、
ファイル名の取得からハッシュの計算までやるようなアプリ作ればい
いじゃん。
640:名無しさん@お腹いっぱい。
07/06/17 23:14:55
>>617-618で既に正答が出てるの何を今更…
641:名無しさん@お腹いっぱい。
07/06/18 00:13:31
答えそのものも>627に出てるわけだが...
642:名無しさん@お腹いっぱい。
07/06/18 00:36:28
#find ... -exec ... +
横レスだが知らなかった
ってか手元のmanにはない
643:名無しさん@お腹いっぱい。
07/06/18 03:34:11
最後の「+」ってなに?
644:名無しさん@お腹いっぱい。
07/06/18 08:19:20
xargsは同じプロセスを連続起動するから
工夫されていると聞いたことがある。
これは事実?
645:名無しさん@お腹いっぱい。
07/06/18 15:14:11
基礎的な質問ですいません。
bashで、シェル変数に値を突っ込み -zで存在を確認する手法ですが、
if [ -z $test ] ; then
echo "val exist"
else
echo "val isn't exist"
質問
1.[ -z $test ] と書くのはよろしくない?
2.[ -e $test ] とすると、シェル変数が存在しない時に真、
シェル変数が存在する時に偽となるのはなぜ?
結構、このパターンで利用してたのですが、2.の動作を確認すると、
なぜだか逆になっているような。じゃ、-zもよろしくないのかなぁ、と
ところで、みなさんは、環境変数やシェル変数の存在確認をどうやってますか?
宜しくお願いします。
646:名無しさん@お腹いっぱい。
07/06/18 15:23:43
>>645
まず、[ ] の中ではシェル変数は基本的にダブルクォートを付けること。
[ -z "$test" ] とする。この場合、$testがセットされていれば偽になる。
これだと真偽が逆になってわかりにくいので、
[ -n "$test" ] または -n は省略できるので [ "$test" ] とする。
[ -e $test ] は、$testがセットされていない時、[ -e ] となってしまい、
これは、"-e" という文字列がサイズゼロかどうか(この場合は2バイト)という
判定がなされるため、$testがセットされていないと真になる。
一方、$testがセットされていると、今度は -e は -eオプションとして解釈され、
$testの中身がファイル名とみなされるため、そんなファイルがなければ偽になる。
更に言うと、-e は Bourne shでは使えないため非推奨。
647:名無しさん@お腹いっぱい。
07/06/18 15:39:39
>>646
ありがとうございます。
うーーん、なるほど。1行目でよく分かりました。
648:名無しさん@お腹いっぱい。
07/06/18 16:11:12
丁寧に説明してもらった理由を理解したのかしてないのかよくわからん回答だな
649:名無しさん@お腹いっぱい。
07/06/18 16:12:07
このあたりものこともあって zsh で手抜きスクリプト書くことが多くなった
650:名無しさん@お腹いっぱい。
07/06/18 16:24:47
>>648
舌足らずですみません。
1行目で自分の間違いを気付き、
詳しい説明をしていただいたので助かりました、と書きたかったところでした。
-eオプションの非推奨コメントは特に助かります。
651:名無しさん@お腹いっぱい。
07/06/18 21:09:56
______
/ )))
/ /// /――-ミ
/ 彡彡 // / ヽ))
/ 彡彡 iiiiiiiiiiiiiii iiiiiiiiii|
/ 彡彡 < ・ > 、<・ >l
/ | ヽ 〉
/ ( | | __) | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ | ≡ /, ―― |ゝ < 馬鹿共にshellを与えるな!
/ | | L ___」 l ヾ \_________
_ミ l ______ノ ゞ_
| l ヾ ー / | l
| | \ー ‐/ | |
652:名無しさん@お腹いっぱい。
07/06/19 08:10:33
>>646
>>更に言うと、-e は Bourne shでは使えないため非推奨。
?????
653:名無しさん@お腹いっぱい。
07/06/19 08:30:50
>>652
教えて欲しいんなら「???」じゃなくて、ちゃんと日本語で書け。初心者君。
654:名無しさん@お腹いっぱい。
07/06/19 09:19:43
ところで-eがないshが標準で載ってるOSってどれ?
655:名無しさん@お腹いっぱい。
07/06/19 09:36:14
Solarisとか。SCOとか。Tru64とか。
656:名無しさん@お腹いっぱい。
07/06/19 11:36:15
>>655
今では使われていないOSばかりですね。じゃあ、-e使ってもいいですねw
657:名無しさん@お腹いっぱい。
07/06/19 11:45:45
つっ、釣られないぞ
658:名無しさん@お腹いっぱい。
07/06/19 13:41:51
>>653
では日本語で書かせていただきます。
私が学習に使用している O'REILLY の「詳解シェルスクリプト」によりますと、
/bin/sh 組込の test コマンドに於ける -e 表現は標準的なものとして記述され
POSIX で定義している旨明記されております。また更に今回の議題の発端である
>>645 質問子の環境と共通する bash 等での独自の拡張に付いて記述した件では、
条件判定構文中の -a 演算子について(非推奨です。 -e を使いましょう)
とまで明記されているものを、使用者の環境の多用性や使用目的の別など勘案せず
一言の下に「非推奨」と断定できる根拠を教えてください。 お願いします。
659:646じゃないけど
07/06/19 13:47:32
>>658
「Bourne shでは使えないため」って書いてあるじゃん。
それが重要かどうかは各自が判断すればいいこと。
660:名無しさん@お腹いっぱい。
07/06/19 13:51:15
>>658
POSIXは理想論ばかりで、現実に即してないんだよ。
いくらPOSIXでどうこう言っても、実際に動くかどうかがすべて。
test -e については、Solarisの/bin/shで動かないんだから、
OS共通のシェルスクリプトでは非推奨であるのは当然。
あと、別件で、-e の意味で -aを使ってはいけない(非推奨)なのはその通りだよ。
-a は別に ANDの演算子の意味があって、そちらの意味で使うべきだからね。
わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
661:658
07/06/19 14:12:59
予想通りの回答をどうもありがとうございました。
>>わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
ご心配有り難うございます。
そもそも機能が曖昧過ぎて過ぎて使おうと思ったことも御座いませんw
662:名無しさん@お腹いっぱい。
07/06/19 14:15:20
予想してたなら聞く必要ないだろ……。
むだに波風立てんなよ。
663:名無しさん@お腹いっぱい。
07/06/19 22:13:27
シェルスクリプトの互換性過敏症な奴っていじると面白いんだよ
664:名無しさん@お腹いっぱい。
07/06/19 23:22:07
ここにもユトラーか・・・・
665:名無しさん@お腹いっぱい。
07/06/19 23:28:40
>>663
export LANG=C とか書いてるのを見ると反応してしまうのは互換性過敏症ですか?
666:名無しさん@お腹いっぱい。
07/06/19 23:56:18
いや寧ろ互換性を指摘できる人がいて有難い
667:名無しさん@お腹いっぱい。
07/06/20 00:19:14
そんなこといって年寄りほめたらわらわらわいてくるぞ。
SunOS 3.5世代の俺なんかまだまだ甘ちゃんだ。
668:名無しさん@お腹いっぱい。
07/06/20 05:31:28
沸いてきてくれ
それぞUNIXの面白さの真髄だわ
669:名無しさん@お腹いっぱい。
07/06/20 09:12:11
仕事では一緒になりたくねえけどなw
670:名無しさん@お腹いっぱい。
07/06/20 21:45:49
ようするに、 POSIX が理想論で現実に即していないのは当然の話で、
現実がバラバラだから標準化が必要という理念が生まれたわけですわな。
で、各プラットフォームでそれぞれ POSIX に準拠する姿勢を示していながら
どうしても譲れない仕様への拘りがあるから未だに移植性の問題が取沙汰される。
そこの処の理を語らずに、只単に○○では使える or 使えないという議論に
終始するというのは如何にも思慮が浅いと言わざるを得まい。
671:名無しさん@お腹いっぱい。
07/06/20 22:08:39
実社会ではそういうもんだ
672:名無しさん@お腹いっぱい。
07/06/20 23:20:26
携帯電話みたいなものだね
いまだに携帯電話つかわないもうろくジジイとかいるかなw
673:名無しさん@お腹いっぱい。
07/06/21 01:34:39
じじいじゃないけど使ってないよ。
674:名無しさん@お腹いっぱい。
07/06/21 01:36:56
うわw
675:名無しさん@お腹いっぱい。
07/06/21 01:38:49
携帯電話使わない仕事というと、医者とかパイロットくらいか
676:名無しさん@お腹いっぱい。
07/06/21 01:53:54
というか、どこが「携帯電話みたいなもの」なのかさっぱりわからん。
677:名無しさん@お腹いっぱい。
07/06/21 03:01:35
痴呆がはじまった?
678:名無しさん@お腹いっぱい。
07/06/21 23:19:43
>>670
こだわりなんかないだろ、準拠するのが面倒なだけだよ。
準拠したからって売れ行きがたいして変わるわけでもないし。
>>675
院内では携帯は使わないけど緊急呼び出しが頻繁にあるような
医者もいるからなぁ。
パイロットは仕事中は使わないけど、そういう意味なら電車の
運転手なんかも同じだな。
て言うか、仕事中とか会社の中に限定すると携帯持たない/持て
ない奴はそれなりにいるし。
679:名無しさん@お腹いっぱい。
07/06/22 00:04:29
ケータイでも3G(高周波のやつ)は大丈夫らしいけど。
680:名無しさん@お腹いっぱい。
07/06/22 09:16:46
使えない奴にかぎって、くだらねえことに拘ってたりする
681:名無しさん@お腹いっぱい。
07/06/22 20:12:44
そろそろUNIXの話にでも戻す?
682:名無しさん@お腹いっぱい。
07/06/22 20:59:20
よしなに