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

このエントリーをはてなブックマークに追加
1はろう
ない!!のでつくりました
2はろう:01/09/12 23:03
CSVファイル内からシェルに引数で渡す時
オークで$0〜$9を使うのはしっとりやすが
00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
15つ目の引数を引っ張りたい時はどうしたらいいでしょうか?
よろしくおねがいします
3駄スレ認定:01/09/12 23:42
自分だけののための使い捨てスレッド立てるなっての。
以下のスレッドのどれかで改めて質問するように。

くだらない質問はここに書き込め!なんでもアリ2
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=996642453&ls=50
便利なシェルスクリプト見せろ
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=996949546&ls=50
☆シェルスクリプトを勉強するにあたって☆
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=989659936&ls=50
4owl:01/09/13 01:34
うはは、これじゃループだな

応援あげ
つーかAWKをちょっと使ってるから期待も有る(w

AWK256本は読んだこと無い

Bash256本とかだしゃいいのにな…アスキーさんよぉ
5viマン@HP-UX(当時):01/09/13 03:31
AWKは知らない。(昔流行った駄洒落。)
65 ことviマン@Linux(現在):01/09/13 03:37
↑しょうもない駄洒落で上げちゃった。逝って来ます。(寝ます。)
75:01/09/13 03:42
AWKは望まない。(あ〜手が勝手に…)
8はろう:01/09/13 10:39
あったんですね、修行してきます。
9はろう:01/09/13 11:05
でもよかったら教えてください。
10名無しさん@お腹いっぱい。:01/09/13 13:11
awk は書かねぇ たった一行
>>5 >>7
こんなのが流行ったのか?
12ど素人:01/09/13 21:36
awkのprint文で,「"sample.txt" isn't found.」って
出力させたいんです。どうすればいいの?
13名無しさん@お腹いっぱい。:01/09/13 22:29
awk '{print "\"sample.txt\" isn\047t found"}'

でどう?
Aho さんは、アホですか?
ってのもよくあった気がする。
15はろう:01/09/14 09:43
awk じゃなくても
echo " 表示させたい文 " で出力できるよ?
16:01/09/14 11:18
Cシェルのループの記述について質問

---
 echo -n "繰り返し回数を指定してください。(1〜100)"
 set count = $<
---

繰り返し回数を取得しました。
この回数ループするにはどう書けばいい?
C言語のfor文みたいに書けばいいの?
while ($count > 0)
 hoge
 hoge
 @ count--
end
18a:01/09/14 13:07
@マークはどういう意味ですか?
1912です:01/09/14 21:03
13さん,14さん
ありがとう。
2012です:01/09/14 21:04
まちがえた。
13さん、15さん
ありがとう。
21名無しさん@お腹いっぱい。:01/09/14 21:06
>>18
@を書くと、Cシェルスクリプト内で、
四則演算式が使えます。
22名無しさん@お腹いっぱい。:01/09/15 03:25
AWKのprintf文について教えてください。

次のようなTXTファイルがあるとします。
(ファイルの中身)
% cat moto
000-111-2222
000-333-4444
000-553-5555

このファイルをCSHのコマンドラインから、
awkを用いて下記のように出力するにはどうすればいいでしょうか?

(取得したい結果)
TEL='000-111-2222';
TEL='000-333-4444';
TEL='000-553-5555';

awkファイルを作成し
% cat a.awk
BEGIN {}
{
printf( "TEL='%s';\n",$1 )
}

上記のように書き実行すると、

% awk -f a.awk moto
TEL='000-111-2222';
TEL='000-333-4444';
TEL='000-553-5555';

と、目的の結果が得られますがコマンドラインから実行すると
上手くいきません。

(上手くいかなかった例1)
% awk '{printf"TEL='%s';\n",$1}' moto
TEL=000-111-2222;
TEL=000-333-4444;
TEL=000-553-5555;
※シングルクォートがつかない。

(上手くいかなかった例2)
% awk '{printf"TEL=\'%s\';\n",$1}' moto
一致しません"。

※エラーになってしまう。

シングルクォートの扱いが良く分かりません。

awkっつーよりもCSHの問題のような気がしますが、

どうやればいいのか分かりません。

啓示を授けてください。お願いします。
23原住民:01/09/15 04:04
% awk '{printf"TEL='\'%s\'';\n",$1}' moto
エレガントジャナイネエ。
24名無しさん@お腹いっぱい。:01/09/15 16:00
>>22
過去ログをみろ
2522です:01/09/16 03:52
>過去ログをみろ
まったくです。24さん。すんません。過去ログつーかすぐ上ですね。
(恥ずかしい...。)

% awk '{printf"TEL=\047%s\047;\n",$1}' moto
TEL='000-111-2222';
TEL='000-333-4444';
TEL='000-553-5555';

できやした。
過去ログ巡礼してきます。(哀
26通りがかり:01/09/17 08:45
ApacheでCodeRed*のログを切りたいのですが

XXXX
NNNN
を切り出す

おなじIP、ドメインを1つにする

時間も出す

って簡単にできないでしょうかねぇ?

どっかの過去ログで
NN、XXと時間を削除しただけの吐き出しスクリプト(つーかコマンドだな)は見かけたのですけどね〜

みなさんはどのようにして顧客にログ提出してますか?(特に今回のCode系)
27はろう:01/09/17 11:08
26へ データを切ってそれだけのデータにするとか?
もうちと説明くれないかな
>26
そういうもんはそのつど作るもんだ。
それで金もらってんだろ?
2926:01/09/17 11:54
>>28

ううう、痛いです。
でも、線引屋なのでそこまでするなら別料金が欲しいです〜

ってゆーか
一応、考えますです
逝ってきますです
30名無しさん@お腹いっぱい。:01/09/17 12:03

>> 28

線引くのですね。へたれですがこんなのでどうでしょう。

gawk '$0 ~ /default/ {print $0}' access.log | \
sort | \
gawk 'BEGIN {host = ""; at = 0} {if(host != $1) {if (at > 0) {print " ---------> " at;}; host = $1; print host; print $4 " " $5; at = 1;} else {print $4 " "$5; at++}\
} END {print " ---------> " at;}'

自分のへたれ具合に悲しくなりました。鬱だ屍脳。
31わら:01/09/17 22:15
おもしろい
32名無しさん@お腹へった。:01/09/18 03:08
>>26
こんなのはどう?
ホスト,攻撃数,日時1,日時2,...
のようにcsvで出力します。fork発生しまくりでおそいですけど。

----
#!/bin/sh
LOGS=`ls access_log*`
HOSTS=`grep -e NNNNNNN -e XXXXXX $LOGS |awk '{print $1}' |sed "s/.*://" | sort -u`

echo "#host,count,date1,date2,..."
for i in $HOSTS
do
CNT=`grep "^$i .*default.ida" $LOGS |wc |awk '{print $1}'`
echo -n "$i,$CNT,"
grep "^$i .*default.ida" $LOGS |awk '{printf"%s,",$4}' |sed "s/\[//g"
echo
done
----

結果例(タブ区切りでsort +1 -nr した場合ですけど)
#host count date1 date2
203.136.45.179 26 09/Sep/2001:04:14:03 09/Sep/2001:04:15:47 ....
203.136.45.129 25 14/Sep/2001:22:34:58 14/Sep/2001:23:31:09 ....
203.136.45.208 23 05/Sep/2001:00:09:14 05/Sep/2001:00:43:22
203.236.227.71 16 01/Sep/2001:16:28:36 01/Sep/2001:16:28:37
203.136.45.4 14 26/Aug/2001:07:10:14 26/Aug/2001:07:53:24
203.136.45.213 14 02/Sep/2001:07:27:40 02/Sep/2001:11:20:12
203.136.45.130 11 01/Sep/2001:05:40:41 01/Sep/2001:05:44:13
203.136.45.100 10 16/Sep/2001:04:25:38 16/Sep/2001:05:35:48
203.136.45.211 9 16/Sep/2001:16:30:43 16/Sep/2001:17:49:39
203.136.155.110 8 01/Sep/2001:21:53:23 01/Sep/2001:21:56:01
203.235.96.35 6 31/Aug/2001:03:58:28 31/Aug/2001:03:59:55
:
33名無しさん@お腹へった。:01/09/18 03:24
ところで、

% getip 203.136.45.179 -a
address1 : 203.136.45.179
hostname : FLA1Aab051.oky.mesh.ad.jp
% getip 203.136.45.129 -a
address1 : 203.136.45.129
hostname : FLA1Aab001.oky.mesh.ad.jp

okyって沖縄のFLET's ADSLer?
34待った名無モロ、無修正画像サイト発見!しさん:01/09/18 03:25
35名無しさん@お腹へった。:01/09/18 05:18
% getip www.sex-jp.net -a
address1 : 64.124.93.46
hostname : sex-jp.net
alias1 : www.sex-jp.net

意味無し...
36はろう:01/09/19 13:12
HTTPのアクセスログから
不特定のIPアドレス、アクセス数をシェルか、オークで収集、統計できますか?
できるとしたらやり方を教えてください。よろしくお願いします。
>>36
回答1、できる
回答2、ハッシュを使う

以上
awk、sedでできることはperlでなんでもできふか?
perlってやっぱ覚えとくと便利で不可?
>38
perl は system を使えばなんでもできるYo!
40名無し:01/09/19 19:11
awkもsystemなかったか?
>>39
なるー。るびーも能力的には互角?
まあ、テキスト処理が楽に統一的に使えそうでいいな
っておもてマフ。
42名無しさん@お腹いっぱい。:01/09/19 22:31
>>38
perlは、syscall.phをrequireして、
引数をpackして直接syscallよびだすとなんでもできるよ
>>40
systemはawkにもある。
>>36って同じ質問をいくつものスレッドでするし、
前の$15の件も解決したんだか、しないんだか何も言わないし
なんだかな〜。
>43
たぶん望む答えが出てきてないんだろうな。
つーか、自分が何を望んでいるかがわかってないのか。
45はろう:01/09/20 11:05
すみません 私がカキコしてるのはここと便利なシェルをみせろの二つっす
$15の問題は解決しました
けどもawk -f でやると動きませんが
-fなしだと動きます。
46名無しさん@お腹いっぱい。:01/09/20 18:03
<SunOS 5.7>
指定されたディレクトリのファイルを圧縮して
ftpで他のサーバに格納するシェルを作りました。(シェル自体はテスト済み)

こいつを時間起動で毎日一回動かすようにする為、crontabに
登録したのですが、シェルが動く毎にメールが帰ってきます。

<クーロン登録内容>
* 22 * * 1-5 backup.sh >/dev/null

<メール内容>


produced the following output:
stty: : No such device or address


処理自体はうまく動いて、ftpも特に問題は無いのですが
メールが来るのがうっとうしいです。

メール出さないようにするにはどうすればいいんですかね?
>>36
専用のsoftware, "analog"じゃ駄目なの?
48名無しさん@お腹いっぱい。:01/09/21 00:27
>46
完全にメールを受け取らない(クーロン正常/異常)場合
* 22 * * 1-5 backup.sh >/dev/null 2>&1

やってみれ
シェル作ったんか…。凄いね。
そろそろドンパチが始まるかも知れないから シェルより
シェルターを作った方がいいかもね
51名無しさん@お腹いっぱい。:01/09/21 22:32
> /dev/null 2>&1
だろが!!!

馬鹿たれが!!!!!!!!!!!!!!!!!!!!!!!

そんなこともわからんのか!!!!!!!!!!!!!!

チンカス
マンカス!
53はろう:01/09/28 19:03
ふう。
"analog"っすか。
修行いてきやす。
仕事忙しくてみれないこのごろ。
54名無しさん@お腹いっぱい。:01/10/01 22:04
質問。

ツリーになっているディレクトリから、ファイル名とファイルサイズが同じ複
数のファイルを発見し、適当な一つ(最新のものかなあ。あんまりこだわらな
い) を残して他を消したいんですが、エレガントなのはどういう方法だと
思いますか? (なにをしているかは見当つくよね。美術画像の整理。)

perlかなんかで書くんだろうけど、オレの技量だと1週間かかっちゃう。

同じことしている人がいたら教えてください。
55名無しさん@お腹いっぱい。:01/10/01 22:31
それ以前にリンクの使い方を覚える、っていうのは?
56名無しさん@お腹いっぱい。:01/10/01 22:36
>>54
find . -ls | awk '{ path=$NF ; gsub(".*/", "", $NF); print $7"-"$NF" "path}' | sort | awk 'BEGIN{ name=""} { if ( name == $1 ) { print $2 } else { name = $1} }' | xargs rm

なんつーか力業くさいが。当然テストもしてないぞ?
あ、もちろん妙なファイル名使う子は使っちゃいけないぞ
57名無しさん@お腹いっぱい。:01/10/01 22:37
>>55

ハード/シンボリックリンクのことですね。
それは知ってる(と思う)

複数の美術館からもらってきた美術画像に同じものが
大量に含まれているんですよ。
5855:01/10/01 22:44
>>57
そっか。ごめんね。鬱死。
59名無しさん@お腹いっぱい。:01/10/01 22:53
>>56

なるほど.... find -lsで"バイト数-名前 ディレクトリつきの名前" という形
にしてソートして抽出するわけですね。変なファイル名もはいっているので
(オレが作ったわけじゃないから)、自分でももうちょっと考えてみます。

しかしよく考えたら数万行ソートしなきゃならんのだな。
>>59
> しかしよく考えたら数万行ソートしなきゃならんのだな。
ソート(そーっと)やって下さい。(オヤヂギャグ)
6159:01/10/01 23:12
11万行ぐらいあるけど、
今の機械ではこれくらい一瞬ですね。

変な名前のファイルはあらかじめ排除しておくことにしたけど、
大文字小文字の問題があることを発見したのでもうちょっと検査中。

参考になりました。ども。
>>57
キャッツアイ?
6359:01/10/07 17:20
その後、ファイル名とサイズがいっしょってだけでは
まだまだ重複があることに気づき、

find -type f -exec md5 -r {} \;
してリストをつくり、
#! /usr/bin/perl
while(<>) {
($md5, $filename) = /^([0-9a-z]+) (.*)$/;
if ($md5 =~ $prev_md5) {
print "$prev_filename\n$filename\n";
}
$prev_md5 = $md5; $prev_filename = $filename;
}
ってなフィルタを通して
MD5がいっしょのファイルを抽出することにしました。

ばかみたい。
どっかで見た記憶が... と思って freshmeat で "duplicate"
で検索すると、そのものズバリのソフトが結構出て来たぞ。
多くは書かないたった一行。
>>65
うまい!座布団3枚!
6759:01/10/07 19:03
>>65
やっぱり rm -rf * ってこと?
68かりんと:01/10/07 21:16
お祝いに美術画像おくれ。
69名無しさん@お腹いっぱい。:01/10/27 12:41
書庫真近の為上げ
70名無しさん@お腹いっぱい。:01/11/02 17:14
cshのスクリプトについての質問です。
バックグラウンドでジョブを実行してwaitで待ってる時に、
C-cで中断してもonintrで指定した処理に飛んでくれません。
どうすれば良いのでしょうか?
71名無しさん@お腹いっぱい。:01/11/12 12:59
保守上げ!
72名無しさん@お腹いっぱい。:01/11/13 18:56
いまさらだが、
>>59
が書いてたことをやる
filedupeってのが
FreeBSDのportsにある。dbファイルを固定のところに作るのが
アレだが。

char filename[80];
んとこはもうちょっと長くしといた方がよさそうだ。
73瞬殺して!!!:01/11/22 16:55
前日の日付けってどうやって取得すんの?
date コマンドを使おうとしてますが別の方法でも
かまいません。教えて下さい。
>>73 時々この質問が出てくるねぇ......意外と需要ってあるのかな?

[sh系]
TZ=JST+15 date
[csh系]
env TZ=JST+15 date
75瞬殺して!!!:01/11/22 17:57
>>74
73です。どうもです。
76>:01/12/04 21:40
どのシェルがお勧め?
昭和シェル
ラルク(以下省略)
サム・・・。
なんでawkでスレ立てなかったんだyo!
80名無しさん@お腹いっぱい。:01/12/08 04:47
>>74は邪道
date -v +1d
を使え。

それ以前に73はちゃんとmanを読みましょう。
>>80 おいおい -vオプションがあるdateの方がめずらしいんとちゃうか?
80は脳がGNU化されています
83にわかawk利用者:01/12/08 12:38
Cygnusのawkに4万行食わせたら、ちゃんと終わるんだけど結果がめちゃくちゃでした。
awkの変数の上限とかってどこで決まるの?orどこみるとわかるの?
うちの GNU の date にも -v ないぞ
SUSv2に載ってるのは↓だけ。

NAME
date - write the date and time

SYNOPSIS
date [-u] [+format]
date [-u] mmddhhmm[[cc]yy]
86名無しさん@お腹いっぱい。:01/12/09 04:15
バックアップ用のシェルスクリプト、どっかにありません?
バックアップ専用のHDに、定期的に流し込むようにしたいんですけど。
>>86
どれくらいの精度を望むかわからんが例えばテキトーにいくなら対象を
tar でまとめて bzip(or gzip)して date の出力でテキトーな名前つけて
マウントした HDD のディレクトリへ mv するコマンドを crontab に登録すればいい。
これくらいなら自分で書けるだろう?
>>86
> バックアップ用のシェルスクリプト、どっかにありません?
> バックアップ専用のHDに、定期的に流し込むようにしたいんですけど。

pdumpfs
http://namazu.org/~satoru/pdumpfs/
vbackup
http://www.rommelwood.de/~martin/vbackup/
89名無しさん@お腹いっぱい。:01/12/09 13:03
こういうことって出来ますか?
入力ファイルを編集して編集結果をそのファイルに出力。

このように書くと FILE が空っぽになってしまうんですよね。
$ sed s/foo/var/g <> FILE
$ sed s/foo/var/g < FILE > FILE
環境はKorn-Shellです。
90名無しさん@Emacs:01/12/09 13:26
>>89
できません。perl でも使ってください。
>>89 テンポラリファイルに出力してmv
92名無しさん@お腹いっぱい。:01/12/09 15:20
$ sed s/foo/var/g < FILE | cat > FILE
>>92
これって安全な事が保証されてますか?
もしそーだったらスゲー便利。
9492:01/12/09 15:57
思いつきで書いたけど、よく考えたらチョー危険です。
出力バッファリング範囲内しか保証しません。
cat の部分が確実にバッファリングするコマンドならいいんだけど。
なんかなかったかなぁ。
95FNS (File is Not the Stream):01/12/09 17:25
>>89
> $ sed s/foo/var/g < FILE > FILE

$ ed FILE <<EOF
%s/foo/var/g
w
q
EOF
overwrite使え。
97名無しさん@お腹いっぱい。:01/12/10 13:31
これ教えてください!

2.以下のコマンド"ffind"を作成しなさい
引数:ファイル名、ディレクトリ名
引数で指定したファイル名のファイルを引数で指定したディレクトリ内で探し、
存在するならその絶対パスを出力する。
ただし、ファイルの探索は指定したディレクトリより下にある全てのファイルに対して行う。
つまり、ディレクトリ内にディレクトリがあるならば、そのディレクトリ内も探索するという、再帰的探索を行うこと。

3.以下のコマンド"ls2"を作成しなさい
引数:なし
標準入力からの入力:ファイル名(ディレクトリも可
標準入力から入力されたファイル名に対し、存在しないなら"n"を出力、
ファイルとしてが存在するなら"f"を出力、
ディレクトリとしてが存在するなら"d"を出力しそのディレクトリ内のファイルの一覧を出力する。
ただし、出力は全て標準出力に行なう。これら操作を標準出力から".end."が入力されるまで行なう。
宿題は自分で
来年はちゃんと授業聞こうね。
>>94
ていうか、リダイレクト使ってる時点で全然ダメだと思われ。dd 使え。
101名無しさん@お腹いっぱい。:01/12/10 21:38
test1.log.20011112 test2.log.20011112
test1.log.20012113 test2.log.20011213

test3.log.20011102 test4.log.20011102
test3.log.20011203 test4.log.20011203

これらのログファイルを月ごとでtarで圧縮し、さらにcompressで圧縮し、
圧縮をかけて不要になったログファイルは削除されるシェルスクリプトを
作成したのですが、運用に適していないと言われました。
って、言うか笑われました。
どのように作れば良いのでしょうか?
ご教授お願いいたします。

#!/bin/ksh
ARGC=$#
MONTH_FLG=$1
if [ "$1" = "-?" ]
then
echo "使用方法 : TKBACKUP.sh P1"
echo "P1=YYYYMM : 対象月"
exit 0
fi

if [ $ARGC != 1 ]; then
echo "引数が間違っております "-?" で確認して下さい"
exit 0
fi

cd /home/test/
tar -cvf /home/test/test1/BACKUP.$1.tar test1.log.$1* test2.log.$1* test3.log.$1* test4.log.$1*
compress /home/test/test1/BACKUP.$1.tar
rm /home/test/test1.log.$1* test2.log.$1* test3.log.$1* test4.log.$1*
>>101
メッセージを漢字で出すのは適してないな。
>>101
引数が間違ってるのに exit 0 って…
>>101
ちゃんとエラー処理しないと、ログがあぼーんされるかもよ。
>>101
たしかに笑うかもな(すまそ)AIXかよ?
ディレクトリは変数にして、あとで変更しやすいようにしたほうがいいし、
GNUtar使えば一段階でtar&圧縮できるし、
>test1.log.$1* test2.log.$1* test3.log.$1* test4.log.$1*
は、だらだら書かないでも。
test?.log.${1}* か test[1234].log.${1}*
でいいよね。
ちゅうか、ファイルの作成日付でfindして一撃でできない?
その程度のものをわざわざ作んなくていいんじゃないかなぁ?
106101:01/12/11 09:21
エラー処理と言うは?
お教えいただけないでしょうか?
>106 笑った人に聞けば?
>>106
tarの後に無条件でrmしてるよね?
もしtarが失敗してたら、
バックアップとらないままlogは「あぼーん」でしょ?
(ここよりも、その人にちゃんと理由を聞いて将来の糧とするべし)
109カメ:01/12/11 12:06
もう、無茶です。無理です。
私の枕もとの靴下の中に、単位を忍ばせてって下さい。
日本にはサンタさんはいませんか???

パラメータとして2つの整数を入力して、
2数の最小公倍数を計算するスクリプト(lcm)を作成せよ。
ただし、2数をx,yとしたとき、x・y=gcd・lcmである。
% sh lcm 10 12
lcm of 10 and 12 is 60
%

パラメータとして複数のファイル名を受け取り、
それぞれのファイルの行数を表示するスクリプト(listlines)を
作成せよ。
% sh listlines a b c
file a has 5 lines.
file b has 9 lines.
file c has 12 lines.
%
shスクリプトでLCMを計算させるのか?
それはかなり高度だな。ってゆーか、用途を激しく間違ってる。

それに比べて行数カウントの方は溜息つきたくなるほどの情けなさだ。
わざわざスクリプトにする必要がない。やっぱり用途を激しく間違ってる。

出題者はいったい何を考えてるんだ?
111110:01/12/11 13:14
やってみたらLCMもかんたんにできたわ。ホレ回答。
解凍のしかたは自分で調べてくれ。

begin 644 hoge
M0EIH.3%!62936;F'VW```&A?@$`P??>P'X8!'$]_[]_N0`'"XJ`:IFD-":-&
M:3(::`:-&ADT]0:`2A`F@FIY3:F:@R:`T:!D``.8``````````$DDR!3]4TR
M>IIHP"!B9`TVD]3:30@Q.&P8EK1'#83MW*JF&H]/ZN<EM-?=S@5JKMOH#Y1P
MQ`\H8`:#$8).)Z2U>?U89>]!4)F94G@MKD/"0W!!]!DSHD5F$HR!0<>3Z28&
M-<R73*?)^(^:.)%\QS4:55SMIPORNX)MS,W48R:6#K+[LD*JR[;RQ+N$*:V-
MW/L$.D>]1%5#:K,AAV/;VWO,F%EW8N/W=4J7D%84S0="DNDAO,12*MJF`@;"
M@FS:O5SI["4HL##M9K`;!+`90$K1D#D5$<^1ZZ!B^SN6LD2]N_&ZU^>?Y&I>
MK@Q(<[:R*NUB2'&H5%&2DBZ']J4O70Y\(-",LPQ(EXSR_I%E&."<.FQPTQ&U
M;GC!>J-45)0;SK3QK@<QM*,I:5#W!C1@7HDLN+5YB1!.22'R]'E.3>B85XOH
MV*T`:Y!8/:#814TTB1N>I!D4I#[email protected]#H76I.H'459;4Z/7+/%<$_-"6E
M]=A)'%\5O%22Q%5%*5UC-G-)SFFOCF(VII_0R3=;8K:"C!74H7E=I0\G*S,0
:L@*^#GL2!VD=4ONN[7.S_%W)%.%"0N8?;<#0
`
end

listlines
こんなの書いて、なんか意味あるのか?

#!/bin/ksh
for i in $*
do
wc -l | awk '{print "file",$2,"has",$1,"lines."}'
done
>>112
wc 使わないで書くんじゃネーノ?
wc -l $i| awk '{print "file",$2,"has",$1,"lines."}'
だったね(わら)。

>>113
そーなの?
んじゃ、
#!/bin/ksh
for i in $*
do
awk 'END {print "file",ARGV[1],"has",NR,"lines."}' $i
done
115FNS (File is Not the Stream):01/12/11 14:58
じゃなくて、

i=0
(while read x; do
i=`expr $i + 1`
done) < $filename
echo $i $filename

だと思う。
>>115
なるほどね。
117FNS (File is Not the Stream):01/12/11 19:39
>>115
あ、"$filename"とくくらないと減点だな。
118ジーコ:01/12/20 14:42
awkで1のようなテキストを2のような形に整形したいんですが、どうすれば
いいんでしょうか。


name, age, youso1 youso2 youso3, addr

2
name, age, youso1, youso1 youso2 youso3, addr
name, age, youso2, youso1 youso2 youso3, addr
name, age, youso3, youso1 youso2 youso3, addr

基本はカンマセパレータで、要素nの中だけスペースセパレータになってます。
要はyouso1,2,3という風に切り出せれば問題ないんですが。
要素数は不定です。

よろしく。
119oi:01/12/20 15:08
これでどうよ。

split($3, data, " ");
n = asort(data)

for (m = 1; m <= n; m++ )
{
printf("%s\t", $0);
printf("%s\n", data[m]);
}
#!/usr/bin/awk -f
BEGIN{
FS = "[ \t]*,[ \t]*"
OFS = ", "
}
{
n = split($3, a, " ")
for(i=1; i<=n; i++)
print $1, $2, a[i], $3, $4
}
121名無しさん@お腹いっぱい。:01/12/23 03:17
bshでのファイル更新考えたんだけど合ってますか?

「:」区切りのテキスト「hoge」「fuga」のマッチング。
キーは先頭フィールド(V1、V3)で「hoge」がトランザクション、「fuga」がマスタです。

#! /bin/sh
IFS=:
while read V1 V2 do
 while read V3 V4 do
[ V1 -eq V3 ] && echo "V3:V2:V4" >>muni
done<fuga
mv muni hoge
done<hoge

リダイレクションとmvがうまくいくかな…。
自宅にUNIX無いから動かせないんです。
122121:01/12/23 03:20
間違えました。
mv muni fuga です。
マスタを更新して又参照したい感じ。
>>121
まず文法的にだめ。
セミコロンが抜けてる。
while read V1 V2 ; do
while read V3 V4 ; do

変数を参照するには $ をつける。
[ $V1 -eq $V3 ]

-eq は数値の比較だが、いいのか?

アルゴリズムでは、mv muni fuga はもうひとつ
ループの外じゃないとだめ(muni は $V1 = $V3
のエントリしか含まないので)。
124121:01/12/23 11:02
>>123
ご指摘どうもです。
セミコロンとダラー忘れてました。反省。

>アルゴリズムでは、mv muni fuga はもうひとつ
>ループの外じゃないとだめ

一致しなかった分を又fugaに戻さないと駄目って事ですか?
例えば「mv muni fuga」の代わりに「sort -mu -o fuga -k1n muni fuga」
なんてのは通用しますかね?
(思いつきで書いてるだけなので文法的に自信無しです)
125123:01/12/24 01:29
>>124
一致しなかった分を捨てるということは、fuga の一行目の
$V1 と値が違うものはすべて捨てられてしまうがいいのか?
マージして sort するのは意味的には正しいが、mv を外に
出すのと同じことだと思うが?
2行でいいから、fuga, hoge の例を出してくれた方が説明
しやすいんだが。
sed 's/Д/∀/g'で、どだ!
127121:01/12/24 12:32
>>125
hoge、fugaはこんな感じです。
トランザクションhoge → 「23:air:fly」
マスタfuga → 「23:air:champ」
更新されたマスタfuga → 「23:air:fly:champ」

トランザクションが複数になった場合、
又whileループで回すと思うんですが、
その際常に更新済み且つ不一致を含む
fugaを読ませたいなあと。

hoge1とfugaでマッチング
→ 中間ファイルmuniとfugaでマージ
→ hoge2とfugaでマッチング

こんな感じでやらせたいです。
128125:01/12/27 04:48
>>127
なるほど、やりたいことがだいたいわかった。

> トランザクションhoge → 「23:air:fly」
> マスタfuga → 「23:air:champ」
> 更新されたマスタfuga → 「23:air:fly:champ」

「23:air:fly」 を IFS=: にして read V1 V2 で読むと、
$V1 => 23, $V2 => air:fly になる(あまりがすべて V2
に入れられるため)。同様に $V3 => 23, $V4 => air.champ
なので、結局更新後は「23:air:fly:air:champ」になる。
ここさえ、なんとかすれば sort & merge でうまくいくん
じゃないの?
129名無しさん@お腹いっぱい。:02/01/02 01:31
パイプの入口のコマンドの終了コードを取得する方法ってありますか?
make | tee log
のmakeが成功した時だけ別のコマンドを実行したいのですが。
Bシェルを使ってます。
130名無しさん@お腹いっぱい。:02/01/02 09:45
access.logは下記のようなもの。$1はエポックタイム(1970/1/1 00:00:00からの経過秒数)で$3はアクセスした端末のIP。

1009379443.542 20 192.168.16.17 TCP_HIT/200 1694 GET http://www.al4a.com/images/911.gif - NONE/- image/gif
1009379443.604 24 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif
1009379444.170 11683 192.168.16.17 TCP_REFRESH_HIT/200 59687 GET http://www.al4a.com/links.html - DIRECT/www.al4a.com text/html
1009379446.523 2979 192.168.16.17 TCP_HIT/000 11027 GET http://www.al4a.com/images/al4av2.jpg - NONE/- -
1009379446.526 1472 192.168.16.17 TCP_MISS/000 0 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com -
1009379447.026 63 192.168.16.17 TCP_HIT/200 15976 GET http://www.al4a.com/banners/gf1.gif - NONE/- image/gif
1009379447.364 16 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif
1009379448.331 967 192.168.16.17 TCP_MISS/200 9626 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com image/gif
1009379449.997 1504 192.168.16.17 TCP_HIT/200 20456 GET http://www.pornleo.com/banner/pussy10-29.gif - NONE/- image/gif
1009379450.256 3056 192.168.16.17 TCP_HIT/200 15679 GET http://www.al4a.com/images/al4av2.jpg - NONE/- image/jpeg
1009379453.262 148 192.168.16.17 TCP_HIT/200 7049 GET http://www.al4a.com/banners/fc1.jpg - NONE/- image/jpeg
1009379453.301 38 192.168.16.17 TCP_HIT/200 9328 GET http://www.al4a.com/banners/am1.gif - NONE/- image/gif
1009379454.056 1963 192.168.16.17 TCP_HIT/200 21921 GET http://al4a.free6.com/free6.gif - NONE/- image/gif

これを集計して

date time user数
----------------------
2001/12/28 00:00 0
2001/12/28 00:30 0
2001/12/28 01:00 5
2001/12/28 01:30 6

のようにしたいのです。awkファイルは3つあり、それをshellに記述して一括処理しようとしています。
131名無しさん@お腹いっぱい。:02/01/02 09:47
130の続きです

#syukei.sh
#!/bin/sh
./syukei1.awk access.log|./syukei2.awk|./syukei3.awk > file

#syukei1.awk
#!/bin/gawk -f
{
hour=strftime("%H",$1);minute=strftime("%M",$1);second=strftime("%S",$1)
base=$1-(hour*3600+minute*60+second)
for(i=1;i<=48;i++){
if((base+1800*(i-1) <= $1) && ($1 < base+1800*i)){
print strftime("%Y/%m/%d %H:%M",base+1800*(i-1)),$3,1
}
}
}

#syukei2.awk
#!/bin/gawk -f

{
sum[$2,$3] += $4
}

END {
for(item in sum){
split(item, t, SUBSEP );
printf("%s %s %s %d\n",$1,t[1],t[2],sum[item]);
}
}

#suykei3.awk
#!/bin/gawk -f
{
if(length($2) > 0){
kazu[$2] ++;
}
}

END{
for(i in kazu){
print $1,i,kazu[i]
}
}
132名無しさん@お腹いっぱい。:02/01/02 09:48
131の続きです。

といった感じです。syukei1.awkで
2001/12/28 00:00 192.168.1.2 1
2001/12/28 00:00 192.168.1.1 1(とりあえずエポックタイムを現在時刻に変換し、秒の項はprintしない。あとはIPaddressを取る)
のように加工します。(最後の1は捏造したもの。後々この数をカウントするので)
syukei2.awkで↑の$4を集計。
2001/12/28 00:00 192.168.1.2 5
2001/12/28 00:00 192.168.1.1 6

2001/12/28 00:30 192.168.1.1 2
2001/12/28 00:30 192.168.1.2 4
のように加工します。(userごとに30分刻みで何回アクセスしたか)
最後にsyukei3.awkで↑の$3を集計。
2001/12/28 00:00 2
2001/12/28 00:30 3
のようにdate time user数という形で出力したいんです。
ただ、ここで今問題になっているのが、例えば2001/12/28 01:00〜2001/12/28 01:30の間に一度もアクセスがなかった場合、
その行が表示されません。アクセスがない場合は2001/12/28 01:00 0 0のように表示したいのですが、
どのようにすればいいでしょうか。また、3つファイルがあるんですが、これを一まとめにすることって可能なんでしょうか。
長くなりましたが、ご教授宜しくお願いします。
133:02/01/02 11:57
マルチポスト
http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=2396
他にもあるかも。
>129
$ (true && echo catched)|tee foo
catched
$ (false && echo catched)|tee foo
$
135129:02/01/02 21:59
すみません、そうではなくて、
make a | tee foo
の結果、make a が成功したら、
make b
を実行したいのでが、make a は必ず実行したいのです。
make a | tee foo
として、終了コードをみると、
パイプの後の tee foo の終了コードになるので、必ず真になってしまい、
次の make b を実行するかどうかの判定ができないのです。
make a | tee foo のmake a が成功したときだけ、
make b を実行することってできませんでしょうか?
よろしくおねがいします。
mkfifo pipe
tee foo < pipe &
( make a > pipe ) && make b
rm -f pipe

でどうよ。
137134:02/01/02 23:15
>135 >134でどこがあかんの?
$ (make a && make b)|tee foo
make aのみteeに出したいんだったらmake bを/dev/nullに捨てればよし。
138129:02/01/03 00:02
>>137
あ、気づきませんでした。
make a とmake b の出力を画面に表示しながら、
それぞれ a.log, b.log に落したかったんですが、
(make a && make b | tee b.log 1>&2) | tee a.log
で思い通りにいきました。
ありがとうございました。
>>136
mkfifo なんてコマンドがあるんですね、知りませんでした。
また一つ勉強になりました。
139名無しさん@お腹いっぱい。:02/01/09 23:03
勉強中age
140名無しさん@お腹いっぱい。:02/02/04 23:28
system("ls -lrt | nawk '{ print $5, $6 }'")

のように、awkの中のsystemの処理で、さらにawkを使うにはどうしたら
いいのでしょうか?上のやり方ですと、どうもシングルクオーテーション
のところでひっかかってしまうのです。
nawk でも gawk でも mawk でも問題なく動いてるぞ。
oawk(Solarisの/usr/bin/awk)ではダメだったけど。

でも system() の返り値が欲しいのでなければこうするのが吉かと。

cmd = "ls -lrt"
while(cmd | getline > 0) print $5, $6
close(cmd)
142名無しさん@お腹いっぱい。:02/03/10 18:40
age
143名無しさん@お腹いっぱい。:02/03/10 19:42
Kシェルの最初に、
#!/bin/kshのコードが、
ほとんどのシェルで記述しているんですが、
どんな意味何でしょうか?
参考書を見ても載ってないんです。
>>143
インタプリタを指定してるのです。そこが #!/bin/bashなら、
そのスクリプトはbashの動作をします。というか、bashがその
スクリプトを解釈し、実行します。 #!/usrbin/perlなら
perlが解釈するわけね。
145名無しさん@お腹いっぱい。:02/03/15 00:38
tput を使用したサンプルスクリプトを探しています。
簡単なエディタくらい作れませんかねぇ。

プログラミング板のシェルスクリプトスレ
http://pc.2ch.net/test/read.cgi/tech/1005026945/
146名無しさん@お腹いっぱい。:02/03/15 01:09
とりあえず、tput というか terminfo の情報を探してきます。

smso=`tput smso`
bold=`tput bold`
clear=`tput clear`
sgr0=`tput sgr0`

echo $clear
echo $smso reverse $sgr0
echo $bold bold $sgr0

http://www.google.co.jp/search?q=cache:tmzJitSQRcAC:homepage1.nifty.com/~tetsu/ruby/diary/0111.html+tput&hl=ja&lr=lang_ja&ie=Shift_JIS
147春なので:02/04/05 22:55
ユーザーや、新規ドメインやらを書かなければならない
新米スクリプターに捧ぐ

# addvirtual.awk

BEGIN {
FS = ","
}
{
print "echo '#'=====================domain "$1"===================== >> virtual.txt"
print "echo " "'<'VirtualHost 192.168.0.1'>' >> virtual.txt"
print "echo ServerAdmin omaemona'@hogehoge.mona' >> virtual.txt"
print "echo DocumentRoot /home/" $1 "/html >> virtual.txt"
print "echo ScriptAlias /cgi-bin/ /home/" $1 "/cgi-bin >> virtual.txt"
print "echo ServerName 'www.'" $1 " >> virtual.txt"
print "echo ErrorLog /home/" $1 "/log/error_log" " >> virtual.txt"
print "echo CustomLog /home/"$1"/log/access_log common " ">> virtual.txt"
print "echo '</'VirtualHost'>' >> virtual.txt"
print "echo ' ' >> htest.txt"
print "echo "$1" End!"
}

使い方は
root# awk -f addvirtual.awk domainlist.csv | /bin/sh
そうすると
virual.txtが生成される

間違いが無いようであれば Apacheのhttpd.confにマージさせて終り

漏れが厨房の頃に作ったスクリプトです
勝手に使いやすいように直してくれ

つーか、へたれでスマソ
148春なので(追加:02/04/05 22:58
domainlist.cvsは

hoge001.co.jp,0
hoge002.com,0
ahya.co.uk,0



のように  ドメイン名,なんでもいい   の形式であれば問題無いはず
>勝手に使いやすいように直してくれ

こんなんでどう?

#!/bin/sh
IFS=","
touch virual.txt
while read DOMAIN x
do cat<<EOF>>virtual.txt
#=====================domain $DOMAIN=====================
<VirtualHost 192.168.0.1>
ServerAdmin [email protected]
DocumentRoot /home/$DOMAIN/html
ScriptAlias /cgi-bin/ /home/$DOMAIN/cgi-bin
ServerName www.$DOMAIN
ErrorLog /home/$DOMAIN/log/error_log
CustomLog /home/$DOMAIN/log/access_log common
</VirtualHost>
EOF
done
150春なので(はや!:02/04/05 23:37
AwkをShell(bash)に変えたのですね
つーか、早いですー

やぱ、みなさんさすがですね
>>147
この辺読んだ方がいいんでないの?
http://httpd.apache.org/docs/vhosts/mass.html
152名無しさん@お腹いっぱい。:02/04/13 20:48
シェルスクリプト初心者者です。よろしくお願いします。
awk, sed, grep何を使っていいのやら困っています。
ご教示願います。

設問は以下の通りです。
下記のようなパターンが記述されているファイルから
例えば、TITLE行がABCと書かれているパターンを検索し、
TITLE行の前の行からEND行の次の行までを抜き出しなさい。

===============================================================
= TITLE : ABC
===============================================================
...
...
...
===============================================================
= END
===============================================================
===============================================================
= TITLE : DEF
===============================================================
...
...
...
===============================================================
= END
===============================================================
以降、TITLEが異なる同じようなパターンが続きます。。。
PATTERN=ABC
ed - file <<EOF
/^= TITLE : ${PATTERN}/-1;/^= END/+1 p
q
EOF
154名無しさん@お腹いっぱい。:02/04/13 22:11
152です。
>>153
ありがとうございます。
ed - file <<EOF と
/^= TITLE : ${PATTERN}/-1;/^= END/+1 p のpと
qがよくわかりません。
抜き出したものをファイルにかき出すにはこれでいいのですか?
よろしくお願いします。
155名無しさん@お腹いっぱい。:02/04/13 23:03
152です。
あと、
= TITLE : XXXABC
となっていても、ABCのパターンとしてぬき出したいのですが。。。
よろしくお願いします。
156名無しさん@お腹いっぱい。:02/04/13 23:05
もう楽しくてわっしょいわっしょい!
157名無しさん@お腹いっぱい。:02/04/17 23:32
154の件は理解できました。
158はろう:02/04/18 11:40
行単位で同じ言葉が二つ以上あるのを検索したいのですが、
どうやって検索すればいいですか?
>158 サンプルを提示してください。
160はろう:02/04/18 14:26
サンプル書きます。
abc abc def efg xyz・・・
abc def efg vwx xyz・・・
という複行があったとして
abcが二つ以上ある行だけ検索したい場合はどうしたらいいですか?
>>160
grep 'abc.*abc' か?
162はろう:02/04/18 15:47
ありがとうございます。
同じ言葉が3つ以上ある行を拾うにはどうしたらいいでしょうか?

012 345 678 901 123 345 456 345
012 678 012 890 012 678 890 234
これも161のコマンドでいけるんでしょうか
grep '\<\(..*\)\>.*\<\1\>.*\<\1\>'
>>162
> これも161のコマンドでいけるんでしょうか
おまえなんにもわかってねーのな。
163さんが不憫だね

てか「設問は以下のとおり」
とかって、もすかして宿題?

…… (ノ-_-)ノ~┻━┻
>>162
grep '012.*012'
この時期だと新人研修か?
168名無しさん@お腹いっぱい。:02/04/18 23:08
cat $(ls -tr /home/*.*) > output.txt
でOKだったけど、
PATH=/home/*.*
cat $(ls -tr $PATH) > output.txt
とか
`cat $(ls -tr ${PATH}) > output.txt`
と書いたらNGだった。
どう書けばいいですか?
169名無しさん@お腹いっぱい。:02/04/18 23:57
>>46
遅レスだが、
>stty: : No such device or address
csh のスクリプトなら -f を指定すればなおるはず。
Solaris のマニュアル(エラーメッセージ一覧)に載ってなかった?
170名無しさん@お腹いっぱい。:02/04/19 01:05
awkでquoted-printableエンコードとか、URLエンコードとかってできますか?
>168 どうNGだったのですか。
>>168
何をしたいの?
173sage:02/04/19 09:26
>>168
(1) PATHはsh系のシェルではコマンドパスを指定する環境変数
だから、これを書き換えたらcatもlsもフルパスで指定しないと
動かない。
(2) PATH=/home/*.* を実行した段階で *.* が展開されてしま
うので、はじめのコマンドと同じにはならない。展開してほし
くないのなら PATH="/home/*.*" などとする。
>>170
やった事はないが可能だと思われ
175Solarisど素人:02/04/20 23:32
a.txt b.txt c.txt の3つのtxtファイルを順々にみるスクリプト(sh)を
作りたいのですが、どうすればいいのでしょうか?

test -f a.txt && more a.txt
test -f b.txt && more b.txt
test -f c.txt && more c.txt
上のように単純に書いてしまうと a.txt b.txt c.txtが
まとめて表示されてしまいます。

a.txtを見終わったら、echoでhit any key to the next.とか表示させて
何かキーを叩いたらb.txtを見にいくような感じにしたいのです。
どなたか教えてください。よろしくお願いしますです。
>>175
more a.txt b.txt c.txt
177名無しさん@お腹いっぱい。:02/04/21 12:30
>>175,176
いずれかのファイルがない場合にエラーメッセージ出るのが
いやというのもあるのかな?
a.txt, b.txt, c.txt という場合なら,ファイル名展開をシェルに任せて,
more [abc].txt
とすればいいけど.
178雨なのね:02/04/21 15:06
>>175
test -f a.txt && more a.txt
echo "Hit any key to the next: \c"; read x
test -f b.txt && more b.txt
echo "Hit any key to the next: \c"; read x
test -f c.txt && more c.txt

BSD系のechoなら、echo -n "Hit any key to the next: "な。
179雨なのね:02/04/21 15:08
>>178
test -f b.txt && (echo "Hit any key to the next: \c"; read x) && more b.txt
の方がいいね。
>>178-179 "Hit any key to the next:"と表示しときながらリターンキーが必要な罠。
181雨なのね:02/04/21 15:41
>>180
おやまあ。
read xの代りに、bash -c 'read -n 1 x'かな。
182Solarisど素人:02/04/21 18:53
たくさんのレスどうもありがとうございます。

単純にmore [abc].txtだと a.txtとb.txtとc.txtが区切り無く
繋がって表示されませんでしたっけ?
あと、キー入力待ちとか、そんな処理の仕方を是非知りたかった
から今回の質門をさせていただきました。

bash -c 'read -n 1 x' てことはbashのスクリプトみたいですけど、
とても参考になりました。
雨なのねさん、ほんとうに感謝してます。明日試してみます。
>>181 強引
trap "stty $t `stty -g`;trap 2" 2
stty intr " " -echo
echo "Hit space to the next:"
read a
184名無しさん@お腹いっぱい。:02/04/21 22:10
>>182
[abc].txt の展開は,シェルがやるので,別々に指定するのとまったくおなじ.
展開機能を持たないシェル(そんなのないと思うが)から実行したらmoreは自力で
展開しない限り,[abc].txtってファイルを探しにいくよ.
185名無しさん@お腹いっぱい。:02/04/22 20:54
質問です。
perlでいうtaint(#!/usr/local/bin/perl -T)みたいなものは
Bourneシェルにありませんか?
>>185 そんなもの無い。
187名無しさん@お腹いっぱい。:02/04/24 00:28
Solaris の sh で,
$ usage
使用法: 見つかりません
となりますが,どうしてですか.なんとかしてください.助けてください.
>>187
どうなって欲しいんだ?
189187:02/04/24 00:39
>>188
わからない?気づいてくれよ.マジ話だし.
>>189
マジ話なのはわかるけどどうなって欲しいのかはさぱーり見当が付かない。
191187:02/04/24 00:56
>>190
usage: 見つかりません
と出て欲しいのに,なぜかコマンド名が日本語になってること,です.
sh-2.04$ usage() { 使用法; return; }
sh-2.04$ usage
sh: 使用法: command not found

ちとちがうな。
sh-2.04$ usage() { echo "usage: 見つかりません"; return; }
sh-2.04$ usage
usage: 見つかりません

これでどーだ! (w
>>191
ホントだ。Solaris の sh ってばステキ。藁

$ LANG=ja
$ 'not found'
見つかりません。: 見つかりません。
195194:02/04/24 11:05
ということで Solaris スレで尋ねるべし。
196名無しさん@お腹いっぱい。:02/04/28 02:41
こんなのをBourneシェルで作れる人いますか。
あるアドレスをユーザが入力してそれが正しいドメイン名かをif文などでY/Nしたい。
サブドメインは許すとして入力したアドレスが*.nifty.comならYES、違えばNOと
なるシェルができますか?
>>196 shのビルトインコマンドだけでという事か?
198名無しさん@お腹いっぱい。:02/04/28 18:35
>>197 ビルドインコマンドってなんだ?
$ man sh | less +/'builtin command'
>>196
> こんなのをBourneシェルで作れる人いますか。
いるよ。
201名無しさん@お腹いっぱい。:02/05/02 11:52
awk,sed初心者です。教えてください。

例えば

Japan,Tokyo
America,Washington
Korea,Soul
Taiwan,Taipei
の、ように国名と首都をコンマを挟んで並べたとします。これを
首都の部分だけ抜き取って違うファイルにリダイレクトする場合、awk
sedでは、どうやって行えば良いのでしょうか。
>>201
先頭からカンマまでを削るだけだろ?
そのくらい自分で調べろ。
sed -e 's/.*,//'
awk -F, '{print $2}'
204名無しさん@お腹いっぱい。:02/05/02 12:10
すいません。私の説明不足でした。
最終的には
Japan,Tokyo,Taro
America,Washington,John
Korea,Soul,Sam
Taiwan,Taipei,Lee
のように、横3つ、4つ以上のデータをコンマで区切り、必要に応じて
欲しいデータの部分を指定して、それを取り出すんです。けして二番目の
データだけではないのです。

スペースで区切ってあればawkで"$番号"で指定出来るのでは分かるのですが、
コンマの場合はどうやって対処すればいいのか分かりません。是非ご教授お願いします。
>>203
甘やかすなよ。
>>204
cut じゃだめ?
207名無しさん@お腹いっぱい。:02/05/02 12:26
>>204
203が書いていてくれてるじゃない。
”awk -F,”って。
208名無しさん@お腹いっぱい。:02/05/02 12:28
>>203

ありがとうございます。出来ました。感謝します。

>>205
お前殺すまってろ 自宅近辺で一人であるくなよ。顔ぶっ壊して
ポリ袋で湖にしずめる。

209ばーか:02/05/02 12:59
実力が自尊心に永遠に追いつかないカスの常套句(プ
   ↓
1)初心者です。
2)ご教授お願いします。
3)お前殺すまってろ
 ┌─────────┐
 │ きのふれたかたが. |
 │ います。        |
 └―――──――――┘
      ヽ(´ー`)ノ
         (  へ)
          く
>お前殺すまってろ 
こんな書きこみが見れるのは2ちゃんねるだけ!
212名無しさん@お腹いっぱい。:02/05/02 13:07
>>208
205は悪くない。
確かに調べればすぐわかる事だからね。
>>208
待っててもいいけど、
awk の使い方すら調べられないやつが
おれの自宅を調べられるとは思えん。
>>205
こういう奴を導く義理も無いんだから、数行で済むなら正答与えてお引取り願うのが吉。
>>214
禿しく同意
以後、逆ギレ質問者は放置という事で

216教えて!AWK:02/05/15 18:29
02/05/01,aaaaaaa
02/05/02,bbbbbbb
02/05/03,ccccccc
02/05/04,ddddddd
のようなCSVファイルから($1は日付)
たとえば02/05/02〜02/05/03以外の行を標準出力に出力する方法あれば教えてください。
できればパターンの範囲指定(日付範囲)で1行でできればよいのですが
宜しくお願いします。
>>216
gawk -F ',' '$1<"02/05/02"||$1>"02/05/03"' hoge.txt
>>216
物凄く強引な気がするがこんなんどう?

awk -F"[/,]" '! ( 2 <= $3 && $3 <= 3 ) {print $0}' csvfile
>>217
なぜ -F ',' なんて書くんだ? -F, でいいだろ。
220教えて!AWK:02/05/16 18:25
>>217
できました、ありがとうございました。
ちなみにgawkはawkと同じなのですか?
>>218
強引すぎまっせ、でもありがとう。
>>220
同じ環境もあるし、違う環境もある。
-hとか--versionとかで確認すれ。
222名無しさん@お腹いっぱい。:02/05/21 23:11
awkのパターンのところに変数を使用したいです。
$ HOGE=88
$ awk '/$HOGE/{ print }' datafile
のようなことがしたいですが、パターンのところは変数は用いることが
できないのでしょうか?

上記例は
$ grep $HOGE datafile
とやればよいですが、ただの例です。パターンのところにシェル変数を
使用する方法はありませんか?
223222:02/05/21 23:14
$ awk '/'$HOGE'/{ print }' datafile
ってやったら出来た。ごめん。
awk -v hoge=$HOGE 'hoge{print}'
225名無しさん@お腹いっぱい。:02/05/27 01:13
>219
>なぜ -F ',' なんて書くんだ? -F, でいいだろ。
あー。確かにね。
でも、自分も-F ',' って書いてます。
何か「これを区切りにしまーす」って明示しているように見える。
(自分の中でのイメージの話でですけど)
226名無しさん@お腹いっぱい。:02/05/27 12:48
DQNな質問ですまそ。

キーボード入力でcshはdir = $<だけど、これの/bin/sh版
だとどーやるの?

おしえれくれ。
read dir
228Solarisど素人:02/05/27 22:22
>>183さん
どうもありがとございました。
活用させてもらってるです。
超遅レスなんでみてるかどうかわかりませんが・・・
229名無しさん@お腹いっぱい。:02/05/28 15:19
tcshからzshに移ろうかな、と思ってるんだけど、どうかな?
>>229
ええんでない?
でも、zsh を使い始めたら、tcsh 使えなくなる両刃の剣…。
231名無しさん@お腹いっぱい。:02/06/02 07:40
HTMLファイルからIPアドレスのみを摘出する方法教えて下さい。
正規表現でIPアドレスを
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
こう書くのはなんとか思い付くのですが、それからが分かりません。

よろしくお願いします。
232名無しさん@お腹いっぱい:02/06/02 14:19
>>231
その正規表現にマッチした部分文字列のみが欲しいって
ことでしょ? grepだと行全体が得られてしまうからダメなん
だよね確か。(便利なシェルスクリプト見せろやゴルァ スレ
を読んだ限りでは、こう受け取れる)。
PerlやRubyでなら、そういった機能(というか特殊変数。
$&とか$1〜$9とか。直線の正規表現マッチに該当した
部分文字列を示す)を使ったことはあるけど、シェルやawkでは
どうだったかな。
ちょい自信ない。
>>232
> その正規表現にマッチした部分文字列のみが欲しいって
> ことでしょ? grepだと行全体が得られてしまうからダメなん
> だよね確か。

そうです。
具体的にはルーターのIPアドレスが変わったのを監視したいので
そのページをファイルに落し、IPアドレスを摘出したいのです。

この方法が難しいとなるとPerlのNet::Telnet;を利用すると
出来そうなのですが。
234名無しさん@お腹いっぱい:02/06/02 14:26
>>231
とりあえずIPが書かれてるファイルってことで/etc/hostsで実験した。
perl -e 'while(<>){if(~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){print "$1\n";}}' /etc/hosts

ただ、これだとIPアドレスとしてあり得ない文字列(999.999.999.999など)も拾っちゃうよ?
いいの?。
235231:02/06/02 14:30
>>234
> ただ、これだとIPアドレスとしてあり得ない文字列(999.999.999.999など)も拾っちゃうよ?

数字はIPアドレス以外はないので大丈夫です。
236231:02/06/02 14:37
perl -e 'while(<>){if(~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){print "$1\n";}}'
だと、一行に複数のIPアドレスがある場合、最初のIPアドレスしか拾いませんね。
がんばつてみまふ。
>>236
あ、確かにその通りだ。一回しか拾わない。
同一行複数回マッチを考えると、俺はone linerだと
どうしたらいいかちょっとわからない。スクリプト化
してもいいんちゃう?
awk,shellからは完全に離れてしまうから、また別の
スレor板に行ったほうがいいかも。
というかもうここまでくれば、できたも同然だって気もする。
>数字はIPアドレス以外はないので大丈夫です。

ついでにピリオドもこれ以外に出現しないなら、
tr -cd '0-9. \t\n'
なんつー大ざっぱな方法が使えるかもしれず。
>>236
perl -ne 's/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/print"$1\n"/ge'
だとどーよ?
240231:02/06/03 13:02
>>239
兄さんすごいっす。
ちゃんと拾えました。
241231:02/06/03 13:26
これで、IPアドレスの履歴ファイルを作る事は出来ました。
次は、IPアドレスが前回と違うのかを検知する仕組を考えなければ。

逝ってきまふ。
242名無しさん@お腹いっぱい:02/06/03 20:42
>>239
おみごと! 優雅な解決ですねえ。
>>238
それならawkでもええやん
gawk 'BEGIN{RS="[^0-9.]"}NF!=0' ip.txt
>>243
awkだったらそんなテキトーなものじゃなくて、
% gawk --re-interval 'BEGIN{RS="[0-9]{1,3}(\\.[0-9]{1,3}){3}"} {print RT}'
でちゃんと拾えますが。
245243:02/06/03 23:17
>>244
だな。gawkなら--re-interval使えるし。
246初心者@べんきょうちゅう:02/06/10 04:53
http://www.tsden.org/takamiti/shText/shText020.html
> シェルは標準入力・標準出力・標準エラー出力の 3つのファイルをオープン
> しており、それらはファイルディスクリプタ「0 .. 3」 として管理して
> います。ですから「>&1」はファイルディスクリプタ「2」を 「1」に、
> つまり標準エラー出力を標準出力に変更することになります。

これって「O . 2」の間違いのような気がするんですが、
違いますでしょうか。
そだね。
248231:02/06/11 00:33
一行目と二行目が同じかどうかを判定するのを難航しています。
それぞれ別のファイルに出力してdiffですかね〜。

「入門Unixシェルプログラミング」買って勉強中。
saved_IFS="$IFS" IFS=
{ read first; read second; } < input
IFS="$saved_IFS"
if [ x"$first" = x"$second" ]; then
echo same
else
echo diff
fi
awk、CSVファイル扱うのに重宝してるんだが、今回のCSVは1000フィールド/レコードのため容量オーバー(うちのawkは200フィールド以上は読めない)。Perlはインストールされてないし、Cでやるしかないんだろうか。あ〜気が重い。
>250
splitして喰わせろ。
すとりっぷあーげー。
253名無しさん@お腹いっぱい。:02/07/03 20:58
http://www.geocities.co.jp/Hollywood-Screen/9038/

http://jbbs.shitaraba.com/news/446/himajin.html


絶対!!!!!上のURLには来ないように!!お前ら来るなボケ!
254名無しさん@お腹いっぱい。:02/07/04 11:23
すいません、おしえてください。

スペースを含む名前のディレクトリに対して
(各々のディレクトリにはmboxというファイルが入ってます)
% ls
2002 04     2002 05     2002 06

↓の操作をしたいのです。
#!/usr/bin/tcsh
foreach f(*/*)
mv $f/mbox $f/mbox.orig
end

ところが、わがtcshは
mv 2002\ 04/mbox  2002\ 04/mbox.orig
ではなく
mv 2002 04/mbox  2002 04/mbox.orig
と解釈するので、引数が多すぎるエラーが出ます。

なんかうまい手はないでしょうか。
>>254
#!/bin/sh
for i in "$@";do
 mv "$i/mbox" "$i/mbox.orig"
done
256254:02/07/04 13:48
>>255
なるほどー → できました!!
(ちゃんとsh使います)
ありがとうございます!
257名無しさん@お腹いっぱい。:02/07/18 23:30
すみません・・・。どなたか教えてください。

cshを使って自動でtelnetログインして、いくつかコマンド
を入力して終了するようなバッチを作成しようとしているのですが、
以下のような形でパイプでつなぐとopenはするのですが
usernameを入力するところまでいかないで必ずコネクションが
切れてしまいます。

(echo open 192.168.0.1 ; echo username ; echo passwd ) | telnet

telnet> Trying 192.168.0.1...
Connected to 192.168.0.1.
Escape character is '^]'.
Connection closed by foreign host. ← ★ここでコネクションが切れてしまう。


どのような組み方をすればうまくいくのでしょうか?
なぜコネクションが切られるのかを考えてみませう
>258
すみません・・・。わかりません。
>>259
echo telnet sleep でググルへ GO!
261名無しさん@お腹いっぱい。:02/07/19 01:05
>259
netcatを使え
262名無しさん@お腹いっぱい。:02/07/19 01:36
kshでgoto文は使えますか?ご教授よろしく。
使えません。
264名無しさん@お腹いっぱい。:02/07/19 14:10
grep \$ file

とした場合に file内の全ての列がコールバックされるのはなぜですか?
>>264
それだとシェルに対するエスケープにしかならないから。
ファイル中の"$〜"をひっかけたかったら'\$'とでもしる。
266名無しさん@お腹いっぱい。:02/07/19 14:38
> 265
「シェルに対するエスケープ」とは具体的にどういうことでしょうか。
良く理解できないのですが。
シェルのマニュアルも見てみたのですが。
grepが起動した時にargv[1]に"$"とだけ入っているということ。
grepにとって'$'は行末メタ文字でしょ。
>>266
grep \$ file

grep '$' file
と同じってこと

$はgrep にも shell にとっても特別な文字なので
$そのものをマッチさせたい場合は2重にエスケープしなきゃならん。
なんで
grep '\$' file または
grep \\$ file
としなきゃならない
269名無しさん@お腹いっぱい。:02/07/19 14:50
正規表現で使われる $ になっているということですね。
煩わせました。
ありがとうございます。
270265:02/07/19 15:21
解決したと思ったら解決していませんでした。

grep \$
はシェルの解釈を終えた時点で'$'として解釈され

grep \\$

は'\$'となり、

grep \\\$

とした場合、シェルの方で\\$としてgrepの方に渡し、
grep '\\$' とおなじ結果になるような気がするのですが
そのようになりません。
つまり、grep '\\$'とgrep \\\$の結果はまったくちがうものになって
しまうということです。
grep '\\$'のパターンをマッチさせることすらできません ...
何度も申し訳ありませんがレクチャー願います
>>270
echo $
echo \$
echo \\$
echo \\\$
してみれ。
272名無しさん@お腹いっぱい。:02/07/19 17:19
環境変数とシェル変数の違いというのがあまりよくわかりません。
自分が知っているのは、環境変数は引き継がれるという事と、
exportされたシェル変数は環境変数になるという事ぐらいです。

自分がシェルスクリプトを書く時に、この2つをどう使い分けるの
かがわかりません。簡単な例で説明してもらえないでしょうか?
例をあげるまでもなく君の理解がそのまま答えで、他に
影響を及ぼす必要があれば環境変数を使う。そうでなければ、
シェル変数。

ちなみに、両者の区別が陽に存在するのは csh系だけで、
他にはそんな区別はない。
>>272
Bシェル系なら、
export されたシェル変数のことを環境変数と呼ぶ、
export されると子プロセスに引き継がれる、
だけじゃないかな。
つまり、>>272 の理解で十分。

違ったっけ?
違わない
272は違いについてではなく使い分けについて聞いてるよ。

スクリプトローカルで使うものはシェル変数。
子プロセスでも使いたければ環境変数とかかナー。

俺は子プロセスが自作の場合は引数でやる方が多いけど。
.profile とかでシェル変数を使うと .profile の後も引き継がれてしまうよね。
俺は unset するのも面倒なのでそのままにしてるけどみんなどうしてる?
とくに気にしてない。というかあまり.profileで変数を使ってないというか。
279名無しさん@お腹いっぱい。:02/07/21 15:59
シェルスクリプトで、引数を変数で扱う時、
第1引数→$1
すべての引数→$*
最後の引数→$$
ですが、引数の数が固定されてない時に
変数
$2,$3,$4,...$$
をまとめて扱いたいのですが、
どのように書けばよいでしょうか?
%cat grep-n-less
#!/bin/sh
egrep -n3 $1 $2 |less -p$1

これだど、ファイルが一つだけだし、
egrep -n3 $1 $* |less -p$1
だとパターンまでファイル名となってしまいます。

>>279
arg="$1"
shift
egrep -n3 "$arg" "$@" | less -p"$arg"
281279:02/07/21 16:10
できました。
有難うございました。
282名無しさん@お腹いっぱい。:02/07/21 16:12
>>279
> 最後の引数→$$
それはプロセスID
284名無しさん@お腹いっぱい。:02/07/23 06:05
こんなシェルスクリプトがあったとします。
今は hoge が存在したら file exit. と表示されます。

if test -f hoge
then
echo "file exit."
else
touch hoge
fi

これを、hoge が存在したら hoge.1 hoge.1が存在したら
hoge.2というように 数字を付けて重ならないように
touchしたいのですが、どうすればいいのでしょうか?
if test -f hoge
then

test -f hoge.3 && mv hoge.3 hoge.4
test -f hoge.2 && mv hoge.2 hoge.3
test -f hoge.1 && mv hoge.1 hoge.2
mv hoge hoge.1

else
touch hoge
fi
286284:02/07/23 07:44
>>285
うーむ。そう来ましたか。
ちょっと違うような。
それだと、元のファイルを数字を増してmoveしていますが
新しく作るファイル名の数字を増せたらなと思っています。
287動かしてないからね:02/07/23 07:54
ls -1 hoge* > /dev/null
if [ $? -ne 0 ]; then
  touch hoge
else
  a=`ls -1 hoge* | tail -1 | cut -d '.' -f 2`
  if [ "$a" == "" ]; then
    a=1
  else
    a=`expr $a + 1`
  fi
  touch "hoge."$a
fi
288もも:02/07/23 09:06
>>287
すばらしいです。恐れいりました。
>>287
俺も動かしてないけど、10を超えた時の挙動があやしい気がする。
290これは動かした:02/07/23 10:15
>>289
yes

要件次第だけど、とりあえず安易に逃げとく。
filename=`echo $a | awk '{printf("hoge.%03d", $1+1);}'`
291俺はバカか:02/07/23 10:15
違う、そうじゃねーや。
292やっぱり馬鹿だ:02/07/23 10:19
まぁ、動かないけどそんな感じで(死
293やっと動かせた:02/07/23 10:22
あ、動いてるわ(SunOS5.7)
何やってんだろ、俺。

鬱だ、早退しよう。
>>287
#! /bin/sh
f=`ls hoge hoge.* 2>/dev/null | sort -t. +1n | tail -1`
case "$f" in
"") f=hoge;;
hoge) f=hoge.1;;
hoge.*) f=`expr $f : 'hoge.\(.*\)'`; f=hoge.`expr $f + 1`;;
esac
touch $f
ちょっと目先を変えて、こんなのはどうでしょう。>>284以降

#!/bin/sh
[ ! -f hoge ] && touch hoge && exit
c=`ls hoge*`
c2=`echo "$c" | wc -l`
echo 1000 | awk '{for(i=1;i<$1;i++){print i;}}' | \
while read count ; do
[ $c2 -ne `(echo "$c" ; echo hoge.$count) | sort | uniq | wc -l` ] && touch hoge.$count && exit
done

なんとなく、1000で止まるようにしてますけど。
`expr $f + 1` みたいなのは、POSIXシェル使ってるんだったら arithmetic
expression $((EXP)) 使えばいいと思うんだけど、やっぱ後方互換の問題?
以下のようにまとめたいと思うのですが、
for,awk,ifを使うまでは思いついたものの
その先が全然浮びません・・・。
A B C D E
01 hoge1 025 hoge2 076
02 hoge1 026 hoge2 077
03 hoge1 027 hoge2 078



0025 hoge1 0076 hoge2
0027 0078
298284:02/07/24 04:12
みなさん凄すぎです。
参考にさせてもらいます。
299284:02/07/24 05:23
>>294,295
これを、hogeではなくて、`date +%y%m%d`の時は、
そのまま置換するだけでは駄目ですよね?
どうすればいいのでしょう?
>>299
そろそろ「何故駄目だと思ったか」そちらの手と頭の内を見せてよ。
君は雛鳥と違って可愛いくないんだから、口を開けてるだけじゃ飽きられちゃうzo
301284:02/07/24 11:46
なぜ駄目かと思ったかは、簡単に置換して

#! /bin/sh
f=`ls `date +%m%d` `date +%m%d`.* 2>/dev/null | sort -t. +1n | tail -1`
case "$f" in
"") f=`date +%m%d`;;
`date +%m%d`) f=`date +%m%d`.1;;
`date +%m%d`.*) f=`expr $f : '`date +%m%d`.\(.*\)'`; f=`date +%m%d`.`expr $f + 1`;;
esac
touch $f

実行してみたのですが
+%m%ddate: not found
と出たからです。どこかの`date +%m%ddate`が
正しく解釈されなかったのですよね。

あーん。
sh -x
>>297
ごめん、オレ日本語弱いから何を質問してるのかわからん
>>301
sh -xv scriptfile
とでもして、どこで止まってるか調べなさい。
あと`date +%m%d`を全てに使うのは、
見栄えもメンテナンスも悪くなるんで、
today=`date +%m%d`
てな具合に変数にでも代入しときなさい。


見栄え云々の前に、動いてる途中で日付が変わったらマズーな気が。
306名無しさん@お腹いっぱい。:02/07/24 20:18
>>297
まとめるルールがよくわからんのでアドバイス不可
まとめて /dev/null へ
リダイレクト(sh)で質問です。
ftpやtelnetを自動で接続切断を行いたい場合、シェルの<<を使うことでそれが可能になりますか?

想像1:
ftp << open hogehoge.com hogeuser hogepass get hoge.txt END

こんな感じで 全ての入力をまえもって引数の様に使えたらいいのになぁ。

想像2:
ftp << text

textの中身
open hogehoge.com
userhoge
userpass
get hoge.txt
END

とかでもいいんですけど。結局wgetがあるんですが、こんなことが色々と他につかえたら便利じゃない!
できますが何か。

$ ftp << END
open hogehoge.com
user hogeuser hogepass
get hoge.txt
END

$ ftp < text

試せば1分で答えがでると思われ。
ありがとう。
次逝って下さい。
>>308
wget と rsh/ssh でいいじゃん。
312308:02/07/26 15:24
>>311
wgetはhttpプロトコル上でしか無理じゃなかった?
(微妙に板ちがいかも…)
>>312
man wget すれ。
lftp とか ncftpget とかもあるし。
314age:02/07/30 19:43
% cat google-search
#!/bin/zsh

key1=$1
key2=$2

cnt=1
foreach i (`cat $key1`)
 foreach j (`cat $key2`)
  w3m -dump "http://www.google.com/search?hl=ja&meta=lr=lang_ja&num=10&q=$i+$j" |\
  grep "件中"
  (( cnt=$cnt+1 ))
  echo $cnt
 end
end

% cat town
博多
札幌
喜多方

% cat food
海鮮
美味い ラーメン
豊富 食材

% google-search town food
と実行したい。
でも、上の
`cat $key1`
ではスペースで区切られ、$iに格納される
これを改行で区切られるようにするにはどうすればいいのでしょーか?
cat $key | ( while read i....
だとどう?
316age:02/07/30 20:04
>>315
それだと、一行に書けるキーワードの個数が固定されませんか?

IFS
>>316
↓みたいな感じの結果では不満?
> $ cat list
> foo
> bar baz
> hoge
> $ cat list | ( while read i; do echo "[$i]"; done )
> [foo]
> [bar baz]
> [hoge]

319316:02/07/31 00:44
出来ました。 while read のそのような使い方は知りませんでした。 出直してきます。
320親切な人:02/07/31 00:54

ヤフーオークションで、凄い人気商品、発見!!!

「 RX-2001 」がパワーアップした、
「 RX-2000V 」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA#.2ch.net/

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。

ヤフー ID の無い方は、下記のホームページから、
購入出来る様です↓
http://www.h4.dion.ne.jp/~gekiyasu/#.2ch.net/
321putsとprint:02/07/31 12:24
require 'net/http'

host = 'www.ruby-lang.org'
path = '/en/'

http = Net::HTTP.new(host)
page=http.get(path)[1].delete("\n")
pages= page.scan(%r|<div [^<]+>Ruby Versions.*?</div>|i)[0].gsub(%r|<.*?>|,'')
#puts pages
print pages


において
printだと表示が直ぐに消えるけど
puts だと STDOUTにちゃんと表示される。
これって仕様ですか?
322321:02/07/31 12:25
すれ違いでした。
323echoBACK:02/08/01 09:28
~/local/bin にスクリプトを置いてそれを実行した時に エコーバックするのがウザイので、 echo -n を実行しますが、 まだエコーします。 エコーバックしないための方法は一体何でしょう? googleで探してきます。 それでは。
324echoBACK :02/08/01 09:37
エコーバックではなく、
ggmg 2>&1 > /dev/null
などで、
ggmg 2>&1 > /dev/null &
とすると
% ggmmg &
[4] 13573
%
[4] done ggmmg
% ggmmg
とエコーしてくるのを止めさせたいのです。
バックグランドで動作させると
IOを制御できないのでしょうか?
Googleを使って、解決法を探してきます。
それでは。

325echoBACK:02/08/01 09:43
スクリプトの最後に、
2>& 1 > /dev/null &
をつけて、フツーにフォアで実行させると
求めていた結果を得ました。

解決できました。
以上。
2>&1 > /dev/null
この書き方だとstdoutを捨てて、
stderrだけ拾うことになるんだけど、それでいいのかな。
>>326
本当か?
>>327
326が書いてるのと違う動作をする場合はshellのバグだと思われ。
329名無しさん@お腹いっぱい。:02/08/08 00:54
xxx..sh DIR STR
という使用方法で、その$DIR内にあるファイルを全検索し
$STRという文字列が含まれてイナイ、ファイルのみを
表示するというシェルはどうやて作ればヨロシイノデスカ?
サブディレクトリも検索しちゃっていいのか?

DIR=$1
STR=$2
for i in `find $DIR -type f`; do
  grep $STR $i > /dev/null
  if [ $? -ne 0 ]; then
    echo $i
  fi
done
331名無しさん@お腹いっぱい。:02/08/08 01:11
>>329
シェルスクリプトぢゃなくてシェルを作るの?

…というお約束はさておき、findとgrep組み合わせて作ればヨロシイ
332559:02/08/08 01:17
grep -L "STR" -R DIR はどう?
>>332
GNU grep限定な罠
>>332
おまけに-rだという罠
>>334
> おまけに-rだという罠
--color=auto で色が変わらなかったら、バージョン上げてミソ。
gawk いつのまに /inet なんていう怪しい実装を?
凄いというかわけわからんというか
337awk>perl:02/08/12 00:40
あるディレクトリ内の全CSVファイルを走査し、

45行目の23列目の値を新ファイルの1行目に
45行目の27列目の値を新ファイルの2行目に
45行目の?列目の値を新ファイルの3行目に
45行目の?列目の値を新ファイルの4行目に
  ・
  ・
  ・
という作業をして、値を抽出した
レポートファイルを作りたいです。

エクセルに頼るのではなく、
シェルとawkでやりたい。
でも、ディレクトリのグロビング等が絡むと
perlでやった方がいいのでしょーか。


>>337
#!/usr/bin/awk -f
BEGIN{
FS=","
}
FNR==45{
a[23]=a[23] "," $23
a[27]=a[27] "," $27
...
}
END{
for(i in a) sub(/^,/, "", a[i])
print a[23]
print a[27]
...
}

% awk -f 上のスクリプト.awk *.csv
339名無しさん@お腹いっぱい。:02/08/14 15:28
つまるところ、パールよりも便利なawkの機能って何なのでしょう。
>>339
場合によっちゃperlよりも短く書ける。one linerの時に多い。
んで、もちろん、短いのは重要。
341名無しさん@お腹いっぱい。:02/08/15 02:55
最近、パールにもwhitespace区切りのフィールドを 自動分割するオプションの存在を知り、awkの存在価値を 全く見失ってしまった。awkの$1,$2,$3だけがperlよりも唯一の優位点だと思っていたのに。
便利な機能ってわけじゃないんだけど, 私はパタン・アクション型の
構文が新鮮に感じたなあ. 今でもこの構文ですんなり書ける処理のときは
awk がいいと思ってる. 逆に BEGIN, END に書くこといっぱいとか, 2, 3 の
ファイルを同時に読み込んでなんか処理するとかの場合には perl, ruby で
いいと思う.
343名無しさん@お腹いっぱい。:02/08/15 04:00
awkの良い点は、枯れていること。
うちの会社のUNIXにはPerlが入っていない。
したがって必然的にawk。
345名無しさん@お腹いっぱい。:02/08/15 13:08
Solaris8にバンドルされたbashだと、

$ for (( i=0; i<$MAX; i++ )); do echo hoge; done

のようなループが使えないんだが、これは bash のバージョンが旧いから?
ちなみに、

$ bash --version
GNU bash, version 2.03.0(1)-release (sparc-sun-solaris)

バージョン問題であれば、機能追加の履歴が分かるようなURL等きぼんぬ
リリースノート
347345:02/08/15 13:45
事故解決しますた
別マシンのRedHat7.3で/usr/share/doc/bash-2.05a/CHANGES 見ると、2.04で追加されたもよう
…でもWebでは見つからんかった

This document details the changes between this version, bash-2.04-devel, and the previous version, bash-2.03-release.
(中略)
3. New Features in Bash
(中略)
g. There is a new ksh-93 style arithmetic for command:
for ((expr1 ; expr2; expr3 )); do list; done
$echo "0 0 0"|mawk '{s=$0;gsub(/^\ */,"",s);print s}'
000

$echo "0 0 0"|gawk '{s=$0;gsub(/^\ */,"",s);print s}'
0 0 0
>>343
でも環境によって動作が結構異なる罠。
>>349
そうなの?
351名無しさん@お腹いっぱい。:02/08/15 17:22
bash について質問
条件判定で [ ](内部コマンド)と [[ ]](複合文?)とがあるのだが、これってできることに差はあるの?
[[ ]] では &&や|| が使えるってあるけど、[ ] でも -a や -o があるし、! も同じように使えるし…。

if [ -e file1 -a -e file2 ]; then echo "両方あるね"; fi
if [[ -e file1 && -e file2 ]]; then echo "両方あるね"; fi

どっちかでないと不可能な処理があるなら、誰か教えてくれ!
>>350
昔shとawkだけでネットワーク越しにいろいろやるシステムを作ったことがあ
るけど、結構苦労した覚えがある。shももちろん凄く違うし。perl入れちゃダ
メっつーか、システム標準の奴だけでなんとかしろっつーし。
そう。実はawkの実装は結構ばらつきがある。うちのは1行に含まれるフィールド数が200以内というしょぼい制限がある。
だから納品するシステムには組み込むのは怖い。
354名無しさん@お腹いっぱい。:02/08/19 00:06
>353
その制限って、どっか調べれば分かるんでしょうか?
実際試してみるしかないの?
実装上の差は man (or info) で調べるか source を追うか・・
356名無しさん@お腹いっぱい。:02/08/20 09:29
>>352
shの互換性は、割と古めの文だったら大丈夫なのでは。
コマンド置換は当然 $(command) は使えず `command` ね。
あと、計算式はほとんど使えず、`expr` を使用するとか。
test コマンド ([) の解釈が違ったりしたら確かに問題。

遅くなりますが、外部コマンドで逃げるしかないのかもね。
たとえば何処がまずかったか教えてくだされ。
シェルプログラミングは読みやすさと速さをとるか、移植性を取るかで悩む部分も多いです。
>>356
基本方針としてはだいたいそんな感じ。*最小*公約数だけ使う(藁

根本的な問題は、共通して使えるshだけじゃ記述能力が低すぎたってこと。だ
からawkとかにせざるを得ないんだけど、微妙に違うし。さらに、単一ファイ
ルにしてそれをコピーするだけで使えるようにしたいとか、面倒なこというし。

あと``の中のクォートのエスケープは必ずつけるってのはあったな。

あらためて思い出そうとすると、もう10年くらい前のことなんでほとんど忘れ
ちまってることに気づいた。スマソ。
shって互換性なかったんかい・・・。
ていうか、俺の作ってるの単純すぎて互換性の問題起きてない。
ウツだ・・・
359名無しさん@お腹いっぱい。:02/08/20 21:18
貝殻とか書いてある方のスレで既に書いちゃったけど,
sh で printf 使って16進を文字に直したかったんだ.
でも,某所の sh はそれに対応して無かったのよ.なんで?そんな時代があったの?
>>359
なるほど、今のshはprintfなんて使えるのか・・・
使えないと思って、printf使うときはわざわざawk使ってたよ。
>>360
うんにゃ。「shでは」使えない。
bashならbuiltinだが、たいていは/usr/bin/printfを使うことになるし、
これも存在しないOSもある。互換性を重視するなら使っちゃダメ。
echo -n "hoge"
したら「-nなんか知らねえよ」と言われてΣ(゚д゚lll)ガーン
しょうがないから
/bin/echo -n "hoge"
したけどやっぱり「-nなんか知らねえよ」と言われてΣ(´Д`;)ズガーン

とりあえず/usr/bin/printfで逃げますた。
>>362
/usr/ucb/echo かな?
あるいは、/usr/bin/echo "hoge\c" とか。
364名無しさん@お腹いっぱい。:02/08/21 10:38
>>357
>単一ファイルにしてそれをコピーするだけで使えるようにしたいとか
変数設定共通ファイルでも読み込まない限り、無理だと思われ。
それともコピー後 ./configure --os=solaris8 でもするか(w

awk の微妙な違いに関しては分からないですが、
printfコマンドなんてあるとは知りませんでした。

>>358
でもそれが一番。

若かりしころ、メーカから来たスクリプトの例が csh だったときはちょっとウトゥだった...
csh スクリプトを書きました...
365359:02/08/21 12:43
あっ,私の書いた printf は /usr/bin/printf のつもりです.

ちょっと頭が固くなって,「perl ばっか使われやがって.sh でも頑張れば出来るはず.」
と cgi を書いていましたが,sh はそういうものに使うのではないことを思い知らされました.
適材適所ってヤシなんですね.

今度こういうスレに「sh で cgi を...」と来たら,「perl あるんだろ?ヴォケ.」と
返してあげるのがいいのでしょうか?それともわざわざ挑戦する価値はありますか?
>>365
> わざわざ挑戦する価値はありますか?
ない。一般的には。

頭の体操にはなるから、趣味で楽しみたければ、アリ。
shell script 用の configure が出来る日も近いかもしれない(w
>>353

Solaris の old awk (/bin/awk) ?
/bin/nawk なら…どうだろ
369354:02/08/22 02:19
>355
manにありました。ありがとうございます。
・フィールド定義可能個数:199個まで
・引数設定可能ファイル数:100個まで
でした。
370353@今日も出勤:02/08/24 21:45
>>354

おれはメーカーのサポートに電話してる。
いちいち確認しとる暇ないし、sed、pasteなど他のコマンドにも実はいろいろ制限あるから(pasteコマンドで一度に引数に取れるファイルは12個までとか)、そういうのをまとめて聞いておくといい。
371354:02/08/27 00:10
>>370
>おれはメーカーのサポートに電話してる。
なるほど...。確かにそうですね。”制限事項チェック一覧表”を
作っておいてメーカさんに聞いた方が早そうですね。
レス、サンクスです。お仕事頑張って下さい。
372名無しさん@お腹いっぱい。:02/08/29 21:25
ファイル名(ファイルの中身じゃなくて)をEUCに変換するコマンドってないかな。全角ファイル名がsjisでバケラッタしてる。
mv filename `echo filename | nkf -e`
>>373
化けてるファイル名でそれをやるのはチト辛い。ファイル名
展開をシェルに任せちまえば、それですむ話だけど。
例:
for f in *
do
mv $f `echo $f | nkf -e`
done
375372:02/08/30 01:11
374を試してみるよ。
>>374
ファイル名に空白文字が混ざってたらどーすんの?
377名無しさん@お腹いっぱい。:02/08/30 09:32
$fを""で囲ったらダメなのか?
オークの死体
379372:02/08/31 00:47
そもそもnkfが入ってなかった。爆死。
38013:02/08/31 01:02
              r''''' ー-、,,
              ヽ、r-、  ヽ、,
                ヽ、、`ヽ、 ヽ/^ヽ
                 ヽ,,ヽ ,,,) く/ r ヽ
        ,,. -──‐- 、,,   `ヽ 、,,,`く/ _)
       /       r、 `ヽ、   `>  `ノ
      /   //i_,∠ ヽ. 、 ヽ  /  /
     ./   r' '"、,,!/    ヽ|ヽi, ゙i /  /
      .!    ! 二ニ>   ,,二 !. !/  ,/
     i   !   ,,__   "<, | |  /
    .!.   |   /   ゙゙̄''''i.   i | ./
    i   i  .i      i   ノ .レ'
     i i   iヽ,, !,     /  ィ'  .i  じつはラウンジクラシック
 ─-┴┤ .ト''"`''`ー-┬"イ i   .i      がなくなりそうなんですけど
      !i、. i `ヽ,,, ,,r"'i  レ  , i  助けてください
 ──-i,. i ヽi,.       i  i/./!/
     iノ  i      i  レ'
     |    ゙゙゙゙゙゙゙̄ ̄  i
     i           i
     |          i
     i            i
     |            i
    /            i
   /          {
  ,/               i
  /             
>>378
食べたら病気になってしまいますた
382名無しさん@お腹いっぱい。:02/08/31 08:32
COLUMN=3
cat log | awk '{total += $'$COLUMN'} END {print total}'

とすると awk で log の中の 3カラム目の和を求められますが
差を求めるにはどうすればいいのでしょうか?
>>382
> 差を求めるにはどうすればいいのでしょうか?
意味がわからん。
1 1 1
2 2 2
3 3 3
みたいなのがあったとして、欲しい答えは?
384382:02/08/31 09:06
>>383

3カラム目 の 1 - 2 - 3 = -4

必ず 2行しかなくて、1行目 > 2行目 です。
385382:02/08/31 10:18
なんか変な質問だったのでしょうか。

df した結果を今日と昨日のを並べて

/dev/ad0s2f 6048 3960 1604 71% /usr
/dev/ad0s2f 6048 3959 1604 71% /usr

3カラム目を引き算したら、何 MB 増加したか調べられると思ったのですが。
>>385
必ず2行しかないならこんな感じで。

awk -v CLM=3 -v flg=1 '{total+=$CLM*flg;flg*=-1}END{print total}' log

-v で変数を指定しているけど、BEGINセクションでも可。
>>385
俺はフラグも使わねーしif文も嫌いだし、>>384のように
動作させたいんじゃーという場合には

awk -v CLM=3 '{total+=((1-(NR>1)*2))*$CLM}END{print total}' log

手もとのgawk 3.1.0で確認。
388382:02/08/31 11:11
>>386,387
ありがとうございます。
どちらでも、結果が出ました。
>>385
いろいろ手はあると思うが・・・
# 面倒なので $3 ベタ書きにした

# example 1
NR == 1 { total = $3}
NR != 1 { total -= $3}

# example 2
NR != 1 { $3 = -$3}
{ total += $3}

# example 3
{ total += NR==1 ? $3 : -$3}


見ての通り、やってることはほとんど同じだ (w
example 2 だと 382 の script に NR!==1{$3=-$3} を追加するだけでいいし。
ただ、計算の意図を考えるなら example 1 がお勧め。
390382:02/08/31 11:40
ありがトン。
質問には具体例が必要だと感じた土曜の午前だった。

ついでに質問。
ディスクの使用率などを数字じゃなくて AAの グラフ
(こんな感じ?)

.... ..... ..... ..*.. .....

で表示しているのを見かける気がするのですが
どんな手法を使っているのでしょうか?

df の結果の パーセントの数字を 変数にして
for 文でくりかえさせる?
ワケワカラン。
>>390
shellやawkでの実装方法の質問?
それともAAグラフ作成のアルゴリズムの質問?

後者なら大体考え方は合っている。
前者ならどの処理系でどこまではわかるがどこからがわからないか明確にしる。
392名無しさん@お腹いっぱい。:02/09/06 11:43
sh なんすけど、なんでこれって結果違うんすか?

$ echo zzz | read AAA
$ echo $AAA

$ echo zzz >testfile
$ read AAA <testfile
$ echo $AAA
zzz
同じでしたが。

$ echo zzz | read AAA
$ echo $AAA
zzz
$ echo zzz > /tmp/testfile
$ read AAA < /tmp/testfile
$ echo $AAA
zzz
$
うちは同じだが。
%
sh -c 'echo zzz|read AAA;echo $AAA'
zzz
ぬ、変な所に改行が
% sh -c 'echo zzz|read AAA;echo $AAA'
zzz
改行?
zsh?
うちはbash.>>392と同じ現象になった。
399392:02/09/06 13:01
どうもです。
$ echo zzz | { read AAA; echo $AAA; }
zzz
の方向で行くことにします。

ログインシェルが bash なのがいかんのかな……。
echo zzz|read AAA
だと、readがカレントプロセスで実行されるとは限らん。
何をしたいのかよく分からんが、
AAA=`echo zzz`
echo $AAA
ではいかんのか。
401392:02/09/07 06:54
>>400
ほんとは read AAA じゃなくて read AAA BBB CCC とか
やりたいんす。
こりゃ awk 使った方がラクだったかな。
awk よくわかんねーんだよな……。
>>401 そうそう.バージョン間の違いが大きいような気がして.
shell script なら最低限何をやれば安心かがわかるんだけど,
awk はどうしたらいいのかしらん.「hoge準拠」とかが一発で分かるお返事キボン.
awkは AAA BBB CCC を取得するのは簡単だけど
それを使って何をしたいかによって楽か面倒かが変わる。

取得して何をしたいのか書かないと説明出来んぞ。

>>392
>>400
bash でやるなら

read AAA <<_END_
$( echo zzz )
_END_
echo $AAA

であれば、カレントプロセスのシェルで変数処理がされるけど…。
405名無しさん@お腹いっぱい。:02/09/09 12:21
連ちゃんでageてすみません。
bash補完スレからこのスレに
誘導された者です。

bashのパターン照合について
複数のパターンで文字列を抽出
する方法ありましたらご指南お願いします。
(もっとも一旦変数に格納し、分ければ
いいのですが、可能ならばその方法を知りたいです。)

例えば、
$data="/export/user1/test-20020909.log"
で20020909の文字を抽出する場合、一度に
${${data##/*-}%.*}
の様にしたいのですが、
bad substitution
とエラーが出てしまいます。
>401
$ set `echo AAA BBB CCC`
$ echo $1 $2 $3
AAA BBB CCC

じゃだめかい?
407404:02/09/09 19:49
>>406
$ set `echo AAA BBB CCC DDD`
$ echo $3
CCC

$ read A B C <<_END_
> $( echo AAA BBB CCC DDD )
> _END_
$ echo $C
CCC DDD

つーことで、最後の要素の扱いで微妙な違いが出るけど、結局 401 はどうしたいんだろ?それによるよな。
>>405
${変数名%パターン} ってな使い方になるから、入れ子は無理だろうね。
どうしても、っていうんであれば、

shopt -s extglob
data=/export/user1/test-20020909.log
echo ${data//@(*-|.*)/}

が使えるけど、文字列の先頭/末尾にマッチする場合とかのパターン指定ができなさそうだから、状況によってはマズそう。

素直に中間の変数を使った方が良いのでわ?
>>408
ありがとうございます。
そうですね。あまり一度ににやると、
かえって読みづらくなりますしね。

出来ないということが分かっただけでも
勉強になりました。
>409
シェルによっては出来るのもあるよ。
移植性を考えるなら
data=/export/user1/test-20020909.log
expr $data : '.*-\(.*\)\..*'
かな。
411名無しさん@お腹いっぱい。:02/09/14 07:59
複数の *.zip を展開できるシェルスクリプトってどうやるのでしょうか?
こんなんでは駄目でした。

#!/bin/sh

unzip `find . -name "*.zip"`
% find . -name "*.zip" -exec unzip \{} \;
ありがとう。
正規表現初心者の俺。

DOS でやる *.zip と シェルスクリプトで使う *.zip は
似て非なるものだと知った。
DOS の "." は拡張子の区切のだけど、シェルスクリプトの "." は正規表現の
「 改行以外の全ての文字にマッチする記号」だと。
>>414 シェルのは DOS のに近いんじゃ。。。
>>414
shell の glob と regex をごっちゃにしてないか...?

 DOSのwildcard ≠ glob ≠ regex

だよ。shell script (glob) の . はあくまでピリオドだよ。
>>414
それはgrepとかsedとかawkとかperlとか(あといろいろ)だろ?
シェルでは"."はただの"."でしょ。任意の一文字は?だし。
% sh
$ echo .
.
$ echo .*
.vimrc .cshrc .netrc あといろいろ
ところで.swpって誰が作ったファイルなんだろ。
>>417
vim を起動して、ちゃんと終了させなかった人
419417:02/09/21 00:11
>>418
あんがと。
420名無しさん@お腹いっぱい。:02/09/22 23:30
>>374
ファイル名に空白があるとダメです。いや、前は出来ていたようなんですが。。。
ダブルクォートを付けても付けなくても、

mv: 複数のファイルを移動させる時は、最後の引数はディレクトリでなければなりません

と言われてしまいます。どうしたらいいのでしょう?
emacs の dired でも操作できない。。。何か別のものが異常なのか。。。
>>420
mv "$f" "`echo \"\$f\" | nkf -e`"
今更だが、スレタイについて。

「オーク」って書かれると違和感あるな。awkはawkだろ。
rootを「ルート」って書くやついるけど、あれも気持ち悪い。
>>422
別にどうでもいいじゃん。全然関係ない
>「オーク」って書かれると違和感あるな。
まぁねーw。トロルとか出てきそうではある。
425名無しさん@お腹いっぱい。:02/09/23 09:13
>>421
それでも、

mv: cannot move `\000\111 \222\333.avi' to a subdirectory of itself, `ほ げ.avi'

になってしまいます。よく解らないのですが、
「`ほ げ.avi' は、`./ほ げ.avi/ほ げ.avi' には移動できない」
というメッセージでしょうか?
426名無しさん@お腹いっぱい。:02/09/23 12:19
>>417
rm -r .*
427名無しさん@お腹いっぱい。:02/09/23 23:29
HP-UXで教えてください
シェルスクリプトに|で標準入力した場合その文字列って$1に入りますか?
入力文字列はsyslogから1行をgrepして渡したいのです
>>427
syslogからgrepした1行を、パイプでつなげた次のコマンドの引数に
したいのかな? xargsを使うのはだめなの?

例) hostsファイルから検索されたIPアドレスに向けてpingを実行(
pingの引数として、grepの結果を使用)
grep '127\.0\.0\.1' /etc/hosts | xargs ping
>>424
おれはシェルもちと違和感ありまするぞ。
430名無しさん@お腹いっぱい。:02/09/24 03:06
★★★★★  モーニング娘。のマル秘画像を狼で大公開中!  ★★★★★
http://tv2.2ch.net/test/read.cgi/morningcoffee/1032791785/

このスレッドに、次の内容で書き込みます。
メール欄:IDとパスワードを入力します。
      ID:musume
      パスワード:gekiyaba
IDとパスワードは、それぞれ半角小文字で記入し、半角スペースで区切ってください。
本文には、あなたが見たい画像を示す文字列を記入します。
 飯田:iidakaori 安倍:abenatsumi 保田:yasudakei
 矢口:yaguchimari 後藤:gotomaki 石川:ishikawarika
 吉澤:yoshizawahitomi 辻:tsujinozomi 加護:kagoai
 高橋:takahashiai 紺野:konnoasami 小川:ogawamakoto
 新垣:niigakirisa

たとえば、石川の画像が見たい場合は、本文にishikawarikaとだけ記入します。
この文字列も、半角小文字で入力してください。
スペースなどの余分な文字を入れると、見ることはできません。
なお、名前欄は名無しのままで結構です。

さあ、今すぐ狼へGO!
あんな姿やこんな姿をした娘。たちが、あなたを待っています!!
いまだに・・・。
>>430 中澤さんは?
あるディレクトリに
dummy_01.cvs 〜 dummy_10.cvs まで
10枚のファイルがあります。
dummy_01.cvs 〜 dummy_10.cvs の1列目〜4列目(それを1〜9行目まで)
を加算してその合計結果をresult_11.cvs というファイルに入れたいのですが、
BEGIN{
FS=" ,"
}
for(FNR=0,FNR<9,FNR++) {
for(line in FNR){
for (i=0,i<4,i++){ line[i]=line[i] "," $i }
}
}
END{
for(i in line) sub(/^,/, "", line[i])
#ココで、配列の要素ごとに和をとっていく
}
最後のENDで一つのファイルから得た配列をそれぞれ加算したいのですが
書き方が判りませんでした。
全然理解してないかもしれませんが、マチガイを指摘していただけませんんでしょうか?
$ cat >sum.awk
BEGIN {
FS=","
sum = 0
}
{ if (NR <= 9) {
sum = sum + $1 + $2 + $3 + $4
}
}
END {
printf("%s", sum)
}
$ for i in dummy_??.csv
do
awk -f sum $i >>unko
echo -n '+' >>unko
done
$ echo 0 >>unko
$ bc < unko
>>433
ネタにマジレスかも知れないけど、おいちゃんは、s/cvs/csv/ のような気がするなぁ。
436433 :02/10/02 15:16
>>435
確かにマチガイですね。

>>434
質問の仕方が下手でした。
dummy_01.csv 〜 dummy_10.csvファイルの
それぞれの1〜9行目、1列目〜4列目
を個々に加算して
result_11.cvs ファイルの1〜9行目、1列目〜4列目
に和を挿入するという意味合いでした。すみません。
串刺し、といったイメージでファイルを横断して
加算を取るということです。この部分だけは
最初excelでやっていたのですが、他の計算がUnix上で行っているため
この串刺し計算の部分もUnix上で出来ない方と思って、質問しました。

BEGIN {
 OFS=FS=","
}
{
 for (i=1;i<=4;i++)
  sum[FNR,i]+=$i
}
END {
 for (r=1;r<=9;r++)
  print sum[r,1],sum[r,2],sum[r,3],sum[r,4]
}
>>437
行数が巨大そうなら
FNR<10 {...}
とするか
FNR==9 { nextfile }
を END パターンの前に入れたほうがいいと思われ。

メモリが有り余ってるなら富豪でGo!
439433:02/10/02 20:19
>>437
$ bc < unko
のようにするためには、
END {
 for (r=1;r<=9;r++)
  print sum[r,1],sum[r,2],sum[r,3],sum[r,4]
}
とした場合、後が続かないことはないですか?
もう少し勉強してみますが、
結局、9×4 を縦の36行に展開して、
sed -e 's/$/+/' でフィルターする
ってのを繰り返すしか方法はありませんか?
>>439
437 氏は result_11.csv を作成しただけでは?

合計も 1 度に出すなら END の部分を
END {
out_file = "result_11.csv";
for (r=1;r<=9;r++) {
for (k=1;k<=4;k++) {
s += sum[r,k];
}
print sum[r,1],sum[r,2],sum[r,3],sum[r,4] > out_file;
}
close(out_file);
print s;
}
とでもすれば?

http://cclub.cc.tut.ac.jp/~mikami/m4.html
にある Cruniq.sedというスクリプトに使われている、
:loop
$q
N
s/^\n$//
t loop
P
D
というコマンドのうち、連続空白行でない行をどうやって保護しているのでしょうか?
Dで消去しているように思えるのですが……
>>441
Pでパターンスペース内の最初の改行までを表示した後で、
Dでパターンスペース内の最初の改行までを削除してるから。

でもややこしい事してるね。連続した空白行を1行の空白にしたいなら
/^$/{
N
/^\n$/D
}
でいけるのに。
つーか、この場合は sed を使うよりも、divert() あたりを使って
m4 の出力に余計な空行が入らないようにした方がいいのでは。
444999:02/10/12 15:58
亀レス
115を試してます。
$ cat hoge.txt
aaaa
bbbb
cccc

$ filename=hoge.txt
$ i=0; (while read x; do i=`expr $i + 1`; done) < $filename; echo "$i $filename"

としても、
0 hoge.txt
としかなりません。
何故?
do〜done の間がサブシェルになってしまうからでは?
(while でリダイレクトするとありがち)
446392:02/10/12 16:24
>>444
> $ filename=hoge.txt
> $ i=0; (while read x; do i=`expr $i + 1`; done) < $filename; echo "$i $filename"

まず、
 i=0
で $i が 0 になるな。

次に、
 (while read x; do i=`expr $i + 1`; done)
で $i をいじってもそれは ( ) の中の話なんで、
$i は変わらんな。

最後の
 echo "$i $filename"
の時点で $i は 0 で
$filename は最初からいじってないので hoge.txt のままなので、
echo では「0 hoge.txt」が出力されるな。

で、何がやりたいの?
しつもんです

awkのワンライナーで
1 1 1 1
2 2 2 2
3 3 4 4

a1 b1 c1
a2 b2 c2
a3 b3 c3

なんてできますか?

それぞれの列はタブで区切られています。
4はどこへいったのれすか
449名無しさん@お腹いっぱい。:02/10/25 19:50
>>447

4がなくていいんなら

awk -F "\t" '{ print "a" $1, "b" $1, "c" $1}'

だけでいけそうな気が…。
すみませんでした。
以下のようなコードを出力するワンライナーでした
コード1:
1 1 1 1
2 2 2 2
3 3 3 3

コード2:
a1 b1 c1
a2 b2 c2
a3 b3 c3
451449:02/10/26 00:22
>>450

それでも上のだけでいけないか?
四列(行?)あるのがいまいちわからん。
出力は三列だし…。

1 2 3
a b c
l m n



1 a l
2 b m
3 c n

とかにするってんならまだわかるが。
そだね。>>447はまず「何をしたいのか」をはっきりさせましょう。
ログファイルの解析をしています。プログラムの
デバッグ用ログです。
1行目と2行目、3行目と4行目、というふうに、
奇数行と偶数行をペアにして、入れ換えたいのですが。
(例)
aaaaa
bbbbb
ccccc
ddddd
eeeee

bbbbb
aaaaa
ddddd
ccccc
eeeee

環境としてはsh,awk,sed,ex,grep,perlが使用できます。


447はこういう事がしたいのかな、と推測してみる
% echo a b c|awk '{for(i=1;i<=3;++i)print $1i,$2i,$3i}'

>>453
こんなのはどう?
% cat sample.sed
$p
N
s/(.*)n(.*)/2
1/

% sed -f sample.sed logfile
455474:02/10/26 01:53
454さん、有難うございました!!!
なるほどです。
それから、他のスレでも聞いたのですが、レスなかったので
ここでもカキコしていいですか?
zshを使えば簡単なのですが、
foreach i ({01..20});echo {A-J}$i;end
A1 B1 C1 D1 E1 F1 G1 H1 I1 J1
A2 B2 C2 D2 E2 F2 G2 H2 I2 J2
    ・
    ・
A11 B11 C11 D11 E11 F11 G11 H11 I11 J11
A12 B12 C12 D12 E12 F12 G12 H12 I12 J12
A13 B13 C13 D13 E13 F13 G13 H13 I13 J13
のような出力を
 |xargs -n 10 printf "〜\n"
 |while read a b c d 〜 j;do 〜;done
などを駆使して、printfコマンドに渡して、
右詰で表示させれますか?
foreach i ({1..20});echo {A-J}$i;endの出力みたいに綺麗に表示
したいのです。

すみません。どうか解決できないでしょうか?
456474:02/10/26 01:58
すみませんでした。上の
foreach i ({01..20});echo {A-J}$i;end
foreach i ({1..20});echo {A-J}$i;end
は順番を入れ替えて読んで下さい。
foreach i ({1..20});echo {A-J}$i;end
だとインデントずれるのが嫌なのです。
printf "%2d\n" 1
1
質問していいですか?

コマンド履歴ファイルに現在いる位置を留めたくて、以下のように
定義すると、コマンド名が履歴に記録されます。

$ima(){echo $(pwd)}
$ima
/home/aho/somewhere
$history
37504 ima(){echo $(pwd)}
37505 ima

このimaの部分を/home/aho/somewhere
に置き換える方法はありますか?

【どこで作業したか?】を履歴に残しておきたくて、いろいろ試している
最中に↑の問題に行き着きました。
空白だけの行ばっかりのahokaから
空白だけの行を削除するのは

$ sed /^[ ]*$/ ahoka

じゃ、駄目みたいですね。perlみたいに\sが使えない時、
どうすればいいのでしょうか?

>>459
sed '/^[ ]*$/d' ahoka
>>454
なんか、文字消えてません?バックスラッシュですよね?

 でも、sedって意外なところで、バックスラッシュ必要ですねー

()にバックスラッシュが必要なのはいまだ謎
462名無しさん@お腹いっぱい。:02/10/27 02:06
untilコマンドをwhileコマンドに置き換えるのはどうしたらいいんですか?
sed 4.0が出たようだね。
Gnu の奴ね。
465名無しさん@お腹いっぱい。:02/10/27 04:16
複数のファイル名を同時に変えるシェルスクリプトを教えて
ください。
test1.cgi.bak -> test1.cgi
test2.cgi.bak -> test2.cgi
以下、同
kekka1.txt.bak
kekka2.txt.bak
とかのファイルもあるのでワイルドカードだけではできない
ので、どうしようかと。100くらいあるもんですから困ってます。

zmv '(*).cgi.bak' '$1.cgi'
>>465
for f in *.bak; do mv $f $(basename $f .bak); done
468462:02/10/27 16:59
よーするに、while で終了コードが0以外のときに、
繰り返しがしたいのですが。。。
while ! false; do echo '>>468 まさかこれのことか?';done
470462:02/10/27 17:24
>>469
while command
do
command
done



while ! fales command
do
command
done

でいいんですか?
>>465
ls -1 | awk '{ print "mv",$1,$1 }' | sed 's/\.bak$//' | sh

僕はこんな感じ
awk,sed,shの連携がすき
cost的にはどーかな?
>>470
while ! command
do
command
done
473471:02/10/27 17:36
メリットは
% ls -1
確認して、tcshで^p
% ls -1 | awk '{ print "mv",$1,$1 }'
確認して、tcshで^p
% ls -1 | awk '{ print "mv",$1,$1 }' | sed 's/\.bak$//'
確認して、tcsh^p
% ls -1 | awk '{ print "mv",$1,$1 }' | sed 's/\.bak$//' | sh
で最後に実行みたいなことで、結果を確認しながら
自然にpipeを伸ばせるから。

ループ一発書きはちょっと怖い時に・・・

474462:02/10/27 17:43
>>472
あんがと
475 :02/10/27 17:53
ファイルのタイムスタンプを
バックアップするファイル名に付加したいんだけど
いい方法あります?
例えば
 maillog.2(02年10/13のもの) →バックアップ→maillog02_10_13

lsコマンドでタイムスタンプを取り出すぐらいしか
思いつかない。
>>475
ls -lT /usr/local/bin | sed '1d' | awk '{ print "mv",$10,$10$9"-"$6"-"$7 }' | sh
ls の -T がミソ
6ヶ月前のファイルに影響するから
月がメリケン表示がやだったら、awkでちょっと連想配列書いて
対応かな?
sedの部分はawkでハジいたほうがいいかも・・・
477475:02/10/27 18:25
>>476
そのまま実行すると
"オプションには引数が必要です -- T"
と出ますが未熟者ですんません。
>>477
lsはOSによってオプションが大幅に違う可能性大です(当方NetBSD)
Linux(GNU ls)だったら
ls -lT

ls -l --full-time
に変更しないとだめかも(JMにて確認しただけなんで、ちょっと自信なし)
あとawkの引数も調整する必要ありかも

でも、よーはするに、awkにls -l形式のファイルリストを渡して
変形するだけなんでポイントだけつかめば、pipeの開始点は
柔軟に対応することが大切です

479475:02/10/27 18:54
>>478
あーすいません。当方Redhat Linuxです。
やぱり--full-timeであれこれしないとダメなんすね。
教えていただいたコマンドを調整して
なんとかやってみます!ありがとうございました。
480名無しさん@お腹いっぱい。:02/10/27 19:00
オークはやめてほしい。awkです。
作った人たちの名前を尊重してよ。
オークは語るまい
old_directory にあるファイルに対し、recursive に nkf を適用したい
のですが、やり方が分かりません。

以下のようなスクリプトを組んでみました。find で $old_dir のファイル
を相対パスで抜き出して、nkf -e で EUC に変換、$new_dir へ移動という
つもりなのですが、nkf の対象にディレクトリも入ってしまい、上手く行き
ません。

--------------------------

#! /bin/sh

old_dir=/tmp/old_directory
new_dir=/tmp/new_directory

cd $old_dir

for i in `find`
  do
    nkf -e $i > $new_dir/$i
  done

--------------------------

old_directory の中味
% ls -aF old_directory
bar/ baz* foo

file か directory かを判別するにはどうしたら良いのでしょうか?
どうぞご教示下さい。
man find
484遅レスですが・・・:02/10/27 20:16
>>433
cvsなら
echo "1,2,3" | sed 's/,/+/g' | bc
もある

縦に足すなら
| awk '{i+=$1} END { print i }'
なんてのもいいかも

参考になるかな?
完全にディレクトリツリーをコピーするなら、new_dirのほうで
ディレクトリを作成しないとだめ。

cd $old_dir
for i in `find .`
do
if [ -d $old_dir/$i ]
then
mkdir $new_dir/$i
elif [ -f $old_dir/$i ]
then
nkf -e $old_dir/$i > $new_dir/$i
else
echo "file type is anknown. $old_dir/$i"
fi
done

多分こんな感じかな
即興で作ったのでくどいscriptですけど・・・
参考までに
>>483
すみません。 `find -type f` ってありました。

isfile とか isdir とかいうコマンドが無いかなぁと考えて
いました。ディレクトリの再帰的に操作する場合には find
を使用するのが常套手段なのでしょうか?
>>485
どうもありがとうございます。test -d でディレクトリの判別が
出来るんですか。勉強になりました。
>>485
上手く行きました。本当にありがとうございます。
(1)
cd $old_dir
find . -type d | (cd $new_dir; xargs mkdir -p)
find . -type f | while read i; do nkf -e $i > $new_dir/$i; done

(2)
cd $old_dir
pax -rw . $new_dir
cd $new_dir
find . -type f | xargs qkc -e
>>489
ディレクトリ構造を写し取るにはやっぱり、pax(or tar)は強力。
使う機会があったら、やってみよ。

>>484

どうもありがとうございました。

492462:02/10/27 23:44
#!/bin/sh
while ! cat a
do
echo -n "Is cat performed later? ... [yes/no]"
read ANSER
case "$ANSER" in
[yY] | yes | YES | Yes)return 0;;
[nN] | no | NO | No)return 1;;
*) echo "Please entry y or n.";;
esac
done

こんなスクリプトを作ったのですが、yes no 以外 を入力したとき
メッセージが表示された後に
cat a が
実行されてしまいます、yes no 以外 を入力して cat a が実行されないように
するにはどうしたらいいんでしょうか?
493462:02/10/27 23:52
#!/bin/sh
while ! cat a
do
while :
do
echo -n "Is cat performed later? ... [yes/no]"
read ANSER
case "$ANSER" in
[yY] | yes | YES | Yes)return 0;;
[nN] | no | NO | No)return 1;;
*) echo "Please entry y or n.";;
esac
done
done

でいいみたいですね。すいません。
>>479
GNU dateなら

f=maillog
cp -p "$f" "$f"`date -r "$f" +%y_%m%_d`

lrwxrwxrwx 1 root root 4 12月 15 2001 /bin/sh -> bash*
-rwxr-xr-x 1 root root 519964 7月 9 2001 /bin/bash*


何故、shは.bashrcなどを読み込まないんですか?
同じものではないのかな?
>>495
man bash
497名無しはん@EMACS:02/10/28 11:52
>495
実体が同じでも呼び出す名前で動作が違う罠
% find examples/ -name "*many*pl"
examples/writemany.pl
の出力をcpやmvの第1引数に渡す方法ってないんですかねぇ。
>>473
のawk見たいなもので、やるしかないのですかね。



>498
GNU findutilsならそういうのがありそうだと思って探してみたら-iというのがあった。
でも結局equivalent to -execと書いてあってファイルひとつずつしか処理できないので
意味がなかった。

cpなら
find examples/ -name "*many*pl"|pax -rw destination/
mvならcpした後にxargs rm -r

とかでひとつ。
標準出力に"Oct 2 09:51:35 2003 GMT"と、出力したものを、
"YYYY/MM/DD hh:mm:ss +0900"に変換するかっこいい方法
ってありませんか?
dateコマンドとかうまく使ったら整形できないかな…
>>500
GNU の date なら。
"JST" になっちゃうけど。
date -d "Oct 2 09:51:35 2003 GMT" +"%Y/%m/%d %T %Z"
>GNU findutilsならそういうのがありそうだと思って探してみたら-iというのがあった。

Gnuの
*utils
をこの際だから、もっと勉強したいんですが、
Web上に、何かいいソースありませんか?
paste,cut,joinなんてのもいろいろ勉強する価値ありそうなので……



>>501
%z があった。

>>502
info じゃだめ?
>503
ああ、そいいや、infoまだ見てなかった。見ときます。


別の質問。
ちょっとした時に、
ttp://www.gnu.org/software/fileutils/doc/faq/core-utils-faq.html
とかから、コマンドの使い方の例をちょっと見たいなー、と思う時が
あるんだけど、

w3m -dump URL |awk 'パタン {式}'

みたいにして使い方の部分(インデントカラムとかで特定)を
抽出する時にはどういう方法が一般的ですかね?

いつも遠回りしてそうな気がするので。

>>504
完全ではないけど、こんなのはどうでせう。

% wget -q -O - http://www.gnu.org/software/fileutils/doc/faq/core-utils-faq.html | sed -n '/^<br><pre>/,/^<\/pre>$/p' | w3m -T text/html -dump
>>505
わざわざ有難うございました。お手数おかけしました。

以下、独り言です。

% grep -c 2002 aho
78
% csplit -f chap aho /2002/ {77}
みたいにしてファイル分割する時に、いっつも区切ったあとに
どこを区切ったのかを確かめるために欲しいコマンドがありまして、
標準入力→色づけ→標準出力
というコマンド、ご存知ですか?
ttp://www.geocities.co.jp/SiliconValley-Oakland/6833/memo/#hgrep
に赤く染めるgrepがあったので、これを参考にすれば直ぐ作れそうなんですが……

 #誰かが作っていてもよさげなツールなので、一応聞いてみました ^^;
507506:02/10/28 14:45
% cat aho | iroduke 2002

みたいなツールで、引数にしていしたパターンを色づけしてほしいのですが
いろいろ見ましたが、見当たりませんでした。

 #絶対、だれか作っているはずだ……
508500:02/10/28 14:53
>>501,503
ありがとうございます。
勉強になりました。
509506:02/10/28 14:55
良くわかりませんけど、
ttp://www.geocities.co.jp/SiliconValley-Oakland/6833/memo/#hgrep
参考にして、エスケープシーケンスつけようと思っていますが、
以下だとエラーになります……

% perl -pe 's{2002}{\033[41m$1\033[0m\}g;' aho

エスケープシーケンス詳しい方、原因わかりますか?



510506:02/10/28 15:00
独り言、ばっかりでごめんなさい。
% perl -pe 's{2002}{\033[41m2002\033[0m}g;' aho
でできました。もう少し考えてみます。
オークというとOakの綴りを連想してしまう。
リダイレクションで書き込んでいるファイルをリアルタイムで表示させる方法って
tee以外でありますか?
tail -f
514506:02/10/28 15:16
tail -f
515512:02/10/28 15:56
説明不足もいいとこでした……すんません。

Bシェルで組んだシェルの中で、ある実行結果をファイルにリダイレクションさせて
いるところがあるのですが、この部分を標準出力に表示させたいのです。
しかし、ある理由でteeが使えないのでどうすればいいのかわかりません。
どなたか教えていただけないでしょうか?
>>515
まだ説明不足だな。
スクリプトの断片だけでも出せない?

> Bシェルで組んだシェルの中で、
すごい表現だな。
517512:02/10/28 16:11
>>516
すごい表現……確かにそうかも……
日本語って難しい……


test.sh > tmp.txt

上記の処理はtest.shの結果をリダイレクションでファイルに書き込んでいます。
このままだと、画面には何も表示されず、ファイルに実行結果が書き込まれますよね?
この部分を、画面表示させながらファイルにも書き込みたいのですが'tee'がとある理由で
使えないので他の方法を探しています。

これでいいでしょうか?
>>517
よくわからんなぁ。
tail -f tmp.txt でだめな理由は?
色つき grep。かなりテキトー。
シェル、awk のスレだから awk で書いてみた。

#!/usr/local/bin/gawk -f
BEGIN{
i = "[31m"
o = "[m"

if(ARGC == 1){
print "regex required" > "/dev/stderr"
exit(1)
} else{
regex = ARGV[1]
if(ARGC == 2){
ARGC = 1
} else{
ARGV[1] = "/dev/null"
}
}
}
{
gsub(regex, i "&" o)
print
}
END{
printf("%s", o) # なくてもいいはずだけど念のため
}
520519:02/10/28 16:21
アホだ。色をつけるだけで grep の動作をしねぇ(藁

$0 ~ regex {
gsub(regex, i "&" o)
print
}

こうだ。
521512:02/10/28 16:23
>>517
test.shのなかで、ある時間のかかる繰り返し処理をしていまして、これの
スタート及び終了をリアルタイムでアナウンスさせたいのです。
また、一連のバッチ処理の中の一部なので「tail -f」だと処理を手動で
中断させなければならない為に使えません。
>521 test.shの中でstderrに「アナウンス」すれば?
523506:02/10/28 18:05
>>519-520
うちの環境では色つきませんでした。

一応、報告。
524506:02/10/28 18:13
どのように使うのでしょうか?


うちのktermでは
i = "\033[42m"
#i = "[31m"
o = "\033[0m"
#o = "[m"
にすれば色がつきます。

書き込みのときに ESC が落ちたんじゃない?
つーことで、524の修正であってると思う。
526506:02/10/28 18:26
だれか、
オプション作ってください。
awk厨なので僕はできません。

#i = "\033[43m" #yellow
i = "\033[44m" #blue
#i = "\033[41m" #red
#i = "\033[42m" #green

-y regex
-b regex
-r regex
-g regex
という風に色変えたいです。
>>519
GNU grepって色付になったんじゃなかったっけ?
2.5から環境変数 GREP_COLOR を使うみたい
質問ですが、

1.`command`
2.$(command)
の違いって何でしょう?

`cmd`と$(cmd)はシェルの実装の違いです。
`cmd`はもっとも古いshからの名残だと思います。
$(cmd)は比較的新しいshell(bash(posix-sh?))の実装です。

違いは$(ls $(pwd))のようにnestすることができます。
``でくくられている場合は自明ですが、nestすることはできません。

簡潔に言えば、従来のshellをもっと便利にしようとする拡張機能です。

よく出る話で、
if [ ]

if [[ ]]
がありますが、
上は、if test という意味です。testコマンドはshellに組み込みでなく、
外部コマンドなので、if するたびにプロセスを生成します。
それに比べて、 [[ ]] はshellの内部コマンドなので、プロセスを生成しないと
言うメリットがあります。

拡張shell構文(適当な名前だけど)はまったく基本的な機能しかないshに比べれば、
便利な点もおおいですが、可搬性がなくなります。

特にbashの機能を使ったものを、商用のUnixで動かそうとしても大変です。
一般性を求めるなら、基本的なshの構文だけで書いたほうがいいかもしれないです。
>>512

tail -f hoge.log &

while true
do
date
sleep 3
done

これを調整すればいいかな?
>>526

case $2 in
yellow) color="\033[43m";;
blue) color="\033[44m";;
red) color="\033[41m";;
green) color="\033[42m";;
esac

awk -v color=$color '{

適当だけど、これに続ければいけるかな?
本当なら、getoptつかったほうがいい
zshとかだと下のようにして、標準入力をforeachに渡せるけどbashとかで
同じように、for式に渡す方法ありますか?


 #くだ質などでwget式をあげるときになるべく短く書いてあげたい

foreach i (`cat`);wget $i;end <<END
aho.rm
baka.rm
END
シェルスクリプトの中でファイルの種類を識別する方法を教えて下さい。
例えば、対象のファイルが PDF だったら、~/pdf_dir へ移動させ、text
ファイルだったら消去するような処理をさせたいと考えています。

file コマンドを使用すると、出力をパースしなくてはいけないのですが、
イレギュラーが多く、パースするのが困難です。

file -b foo.pdf | awk '{ print $1 }'
PDF

file -b .emacs.el | awk '{ print $1 }'
Lisp/Scheme

file -b .emacs.el | awk '{ print $NF }'
text

良い方法がありましたらご教授下さい。
cat | while read line
do
echo $line
done

forじゃないけど、whileなら・・・
>>534
この手の問題は分岐パターンをはっきりさせとかないと
拉致があかないです。少数ならif 〜 elif で処理するのが定石かと。
parseって話になると、shell&awkだと非常につらい。
パターンマッチングくらいできる分類にしておくほうがいいと思う。

>file -b .emacs.el | awk '{ print $1 }'
>Lisp/Scheme

>file -b .emacs.el | awk '{ print $NF }'
>text

このようなケースって何を意図してるの?
>>530
> ``でくくられている場合は自明ですが、nestすることはできません。

うそついちゃダメ。まともなshellだったら1段のnestならできるぞ。
538534:02/10/28 22:25
>>536
text ファイルでも色々な種類があり、$1 を取って来ると、
Lisp/Scheme や ASCII 等それぞれバラバラのワードが返って
来てしまうのですが、$NF を取ると text と返って来るので、
パースの手掛かりにならないかなと考えました。

file コマンドの出力が、ファイルのタイプ毎にユニークな
数値だったら、その数値を基に条件分岐出来るのにと思います。

やはり、ターゲットとなるファイルの種類を絞ったスクリプト
を、複数個実行するのが現実的でしょうか。
>>537
え!そーなの。
知らなかった。
ちょっと例を教えてキボンヌ
>>538

t=`file -b hoge.sh`

if [ "$t" = "Bourne shell script text executable" ]
then
echo ok
else
echo ng
fi

みたいにfileの出力を全部比較すればいいだけでは・・・
541534:02/10/28 23:01
>>540
確かにそうですね。

前にも書きましたが、こういうのが無いかなと期待していました。

> file コマンドの出力が、ファイルのタイプ毎にユニークな
> 数値だったら、その数値を基に条件分岐出来るのにと思います。
>>539
エスケープするよろし。
センスないんで、実用性ゼロな例だけど…
$ echo `ls \`echo \\\`echo /usr\\\`\``
shell scriptを書くときは見切りをつけることが必要です。

1.shell scriptおんりーで間に合うか?

2.awkを絡める必要があるか?

3.perlで書き直すか?

4.ダルいんで寝るか(お

shellはできることが限定されてるんで、限界をしっておくのがいいかも

>>542
そんな抜け道があったなんて・・・
Escし続ければ多段にできるのかな?
でもそれって、nestじゃなくて多段evalのような気が・・・
>>530
kshとかPOSIX shellなら大抵のUnix互換OSで動くと考えて良いのではないでしょうか。
>>543
んだね。
深追いは禁物。
>>533
wget -i - <<END
aho.rm
baka.rm
END
>>545
そーかもしれないです。
気をつけなくちゃいけないのは、*BSD <-> Linux とかかな?
あと、GNUのtoolをつかってるとき。
549名無しさん@お腹いっぱい。:02/10/29 14:40
最強の.tcshrcってどこにあるんですか?
>>466, >>467, >>471さま、
遅くなりましたが、回答ありがとうございました。
いや、このスレ最近レス量増えてますねぇ。
>>549
湖の東の洞窟にあるよ。
事前に村の長老に会っておくこと。
>>530
`cmd` もネストできるよ。君がやり方知らないだけだね。
>>549
漏れも見たい。tcshのスレはないからな(´・ω・`)
bindkey "^R" i-search-back
bindkey "^S" i-search-fwd

特別なのはこれくらいしか書いてない。
後はaliasが100くらいと、環境変数だけ
ほかに便利なのってある?
>>555
M-p(history-search-backward)があるからi-searchは使わんなぁ。

set symlinks = expand
set autoexpand
set autolist = ambiguous
set correct = cmd
set matchbeep = nomatch
set listlinks
set histdup = erase
set savehist = (200 merge)

↑もう何年もいじってない…。もっと便利な機能が増えてるんだろうけど。
set implicitcdはいいですよ。zshみたいにcdをつけなくてもcdできます。
こっちもさげておこう。
awkについて一応聞いときます。

/tmp以下のsshソケットのうち29日よりも前に作ったやつを消したくて、
% ls -l /tmp/ssh*|awk '{if($7<29)print $0}'
/tmp/ssh-XXMWxexF:
合計 0
srwxrwxr-x 1 hishiura hishiura 0 10月 27 09:19 agent.14049=
      ・
     <略>
      ・
/tmp/ssh-XXLfeVg2:
合計 0
srwxrwxr-x 1 hishiura hishiura 0 10月 23 23:35 agent.1547=

/tmp/ssh-XXUlbpyW:
合計 0
srwxr-xr-x 1 hishiura hishiura 0 10月 23 23:11 agent.1408=

とカラムを切り出すまではOKですが、
これらを消すにはどうすればいいのでしょうか?
find /tmp/ssh-* -type s -mtime +2 | xargs rm
ls -l /tmp/ssh*|awk '{if($7<29)print "rm -f"$9}' | sh

awk的には条件は
ls -l /tmp/ssh*|awk '$7 < 29 {print "rm -f"$9}' | sh
の方がスマートかな。

>>560
のfindの-mtimeは何日前?ってのを求めたいときにヒジョーに便利。
特にcronの中に組み込むときはチョー便利。月またぎでも全然問題ないんで。

562名無しさん@お腹いっぱい。:02/11/01 00:15
sample.sh

#!/bin/sh

kon

echo "こんにちは"

と kon を起動してからコマンドを実行していきたいのですが
どうすればいいですか?
563名無しさん@お腹いっぱい。:02/11/01 01:05
kon &
ワラタ
565562:02/11/01 20:23
>>563
シェルスクリプトで
kon を起動してからその上で日本語表示をしたいんです。
man kon
> STARTUP(string)
> スタートアップ時に起動するコマンド文字列を指定します。
567562:02/11/02 03:36
すいません >>562 での使用例を示していたでけませんでしょうか?
それはやり過ぎでない?
569562:02/11/02 12:40
>>586
やりすぎってのは??
どう書いていくのかよくわからないんです。
ようするに、
#!/bin/sh

kon STARTUP echo "こんにちは"

exit
みたいな感じですか?
570名無しさん@お腹いっぱい。:02/11/02 12:50
>>569
いちいちきくまえに自分である程度テストしてみるって頭はないのかな?

パターン1→これこれこうで×
パターン2→これこれこうで×
パターン3→これこえこうで×

ぐらいのレポートでも付けときゃ案外すんなり正解が引き出せるかも
知れないのにねぇ〜
>>569
>>566 に man kon って書いてあるじゃん。
読んでみたか?
572名無しさん@お腹いっぱい。:02/11/02 12:58
>>565
なんでそんなことしたいの?
573562:02/11/02 13:35
>>570
一応 >>569 の方法で試しました
>>571
jman kon で読んでみましたがよくわかりませんでした。
>>572
コンソール上で日本語表示対話型シェルスクリプトを作りたいんです。

んでやってみた結果です。

KON> warning: bad arg `echo'; assumed `-蕀真?'
KON> warning: invalid capability `echo' ignored
KON> error: unknown video type `gzip'
KON> warning: unknown mouse type ` MouseSystems
' ignored; assuming no mouse
KON> error reading /usr/local/etc/kon.cfg

一行めの最後は文字化けしていました。
>>573
KON上で普通に
> echo "こんにちは"
ってできてるか?
>>573
事前に kon を上げておくことはできないの?
いっそローマ字で表示する、とか。

要件から見直した方がいいんでないかな。
自分の技術レベルとよく相談すれ。
576562:02/11/02 13:58
>>574
kon起動時にコンソール上で日本語入力ができませんのでシェルスクリプト
#!/bin/sh
echo "こんにちは"
を実行すれば表示できます。
>>575
できないのです。。ローマ字で表示は盲点でした、日本語表示ができそう
じゃないのでそれで行こうと思います。
577名無しさん@お腹いっぱい。:02/11/02 23:09
tail -1lf /var/adm/messages | myscript &
というジョブを走らせてるんですが,ログがローテート
されるとmyscriptへの入力がなくなってしまいます.

いい方法ないでしょうか?

Solaris8 + /bin/shです.
578名無しさん@お腹いっぱい。:02/11/02 23:18
root@host 1# crontab -l
579FreeBSD厨:02/11/02 23:20
>>577
ログがローテートされると新しいファイルを読む tail をパクってこい。
FreeBSD とかにある。
580名無しさん@お腹いっぱい。:02/11/02 23:48
>>579
できればシェルレベルで解決したいんです.

UNIXの特殊ファイルでnamed pipeってあるけど,
ユーザが気軽につくれるものですか?

もしできれば,syslogの出力をpipeに渡して,
それをtailするのでもいけるのかなあ.

581名無しさん@お腹いっぱい。:02/11/02 23:55
>>580
いま考えるとpipeじゃなく,通常ファイルでも
いいのか.

#syslog.conf
*.* /tmp/hoge

$ tail -1lf /tmp/hoge | myscript &

くだらない質問ですまそ.
>>581
それなら最初から rotate しなきゃいいじゃん。
583名無しさん@お腹いっぱい。:02/11/03 00:18
>>582
いえ,ローテートの設定はマシンによってまちまちなので,
できれば汎用的な手段で解決したいのです.
だるいんで、ポイントだけを・・・

script内部でlogのi-nodeを保存しておいて、
tailをbgで起動して、そのtailのpidをげっとして
scriptの続きで、保存してあるlogのi-nodeと
現在のlogのi-nodeを比較して、違っていたら
tailをkillして、再度tailすればいけるような気がする。
あとはこれをくりかえす。

てすとしてないんで、あしからず。
ひとりごとだけど・・・

商用機で、
1.前日の日付を求めるには?
2.tailでフォローし続けるには?
3.cronで月の最後の日をどうやって設定するのか?

っていう質問は今までに何回聞いたことか・・・
はぁ〜
>>576
いったいいつの時代からローマ字が日本語でなくなったんだ?
>>586
昔からです
588>>580:02/11/03 05:51
>UNIXの特殊ファイルでnamed pipeってあるけど,
>ユーザが気軽につくれるものですか?

mkfifo
589580:02/11/03 08:15
みなさん ありがとうございます.
早速試してみます.
>>587
ローマ字って国語の時間に習うはずだが。
591名無しさん@お腹いっぱい。:02/11/03 16:11
bashですが、
export IGNOREEOF=数字
ってやると、Ctrl-D押してもすぐシェル終了しないようになりますよね。
これを、stopped jobsがある場合だけCtrl-Dで終了できないようにして、
ジョブが何も走ってないときだけすぐ終了、
ってするように出来るでしょうか?

通常後ろにジョブがあると、there are stopped jobs
とか、一度だけ言われて、終了しないんですが、
Ctrl-Dもう一回押すと終了しちゃうので。
592愛犬 ◆DOGWYiIzt2 :02/11/03 21:25
 
>>586
ローマ字は日本語とは限らないよ。
英語を表記しているのもローマ字。
ローマ字の対義語はギリシャ文字。

いつの頃からか、日本語をローマ字(つまりアルファベット)を
使って綴ったもののことを称して「ローマ字」と言うようになり、
ローマ字=日本語という、誤解が広まってしまったのだが。
594YAHOOO情報:02/11/03 21:43
「ロ」、「ー」、「マ」、「字」
全部日本語で使用する文字なんですが。
ローマ字談義は余所でお願いできますでしょうか?
>>590
わかっているとは思うけど、
国語の時間に習うのは「ローマ字綴り方」
「ローマ字」を習うのは英語の時間。
ローマ字談義は余所でお願いできますでしょうか?
こっちで盛り上がってくれ。
http://academy.2ch.net/test/read.cgi/gengo/982996713/
ゆったりと600get
601ゲト
http://support.sgi.com/linux/docs/JPN_PP1.3.final.html

awk < /dev/null '
END {
……
<略>
……
}
' | sh
というスクリプトですが、何故、
< /dev/null '
なんてしてるのですか?


教えてくださいませ。
"< /dev/null"を消して実行していただくとわかります。
>>602
古い awk だとBEGIN, END のみで通常の pattern{action} がないスクリプトでも、
BEGIN の実行後に標準入力を読みにいってしまって END に到達せず、
スクリプトも終了しない。よって /dev/null を明示的に食わせて
pattern{action} をスルーさせてやる必要がある。

SGI の awk はどうか知らんけど、少なくとも Solaris や SunOS4 の
/usr/bin/awk はそう。/usr/bin/nawk ならこれは起きない。
たかが /dev/null
されど /dev/null
/dev/null は浅いようで奥が深い
関係ないけど、sed は日暮れてって掲示板あったんだね。
>>606
ttp://www.chimimo.com/sed/

やっぱり、sedが一番切れ味がある
perlはナマクラ
608名無しさん@お腹いっぱい。:02/11/06 20:42
ループの break や goto はないの?
>>608
何のループの話?
>>607
>やっぱり、sedが一番切れ味がある
>perlはナマクラ
根拠ないこと言うな。単なる主観だろ。

マジレスする方がいます
ちょお怖いです
612名無しさん@お腹いっぱい。:02/11/07 03:08
whileを含む、sample.sh を実行したとき、
while: Expression Syntax.
と表示されて止まってしまいます、どういう意味なんでしょうか?
ちなみに、
sh -xv sample.sh
として実行すると、なぜか止まらず、考え通りに処理されます。
>>612
環境を説明するとかそのシェルスクリプトそのものを貼るつもりはないんでしょか。
sedの質問なのですが……

コマンドラインから、ファイルの
空白行を削除するにはsedでは

$ sed g/^[ ]*$/d ファイル名

というのはマチガイですか?

viなどの
:g/^[ ]*$/d
コマンドがsedでも使えるというのは何かの勘違いでしょうか?
awk の細道
>>614
はい勘違いです。
>>614
sed の g は意味が違うんで。/^[ \t]*$/d だけでおっけー。
便乗してsedの質問!!
sed -e ' y/123456789/123456789/g' hoge.txt

で半角→全角
とはできないのでしょうか?

sed: -e expression #1, char 32: strings for y command are different lengths
と叱られます。



そもそもやる必要がありません。
621612:02/11/07 20:50
>>613
とりあえず
while: Expression Syntax.
ってどういうエラーの意味なんでしょうか。
Expression は表現って意味はわかったんですが・・・。
>>621
おまえ>>613さんの言ってることは無視ですか?
あとsyntaxぐらい調べようとおもわないのですか?
http://dictionary.goo.ne.jp/cgi-bin/dict_search.cgi?MT=Syntax&sw=0
>>614
君面白いから小ネタおしえてあげる

:r!date
とか

a 1
b 2
c 3

:%!awk '{ print $2,$1 }'

その気になれば、viの中で生きていけるかも
板違いすまん
>>612
head -n1 sample.sh と echo $SHELL きぼーん。
>>621
とりあえず、whileまわりをみせてくれ
「expression」は文脈によって意味が非常に違うから、直訳してもダメよ
俺も小ネタ。

長いコマンドラインを打ち込みたい場合とか、
vi の中でコマンドラインそのものをエディットして、
:w !sh
で実行できる。
>>626
おもしろいね。fcでも似たようなことができるけど。
628624:02/11/07 21:16
>>624
echo $SHELL は関係ないか。
head -n1 sample.sh ぷりーず。


vi の 小 ネ タ 、
    カモーーーーーーン!!!!!!!!


>>629
「vi」の小技教えてスレ
http://pc.2ch.net/test/read.cgi/linux/996983375/
>>626
そーそー
環境そろってないとこでも、csh + vi をうまく使えばかなりのことできる
Bill Joyはイカすね!
632621:02/11/07 22:55
>>622
そのサイトは知りませんでした、以後役に立ちそうです。
ありがとうございます。
>>613-625-628
なんでかわかりませんが、全部書き直したらうまくいきました
たぶん改行がどこか抜けていたんだと思います。
ありがとうございました。
マルチバイトのパッチをあてたsedで
sed 's/aaa/\n/' がうまくいきません。
nに置換されてしまいます。
\\nとすると改行ではなく文字としての\nになってしまいます。
普通のsedだと大丈夫なんですが・・・
>>621

貼り付けてから、変えれ!!!!
emacs派のオレは用無しか・・・
M-x shell なんて誰も使わないのか・・・


ただの愚痴です。気にしないで下さい(w
>>635
Emacsで該当するのは M-x shell ではなく M-| (shell-command-on-region) かと。
637624:02/11/08 02:04
>>632
なんだそのオチは……。
while: Expression Syntax. なんてのを出すのは csh 系だろう、
とにらんだんだが。
xargsってシェル関数受け付けないのですか?

% cat keyword.txt
moge

% which google
google () {
w3m "http://www.google.com/search?ie=euc-jp&oe=euc-jp&hl=ja&meta=lr=lang_ja&num=10&q=$*"
}

% cat ./google
w3m "http://www.google.com/search?ie=euc-jp&oe=euc-jp&hl=ja&meta=lr=lang_ja&num=10&q=$*"

% cat keyword.txt |xargs -n1 google hoge
xargs: google: そのようなファイルやディレクトリはありません

% cat keyword.txt |xargs -n1 ./google hoge
【成功!!】


すれ違いかどうか確認ですが、
ed
の質問はココでいいの?



Makefileのタグ補完ができないmakeはすごく使いにくい。

zshが使えない時もタグ補完しようと_make見て勉強してますが、
だれか、この中に、bash、tcshでもMakefileのタグ補完してる人の
HPを見かけた人いませんか?

_make見る限り、なんか自分でもかけそうで、かけない……





% echo $SHELL
/usr/local/bin/tcsh
% alias maketarget 'sed -n "/^[-a-zA-Z0-9]*:/s/:.*//p" Makefile'
% complete make 'p/*/`test -f Makefile && maketarget`/'
% make [TAB]
Makefile clean distclean install static
all depend distro stamp-h uninstall
>>638
shell関数、shell変数はそのshellないじゃないと、見えないワナ
子プロセスじゃむり。
644名無しさん@お腹いっぱい。:02/11/08 20:47
>>643
うん?>>638はうまくいったのでは?
>>644
% cat ./google
これって、ファイルに書いたらうまくいったって例じゃない?

which google
して関数がでるのは、コマンドのサーチプライオリティが
shell関数->外部コマンド だからだと思う。
./google ってのは明示的に外部コマンドをしていしてるように見えるし。
>>638を改造して複数のキーワードを受け付けるようにできませんか?
今の状態だとhoge hogeをキーワードにするとhogehogeとくっついて検索されます。
>>646
keyword=`echo $* | sed 's/ /+/g'`
して
$* のかわりに $keyword をappendしる
日本語は面倒みきれないけど・・・
#!/bin/sh
browser=/usr/local/bin/w3m
url="http://www.google.com/search?oe=euc-jp&hl=ja&meta=lr=lang_ja&num=10&q=%key%"

for i in $@
do
key="${key}+"`echo -n "$i" | hexdump -v -e '/1 "%X"' | sed 's/\(..\)/%\1/g'`
done
key=`echo "$key" | sed 's/+//'`
url=`echo "$url" | sed "s/%key%/$key/"`
exec "$browser" "$url"


とりあえず FreeBSD ではこれで動いたが、
hexdump の仕様に激しく依存するので可搬性はない。
GUI が作成できる shell って無いですか?
qtopia の opie-sh の強化版みたいなの。
>>649
だったら、tcl/tk が手っ取り早い
tcl/tk なら py-gtk で良いです。我がまま言ってすまそん。
shell script とシームレスに書けると嬉しいんですが。
探してみても無かったので諦めます。
>>651
商用だけど、CDE に付いてくるdtkshは?
653名無しはん@EMACS:02/11/08 23:25
>642

おー、けっこう使える
>>652
正に其れって感じなんですが、CDE 環境持ってないので使えないんです。
面白いと思ったので、bash + gtk とかで同じようなものが無いかなと
探したのですが、見つかりませんでした。
>>654
gdialog じゃ力不足?
gdialog --yesno 'Are you OK?' 10 100 とか。
less376以降だと

grep string test.txt|less -R

とすることでカラーを損ねないまま見ることができるようですが、
日本語化パッチ出てますか?

見つかりませんでした&すれ違いスマソ


>>655
良いのを教えて下さってありがとう!!
イメージを貼り付けられたり、ウィジェットを階層的に配置できたら
最高なのですが、多くは望まないことにします。
658656:02/11/09 00:02
grep (GNU grep) 2.5
以降の話。
659名無しさん@お腹いっぱい。:02/11/09 00:59
>>638
$ typeset -fx
だめかも…
>>947>>948
なるほど+を使えばいいのですね。アリガトウ。
単一ファイルなら nkf -e かますのは駄目?
nkf -e test.txt | grep --color=always string | less -R
とかかな?
662名無しさん@お腹いっぱい。:02/11/09 21:06
case文のネストをさせたいのですがどうしたらいいんでしょうか?
下記のようにしてもだめでした。

#!/bin/sh
echo -n "comment-1...[pattern1/pattern2]"
read variable_1
case "$variable_1" in
pattern1)
while command
do
echo -n "comment-2...[pattern1-1/pattern1-2]"
read variable_2
case "$variable_2" in
pattern1-1) command-list-1-1 ;;
pattern1-2) command-list-1-2 ;;
pattern1-3) command-list-1-3 ;;
esac
done
;;
pattern2) command-list-2 ;;
pattern3) command-list-3 ;;
esac
unset variable_1
unset valiable_2
exit

;;を置く場所が問題だと思うのですが...
>>662
| 下記のようにしてもだめでした。

「だめ」とは?
664662:02/11/09 21:24
>>663
Syntax error:Unterminated quoted string
と表示されます。
>>664
caseのネストの問題じゃない。
たぶん echo "..." の中の文字列が悪さをしてると思う。
666662:02/11/09 21:40
うおーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
いけました
echo -n "comment-1"...[pattern1/pattern2]"
と " の後にさらに " を入れていました、初歩的ミスでした...
case のネストの文法はこれで問題なかったんですねぇ...
助かりました、ありがとうございます!!!
667663:02/11/09 22:02
>>664-665
そのdoublequoteは>>662では見えないんだけど、ブラウザに
よるのかな。
>>667
一見、(質問者にとっては)関係なさそうに思われる部分についても、
質問する時には省略しないでコピペした方がいいという、
典型例ですね。
669662:02/11/09 22:14
いや、書き写し元に " が入っていました。
だから >>662 をテンプレにしても問題はないと思います。
670662:02/11/09 22:16
>>669
>>667 氏へ
671名無しさん@お腹いっぱい。:02/11/10 22:21
#!/bin/sh

echo -n "comment"

read STRING

case "$STRING" in

*) ;;

esac

unset STRING

exit

と、いうスクリプトですが、comment が表示され、enter を押したら
終了するはず、と考えていましたが、
STRING: Undefind variable.
と表示され、止まってしまいます。なにがいけないんでしょうか?
672名無しさん@お腹いっぱい。:02/11/10 23:14
PD KSH v5.2.14 99/07/13.2
ではうまくいくな
673671:02/11/11 01:22
原因がわかりました。
テスト用に切り出したスクリプトは、テキストの1行目に
#!/bin/sh
を記入しており、元のファイルから分離させたときは正常に動きます、
しかし、それを元ファイルに戻すとcsh的なエラーを返すのは、

#########
#comment#
#########

#!/bin/sh

と、していたからでした。ファイルの一番先頭に#があった場合は
cshとして動くというのを知りませんでした。
ああ・・・これで一日ふっとんだ・・・
でもがんばる・・・
674671:02/11/11 01:33
>>673
自己フォローですが、結局

#!/bin/sh

#########
#comment#
#########

とすればよかったんですね。
#! はファイルの先頭2バイトにないと意味ないでし。
だから、質問する時は、関係ないと思われる部分でも
省略せずにありのままコピペが基本だって言ってるのに・・
先頭の4バイトを「#! /」にしといた方がよりポータブル。
>>677
そーなの。今まで知らんかった。
理由をおしえてぽ。
>>678
"(DYNIXのような)4.2BSDを基本とするシステムは,`#! /'は4バイトのマジッ
クナンバーとして解釈される"そうです。Autoconf-2.54のinfo by gnujdocか
らの引用です。

>>679
情報サンクス。
またまた薀蓄がふえました。
>>633
>マルチバイトのパッチをあてたsedで
>sed 's/aaa/\n/' がうまくいきません。
この \n は sed正規表現の改行マッチ文字の一つですが、
出力用の改行文字と用いるのはあんまりお奨めできないものだと思います。
オリジナルの sed ではこの文字を改行として出力しないはずですので。

可搬性を考えたら素直に

sed 's/aaa/\
/'

としたほうがいいでしょう。
682681:02/11/12 13:16
>>681
>出力用の改行文字と用いるのはあんまりお奨めできないものだと思います。
ちょっと変でした。「改行文字として用いる」と訂正しますです。
683名無しさん@お腹いっぱい。:02/11/12 13:54
>>641
亀レスだが、tcsh の場合、
tcsh-6.xx の doc あたりにサンプルスクリプトとして
complete.tcsh というのがある。
その中で次の記述がある。便利だ。(的はずれだった?)

complete make \
    'n/-f/f/' \
    'c/*=/f/' \
    'n@*@`cat -s GNUmakefile Makefile makefile |& sed -n -e "/No such file/d" -e "/^[^     #].*:/s/:.*//p"`@'
684名無しさん@お腹いっぱい。:02/11/14 23:35
sed について質問です。sample.txt の内容
ab
cd
ef
ij

があるとき、ef の次の行に、ghを追加する場合、
sed /ef/a\
gh sample.txt
でいいんですか?
  ハハハ
  ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ( ^∀^)<  あほか
 ( つ ⊂ ) \_________
  .)  ) )
 (__)_)     (^∀^)ゲラゲラ
686名無しさん@お腹いっぱい。:02/11/15 01:13
>>684
惜しい。それだと \ が shell に食われちゃって
``sed /ef/agh sample.txt''
と解釈されます。

sed '/ef/a\
gh' sample.txt

と '〜' で保護してやれば大丈夫。
687名無しさん@お腹いっぱい。:02/11/15 01:41
>>686
試してみたんですが、
sed: 1: "/ef/a
gh": command a expects \ followed by text
と表示されてしまします。
なんででしょ?
>>687
シェルによる。bashだとそれで動くが、ダメだったのなら\\にしてみ。
689686:02/11/15 10:46
>>687
あ,そうですか.\ が食われちゃってますね.
私は bash と GNU sed でできることを確認してみたんですけどね.

使ってる shell と sed によって指定の仕方が異なるかも知れないです.
\\ ではどうですか?
escりたくなくて、sedじゃなくていーなら
awk '{print} /ef/ { print "gh" }'
691684:02/11/15 19:31
>>688-689
sed '/ef/a\\
gh' sample.txt
でできました。
sed わんや
awk 凡人
693684:02/11/16 00:18
ab        ab
 cd        cd
 ef  →     ef
ij         gh
         ij
のようにしたいのですが、
sed '/ef/a\\
 gh\
' sample.txt
としても、ghの前に空白が入力されません。ただスペースを入力しただけでは
だめなんですか?
694684:02/11/16 00:55
わかりました

#!/bin/sh
sed '/ef/a\
\ gh\
' sample.txt
でした。
695686:02/11/16 01:01
>>693
うーん、bash だとうまく行きますけどね。
空白も shell に食われてるんではないかなと思いますよ。
複数行使うような場合は shell script の表現能力によると思います。

tcsh だとうまく行きませんでした。
もし tcsh を使っているのであれば注意が必要です。
確かにパイプを繋げただけの「一行野郎」なら tcsh でもよいのですが、
一般的に tcsh は script 書きには向いていないと言われてますので。
(今回の例が tcsh のせいかどうかはわかりませんが。)

sh か、補完機能などを強化した bash などを使うべきでしょう。
696686:02/11/16 01:03
あ、解決しましたか(^^;
http://homepage3.nifty.com/~moemoe/table2csv.pl.txt
perlスクリプトを使って、
http://www.nacsj.or.jp/database/satoyama/chosa/hokkaido.html
http://www.nacsj.or.jp/database/satoyama/chosa/aomori.html
などの
のhtmlのテーブルをcsvに変換し、
awkを使って
「ビオトープづくり」を●の個数を計算し、
全国で「ビオトープづくり」を行う団体の個数を出したいんですけど、
awk厨なので、かけません。

awkスクリプトはどうやるのでしょうか?

698名無しはん@EMACS:02/11/18 23:04
>697

キミはもしかして大伝馬町か?
>>697
awk 厨なら awk 書けるんじゃないの?
700699:02/11/19 00:52
つか、個数を出すのが目的なら csv にするまでもなく、
● の数を数えるだけでいいような。
プログラム言語以前に日本語が意味不明だが
sed -e 's/aho/baka/g' xxxxxxxxxxx.txt

baka
という文字列をシェル変数 $hensuu に置き換えて
使いたいのですが、どのようにクォートすればいいのでしょうか?
sed "s/aho/${variable}/g" hote.txt
704名無しさん@お腹いっぱい。:02/11/19 16:41
find の出力を mtimeで sort したいんだが、何か簡単な
方法はない可能?
find . | xargs ls -dt
ファイル名に空白あると変になるかも。
% find /somewhere -exec tcsh -c "echo -n {}\ ; filetest -M {}" \; | sort +1 | awk '{$NF=""; print}'

…力技にもほどがあるな。
>>705
find の出力した結果が xargs で1回に扱うファイル数を越えると破綻する。
708704:02/11/19 20:28
そんなにファイルも多くなかったんで、705さんの方法でなんとか
なりました。
んで、参考にしてファイルが多いとき用も描いてみますた:

find . -printf "%T@\t%p\n" |sort +0n | cut -f 2 | xargs ls -ld

たぶん GNU find でしか使えないだろうけど..

>>707
ほんとに?
>>709
xargs が一度に処理する引数の数を減らして試してみればわかる。

% find . | xargs -n10 ls -dt
711名無しさん@お腹いっぱい。:02/11/20 11:05
man はどの様な環境変数を利用しているのでしょうか?
>>711
man man
713709:02/11/20 14:49
>>710
なるほど、わかりました。xargsでls使うのがそもそも間違いかもしれませんね。
>>711
manによる
PAGER MANPATH
716名無しさん@お腹いっぱい。:02/11/20 21:47
>>711
隠し環境変数を調べるときは
grep getenv *.c
strings man | egrep '[A-Z_]+'

ちなみに、バイナリから隠しオプションを見つけるときは
strings hoge | grep :
で結構うまくいく
cutコマンドの-c,-bオプションやみたいに、
何バイト、何文字という指定をすることで
:や|や#などの文字列を挿入したいのですけど、
そんなことできますか?
別に、awkに限らず、perlや他の方法でも構わないのですが……
いつもcutで切った後で、pasteしてます。

-----
ab   ac
ccc  ccc

ab   :ac
ccc  :ccc
にしたいのです。例は悪いけど、本当は正規表現では扱いきれないような日本語
のファイルなのです。
gawk は固定長フィールドを扱えたりなんかするがどうよ。

% echo 1234567890 | gawk 'BEGIN{FIELDWIDTHS="1 2 3 4"; OFS=":"}{NF+=0;print}'
1:23:456:7890
>717
perl -e 's/^(...)/\1:/'
いそがしくてためしてないからごめん。
perl -e 's/^(.{3})/\1:/'
でもいーんだっけ?
>>719
.で任意の一文字は、日本語が混じるとチト辛い。
>>720 に捕捉。
.で2バイト文字一つにヒットするんで、バイト長の指定とは
完全に一致しない(ことがある)。
>>721
-b
とか
env LANG=C
とかつけてもダメ?
ならば素直に sed 's/^\(...\)/\1:/'
724名無しさん@お腹いっぱい。 :02/11/23 21:25
果たしてこれが可能かsedやawkで可能かどうか分かりませんが・・・。

1234

こういう文字をsedかawkを使って
123 4
みたいに、単語の中の一定の場所(バイト数?)にスペースを挿入する方法
ってあるのでしょうか。どうかよろしくお願いします。
>>717
cut/paste っぽく dd 使う手もある。% dd ibs=1 obs=1 ...
>>724
sed 's/^\(.\{3\}\)/& /'
とかかな?
727名無しさん@お腹いっぱい。:02/11/23 22:57
>>726
>sed 's/^\(.\{3\}\)/& /'
& 使うのならシンプルに sed 's/^.\{3\}/& /' がいいでしょうな
728724:02/11/23 23:10
>>726
>>727

無事に出来ました。ありがとうございました。
感謝です!
729名無しさん@Emacs:02/11/24 10:23
最近の sedは '{3}' とか使えるのか。しらんかった。
つーか、re_format(7) とかみてるといろいろ昨日増えてるんだねえ。
これって grep, sedあたりで使えるん?
awk も昔より拡張されてるけどまた別の正規表現みたいだし。
GNU sed-4.0.1からPerl モードとかもある(ChangeLog)みたいだけど、info
見てもそんなこと書いてない。かなり拡張されているみたいなんで、調査中で
す。
>>730
GNU sed って、かなりバージョンあがったよね。
そのうちperlよりも、でかくなったりして・・・
バージョンの目標はemacsにして欲しい(w

REの後方参照って、どこかに文書化されてるの?
POSIXだと、基本、拡張しか定義されてなかったような気が・・・
その中にはなかったような気がするし・・・
perl->GNU って感じのナガれなの?
ttp://www.opengroup.org/onlinepubs/007908799/xbd/re.html
には記述されているけど、POSIX.2標準かどうかは知らないです。
# POSIX.2 の文章をFreeで見れるところ知りませんか?
>>735
Thanks! って、今まで見てたので良かったんですね。
>>735
後方参照って、 IEEE Std 1003.1-2001 で定義されてたんですね。
僕がRE覚えたのが、10年くらいまえだったんで、そのころは
まだPOSIXで定義されてなかったのかな・・・・
738自作自演:02/11/25 12:52
awk,sed,perl を使うと同じような事は出来そうな気はしますが、
grep のテーブル版みたいなのを作ってみました。

http://yukinopo.infoseek.livedoor.com/tabrep
POSIXはあったと思うが、REの後方参照に関する記述があったかどうかは知らん
740自作自end:02/11/25 18:56
738 です。
フィールドにマッチする正規表現は簡単に書ける事がわかったので逝ってきます

' '区切りの 3番目のフィールドのregexにマッチさせる
'[^ ]* *[^ ]* *regex'

これだけのために1週間かけてプログラム作ったなんて鬱だ
741740:02/11/25 19:01
>>740 スペースが消えちゃったい
-E '[^ ]+ +[^ ]+ +regex'
742740=741:02/11/25 19:05
>>741 頭も間違ってた。
-E '^[^ ]+ +[^ ]+ +regex'
三度逝ってくる
>>740
区切りっていう、キーワードがあんなら、awkが正攻法だとおもう。
awk '$3 ~ /RE/'
みたいな感じに。
awkは入力が既にwhitespaceでspiltされた状態だから。
あと、-F オプションを覚えれば、かなり応用きくでしょ。
極めつけは、 BEGIN{RS="";FS="\n"} だね。
これがあるから、perlじゃなくて、awkが必要になる。
>>743
perl でもできたりする(藁

% perl -anF: -e 'print "$F[4]\n";' /etc/passwd
>>744
awkの方がタイプするのに0.8秒ほど速い!(稿
というか、unixって、時に1秒以下のタイプの感触と
リズムを味わうことってあるよね。
one liner 書いてるときは純粋に面白い。
ウィンドーマネージャー使うと
srwx------ 1 aho users 0 10月 1 14:06  afterstep-544.DISPLAY=122.11.122.47:0.0
見たいなソケットが/tmp/以下にいっぱいできてしまいますが、
このaho君のソケットを消し去るコマンドありませんか?



find /tmp -user aho -name 'afterstep-*' -print0 | xargs -0 rm -f
http://pc.2ch.net/test/read.cgi/php/1037797479/64-65
を書き込んだものですが、
シェルスクリプトをperlで書き直すとかなり早くなるのでしょうか?

while ( $roop <= 24386 )
perl hogehoge.pl data.tmp > data.result
set min = `awk '$2 <= 0.4 {print $0}' data.result | sort +1 -n | head -n 1`
<略>
@ roop++
end
のようなところが時間を食っているようなので、書き直そうと思うのですが、
あんまりperl勉強してる時間がないもので……

いまのスクリプトでは
「どんな値になるのかちょっと試してみよう」と思っても
半日ぐらい計算しっぱなしなのです。

>>749
ループはshell scriptでは遅いのは事実です。

経験論だけど、特にBshのループ(test, expr使用時)はperlでループするより
100(0?)倍以上遅い。
でもこれはCshでビルトインtest、exprなんで、そんなに遅くならない
と思う・・・

このwhileって、ループ回数が24386とかなり多いので、1ループあたり、1秒以上
かかってしまうと痛いかも。

あと見た感じ、「のようなところが時間を食っている」じゃなくて、(ここで時間を
浪費しているのは自明なので)、whileか、perlか、sortかを時間を計るのが得策。

それでもダメなら、perlかCで素直に書き直すべき。
>>749
> set min = `awk '$2 <= 0.4 {print $0}' data.result | sort +1 -n | head -n 1`
cshかperlかよりも、いらないデータまで出力してから削るのをやめると速く
なりそうな悪寒。

つーか、cshで(ry
やっぱりperlで(Cはムリポ)書き直したいです。
perlスレにはレスつかなかったですが、どうすればいいでしょう。

特に
set min = `awk '$2 <= 0.4 {print $0}' data.result | sort +1 -n | head -n 1`
set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`
の部分のperlのsyntaxが知りたいです。

 #(一応、質問事項を絞ってみたけど……)



shell script でバッククォート使いまくって、
ループ中で外部プログラム実行しまくらせてる時点で、
perlにした所でそんなに速度変わらないと思うよ?

やるならその shell script ごと perl にせいや。

あとどんな入力フォーマットでどんな出力フォーマットなのかが
ぜんぜんわからん。読みにくいscriptだけ見せられても読む気起こらんよ。
data.resultの元データがこんな感じだとして
@result = (["foo", 0.4, 0, 0, 1],
["bar", 0.2, 0, 0, 4],
["zot", 0.3, 0, 0, -1],
["qux", 0.5, 0, 0, 2]);

$min = 0.4;
$gyosu = 0;
foreach (@result) {
$min = $$_[1] if $$_[1] < $min;
$gyosu++ if $$_[4] > 0;
}

# gyosuのtmpCってのはdata.resultでいいんか?
755754:02/11/28 15:04
@resultがでかくて残しておけないようなら、foreachの中身を@resultを生成
するところに持って池。
>>752
>set min = `awk '$2 <= 0.4 {print $0}' data.result | sort +1 -n | head -n 1`
>set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`
ここだけperlにしてもはやくならないよ。
ここだけだったらawkのほうがいい。

あと、上のminを代入するところは、用件的にまちがってるんじゃ?
みるからに $2 とやったあとに、print $0 してるってことは、すべての
フィールドが sort-head にながれてるんで、それを最後に代入するのは
ちがう気がする・・・

あえてawkで書くなら、
set min = `awk 'BEGIN { min = 0.4 } $2 < min { min = $2 } END { print min }'`
set gyousu = `awk 'BEGIN { gyousu = 0 } $5 > 0 { gyousu++ } END { print gyousu }'`
こんなかんじ。
757752:02/11/29 00:36
レス下さった方、質問文が言葉足らず+情報不足で住みませんでした。後で、スクリプト全て貼り付けます。

>>754
># gyosuのtmpCってのはdata.resultでいいんか?

僕が途中の式を省いたため754さんは混乱されたかもしれません。すみませんでした。

>>756
>あと、上のminを代入するところは、用件的にまちが>ってるんじゃ?

これも情報不足でした。minレコードの第1フィールドだけ欲しいのです。
758752:02/11/29 00:39
~$ head date.txt
93003
93000
92921
92918
~$tail date.txt
40203
40200
40121
40118
40115
-----------------------------------------------------
~$tail long-lati.txt
168.8697216000 59.7586695400
169.2037753000 59.6947736900
169.5367681000 59.6301557000
169.8686937000 59.5648183600
~$ head long-lati.txt
135.0089500000 30.0456057900
135.2164053000 30.0565798600
135.4239248000 30.0670890700
135.6315059000 30.0771331300
759752:02/11/29 00:39
-----------------------------------------------------
~$ head -4 rMsfc01090621.txt
141.4711369000 40.7979338700 -3.76941 2.75623 90621
141.9547580973 40.5302304216 -2.421 0.821 3
142.2641319424 40.4504894235 -2.728 -1.579 6
142.6123226034 40.6038524393 -3.590 -4.216 9
~$ tail rMsfc01090621.txt
-268.6317004143 60.5087984403 231
-314.2070032877 60.5087984403 234
-360.3741932114 60.5087984403 237
-407.1332701854 60.5087984403 240
-----------------------------------------------------
~$ head rTmp900m042012.txt
139.7923104000 30.0000849500 287.57
140.0000000000 30.0003182200 287.601
140.2076896000 30.0000849500 287.616
134.3869977000 30.0098973200 287.21
~$ tail rTmp900m042012.txt
168.9963994000 59.9270559400 269.101
169.3316494000 59.8629482200 268.96
169.6658259000 59.7981164500 268.773
169.9989224000 59.7325634200 268.523
760752:02/11/29 00:40
-----------------------------------------------------
~$ head rRH900m042012.txt
139.7923104000 30.0000849500 72.5553
140.0000000000 30.0003182200 70.0866
140.2076896000 30.0000849500 67.7741
134.3869977000 30.0098973200 81.8053
~$ tail rRH900m042012.txt
168.9963994000 59.9270559400 66.6178
169.3316494000 59.8629482200 69.1491
169.6658259000 59.7981164500 71.7741
169.9989224000 59.7325634200 74.3991


#!/bin/csh
set kazu = 1
foreach time ( 90621 90609 90521 90509 83021 83009 81821 81809 81721 81709 81621 81609 81521 81509 80821 80809 80721 80709 80621 80609 80521 8050
9 80421 80409 80221 80209 72921 72909 72821 72809 72721 72709 72621 72609 62121 62109 61009 60921 60909 60821 60809 52321 52309 52221 52209 52121
52109 50521 50509 50421 50409 50321 50309 50221 50209 50121 50109 43021 )
echo $kazu
set ifile = rMsfc010${time}.txt
set koudo = 925m
set ofile = rM-RHT${koudo}0${time}.txt

761752:02/11/29 00:42
# paste date data
set gyou = `awk '$1 == '$time' {print NR}' date.txt`
awk 'NR >= '$gyou' && NR <= ('$gyou' + 80) {print $0}' date.txt > tmpA
paste $ifile tmpA > tmpB
awk '( NR % 2 ) == 0 {print $0}' tmpB > tmpC
set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`
if ( $gyousu == 40 ) then
set temae = 40
else if ( $gyousu < 40 ) then
set aaa = `awk '$5 < 0 {print NR}' tmpC | head -n 1`
set temae = `awk 'NR < '$aaa' {print $0}' tmpC | wc -l`
endif
echo $temae
# paste nearest long-lat
set num = 1
rm tmpG
while ( $num <= $temae )
echo $num
rm tmpD
set database = `awk 'NR == '$num' {print $0}' tmpC`
set roop = 1
while ( $roop <= 24386 )
echo $database[1] $database[2] >> tmpD
@ roop++
end
paste long-lati.txt tmpD > tmpE
perl distance.pl tmpE > tmpF
set min = `awk '$2 <= 0.4 {print $0}' tmpF | sort +1 -n | head -n 1`
762752:02/11/29 00:42
# paste nearest long-lat
set num = 1
rm tmpG
while ( $num <= $temae )
echo $num
rm tmpD
set database = `awk 'NR == '$num' {print $0}' tmpC`
set roop = 1
while ( $roop <= 24386 )
echo $database[1] $database[2] >> tmpD
@ roop++
end
paste long-lati.txt tmpD > tmpE
perl distance.pl tmpE > tmpF
set min = `awk '$2 <= 0.4 {print $0}' tmpF | sort +1 -n | head -n 1`
set ikei = `awk 'NR == '$min[1]' {print $0}' long-lati.txt`
set tfile = rTmp${koudo}0${database[6]}.txt
set rfile = rRH${koudo}0${database[6]}.txt
echo $database[6]
echo $tfile
set tdata = `awk 'NR == '$min[1]' {print $0}' $tfile`
set rdata = `awk 'NR == '$min[1]' {print $0}' $rfile`
echo $database $ikei $tdata $rdata >> tmpG
@ num++
end
awk '{print $1,$2,$7,$8,$14,$11,$6}' tmpG > $ofile
@ kazu++
end
763752:02/11/29 00:45
762-758
長くて済みません。

無駄が多いスクリプトだと思います。
指摘して頂ければ
大変助かります。

764752:02/11/29 01:02
$ cat distance.pl
while (<>){
@val =/(\S+)/g;
$dist=((@val[0]-@val[2])**2+(@val[1]-@val[3])**2)**(1/2);
printf STDOUT ("$. %15.10f\n",$dist);
}
>>759
> ~$ head -4 rMsfc01090621.txt
最初と最後でデータ数違うけど、いいの?
つーか、やりたいことを書け。
こんなの読むのめんどくさ杉。スクラッチからのほうが早い。
>>761-762
おまけにendが一個足りない予感。
おれも思った。「読む気せん。」

読んでないので何やってるのわからんが10行くらいでできることをやってるのではないかとおもふ
あ、妙だと思ったら、>761-762で15行ほど重複してんのか。
endが合わねーはずだよ。
ちょと今、見てるけど結構時間かかりそう。
けなすわけじゃないけど、ちょっとawkを覚えたほうがいいかも。

tmpfileとpasteはawk内で処理すればいらないように見える。
loopも連想配列つかえば、必要ないように見えるし・・・

なんにしても、ちょっと時間がかかるのは事実・・・
気長にまってて。
半分くらいrubyに書き直したところで嫌気が差して>766を書いた。
はっきりいって、このコードから本来の意図を汲み取るのはかなり難しい。
>>766
>つーか、やりたいことを書け。

すみません。すみません。
3、4日レスできません。帰ってきたら、
日本語で、やりたいことをしっかりと説明いたします。

それまでどうぞ放置してください。

 #あわただしくて済みません。質問するタイミングを間違えました……

>>772
こんな糞質問でこれだけ構ってもらえてるのが不思議だ。
あんた運がいいネェ。
>>773
ヲレは自己鍛錬の為にみてるだけ。
自分の書くscriptってパターン決まってるんで、
人のをみて眼力つけてるわけですよ。
漏れは現実逃避のため(w

よく分からんのがこんなとこ。

* データを1/2に間引いてる理由
* rTmp900m042012.txt、rRH900m042012.txtのデータは一対一で対応してるよ
  うに見えるが、long-lati.txtとは対応が取れてないように見える
* long-lati.txtがファイル名やikeiという変数名から想像できる通り緯度経
  度だとしたら、hypotで距離を計算するのはおかしいんじゃないか

あとは大体察しが憑いた。
776名無しさん@お腹いっぱい。:02/12/02 18:55
どこからシェルを打ち込まれても自分自身の場所から実行させたいのですが・・・

$ ls /misc/
test.sh test.pl
$ cat /misc/test.sh
#!/bin/bash
./test.pl
$ pwd
/
$ /misc/test.sh

こういう状態で test.pl を動かしたいわけです。
>>776
test.sh に cd /misc を埋めておく、とか。
cd /misc してから test.sh を呼ぶスクリプトを書くとか。
778名無しさん@お腹いっぱい。:02/12/02 19:19
出来るだけこのスプリクト郡がどこに置いても使えるようにしたいんダスよ
自分の予感では 引数で自分自身のスプリクトを呼び出した命令($0あたり?)
から自分自身を引いて変数に入れてcd、のような気がするんだけど
・・・変換した文字列をどうやって変数に入れるのやら?

>>778
cd `dirname $0`
あと、「群」な。
780776:02/12/02 19:33
どもDeath。
$0 は偽装可能だけどな。
>>778
UNIX FAQ にもあるけど、portable な方法はない、が最終的解決
オレはこういうときは SCRIPTPATH とか環境変数に入れといてそれを使う。
あまりにもヘタれ方式だがとりあえず自分で使う範囲では問題ない。
784776:02/12/03 11:29
$0の方法では絶対パスでないと駄目なので万能の方法を考える・・・
コマンドと現在位置の複合でどうにかならないか・・・と
cd "$(pwd)/$(dirname $0)"
これで良いのかな!?良さげだけど
>>784
> $0の方法では絶対パスでないと駄目なので
なんで?
786776:02/12/03 12:05
# cat test.sh
cur=$(pwd)
cmd=$(dirname $0)
echo $cur
echo $cmd
echo $cur/$cmd
cd "$cur/$cmd"
これを色々な場所から相対パスで呼んでみそ
787名無しさん@お腹いっぱい。:02/12/03 15:05
始めてシェルスクリプトを作っています。
お手本を見ながら作っているんですがわからないとこが一つあります。
if(-e 変数) rm 変数
これってどういう意味でしょうか?
>if(-e 変数) rm 変数

シェルスクリプトをはじめて勉強するのであれば知らなくていいです。
cshではなくshを勉強しましょう。shでは

if [ -e 変数 ]; then rm 変数; fi

こうなります。
789名無しさん@お腹いっぱい。:02/12/03 17:09
おぉ!ありがとうございますだ!
ヒントになった気がする
-e なんて使うことあるんだ・・・
ヲレは -f と -d ばっかりだな・・・
791776:02/12/04 11:13
あいた、786 の方法では逆に相対パスのみが許されるんだな・・・
ってことは先頭に"/"があるかどうかで絶対パスと相対パスを
見分けてから実行か・・・シェルでそんな判断可能なのかな?
>>791
cmd="/bin/sh"
if echo ${cmd}|grep '^/' > /dev/null 2>&1; then
echo "aaa"
else
echo "bbb"
fi
# POSIX shell
if [ -z "${cmd%%/*}" ]; then
echo "$cmd"
else
echo "$(pwd)/${cmd}"
fi
794白鵜ト:02/12/05 18:26
Solarisの端末エミュレーターで以下のコマンドをうってみました。

%hensu=`date`

とすると
hensu=`date` : 指定があいまいです。
とエラーメッセージがでます。
なぜでしょうか?
>>791
ポータビリティに難が有るけど、realpathに頼る手も有る。
#!/bin/sh
# FreeBSD 4.3 以降
cmd=`realpath $0`
dir=`dirname ${cmd}`
echo ${dir}
cd ${dir}
>>794 csh系ぢゃない?
797名無しさん@お腹いっぱい。:02/12/05 21:43
ファイルarg-test1 の内容が
#!/bin/sh
echo $#
echo $1 $2 $3 $11 $12
shift 2
echo $1 $2 $3 $11 $12
のとき,
./arg-test1 1 2 3 4 5 6 7 8 9 10 11 12
を実行すると
12
1 2 3 11 12
3 4 5 31 32
になるのですが、なぜ 31 32 という数字がでてくるのでしょうか?
>>797
$11は${1}1と解釈されるから。
最近のものは${11} ${12}が使えると思う。
799名無しさん@お腹いっぱい。:02/12/06 15:29
suの後のパスワード入力まで全てシェルの中で実行することは
可能なのでしょうか?
現状 .rhostsにユーザ追加してrloginでしのいでいますが…
>>799
何を考えてるか怖くて確認する気にならないが
suのソース書き換えてパスワード埋め込んじまえば?
それかrootのパスワードを空文字にするとか(w
sudo
802名無しさん@お腹いっぱい。:02/12/06 18:41
>796
レスありがとうございます。
csh系だとどういう風に直せばいいのですか?
>>802 set hensu=`date`
804名無しさん@お腹いっぱい。:02/12/09 18:28
自身のホスト名やIPアドレスを変数で取得して
更に下位のシェルに引数として渡したいんですが・・・
>>804
どこでつまずいてるの?
カレントディレクトリ以下にあるテキストファイルのみを全て表示したい
>>806
がんがれ。
とりあえずできた。
けど、スマートじゃないと思う。
そうか。
% head Zenkoku.parted.dummy Zenkoku.all
==> Zenkoku.parted.dummy <==
1 hokkaido
2 aomori
3 iwate
4 miyagi
5 akita
8 ibaraki
10 gunma
11 saitama
12 chiba
14 kanagawa

==> Zenkoku.all <==
1 hokkaido
2 aomori
3 iwate
4 miyagi
5 akita
6 yamagata
7 fukushima
8 ibaraki
9 tochigi
10 gunma
で、Zenkoku.parted には
6 yamagata
7 fukushima 
9 tochigi
13 tokyo
が抜けています。

このZenkoku.partedを使って、Zenkoku.allから
6 yamagata
7 fukushima 
9 tochigi
13 tokyo
を抜き出す方法ありませんか?
grep -v
join
などを使って
出来そうで
出来ません。
>>811
grep の -f
join -v 1 Zenkoku.all Zenkoku.parted
814811:02/12/17 13:34
有難うございました。

findについて質問します。

find ~/work -ls
を最終更新時間順に並べるオプションありますか?

というのも、find -ls の最終更新時間が
11月 1 10:09
のように表示されて
| sort
の構文考えるのがめんどくさいのでfindのオプションで解決できない
のかなーと思っています。


>>815
>>704-
>>816

special 39s!
m(__)m
historyが吐くコマンド履歴から、実行された日付と時間は
判りますが、「どのディレクトリで実行されたか?」を知る
手立てはありませんか?

さっきのコマンドの結果、何処のディレクトリに保存したっけ?
と一度は誰しも思ったことがあるはずです。


微妙にスレ違いですけど、皆さんの意見聴きたいです。
http://pc.2ch.net/test/read.cgi/php/996105815/964-965
を質問した者です。

マルチコードの話なので、正規表現がいいかなと思いましたが、
あっちに出したのが、スレ違いだったかも。

こっちで再度聞いときます。
csplitでできそうだが、環境は?
>818
プロンプトに$(pwd)いれて、screenのログから引き抜くとか。
822964(正規表現):02/12/20 20:30
OSはRH7.2です。
% csplit --version
csplit (textutils) 2.0.14

>>822
少なくともAsumiから入れたcsplit 2.0.16ではできた。
824名無しはん@EMACS:02/12/21 17:19
>818

cd|pushd|popdのコマンドはhistoryに残ってないのか?
825818:02/12/22 22:26
>>824
zshでsetopt AUTO_PUSHDしているので、明示的に,pushd,popdを使っていません。
でも、それらからコマンド実行した位置(ディレクトリ)を復元していくのって、めんどくさくありませんか?




>>821
なるほど、これ試して見ます。

% grep -A2 "~/claptrap" ~/.screenLOG/screen22_12(02).log

とかで、何で存在しているかわからない"~/claptrap"の意味が
思い出せたりしますね。


826名無しさん@お腹いっぱい。:02/12/25 10:59
find wwwview | afio -ovZ - | split -b 2000m - pack.afz.

afio で圧縮するときの2G回避のコマンドだが"-"の意味が判らん。
んーどういう意味だろ・・・?
>>826
コマンドにより異なるが、標準入力 or 標準出力を表わすことが多い。
man afio, man split せよ。
828826:02/12/25 11:17
なるへそ。コマンド自身にそういうのがあって、明示的に標準入力や
標準出力と示しておいてパイプで送るのね。ってことはコマンド依存か・・・
829名無しさん@お腹いっぱい。:02/12/28 04:31
かなりくだ質なんですけど、

freebsd/emacs21のawk-modeで、各文の最後に';'を打たないと
正しくインデントしてくれません。
これってemacs21のバグなんでしょうか?
それともawkで最後に';'つけるのって慣習なんでしょうか?

正しくインデントするために、';'つきでスクリプト書いてるのですが,
人に誤まりとして指摘されたらちょっと恥ずかしい気がします。
>>829
あくまで想像だが・・・

awk-mode は c-mode をベースにしてるから ; を文の終端と判断
してるんでは? ちなみに emacs のバージョンによる差はないと思う。

awk では ; は省略可能となってるだけで、つけたからといって
間違いというわけではない。オレは必ずつけてる。
emacsのawk-modeは正規表現の中の#をコメントと勘違いするので、

if($0~/^#/){
....
}

なんて文を書くとぶっ壊れる。行末の;の件もそうだけど、
c-modeからの改造が完全じゃないんだろうね。
832綺麗な書き方:03/01/07 22:19
% cat test.awk

$5 ~ /●/ {
sub(/●/,"a",$5)
print $5,$6,$7,$8,$9,$10,$11,$12,$13,$14
}
$6 ~ /●/ {
sub(/●/,"b",$6)
print $5,$6,$7,$8,$9,$10,$11,$12,$13,$14
}

$7 ~ /●/ {
sub(/●/,"c",$7)
print $5,$6,$7,$8,$9,$10,$11,$12,$13,$14
}



$14 ~ /●/ {
sub(/●/,"j",$14)
print $5,$6,$7,$8,$9,$10,$11,$12,$13,$14
}


これをもっと短く書きたいのですが……

なにか方法ありませんか?
なお、シェル使っても構いません。
BEGIN{
for(i=5;i<=14;i++)
a[i]=sprintf("%c",92+i)
}
{
for(i=5;i<=14;i++)
if(sub(/●/,a[i],$i))
print $5,$6,$7,$8,$9,$10,$11,$12,$13,$14
}
834名無しさん@お腹いっぱい。:03/01/07 23:40
シェルスクリプトの中で、日付けを調べる部分があるのですが
FreeBSD の strftime(3) を見て

`date +%G`

とした部分があります。今日なら 2003 が、2002/12/31 なら 2002
が入ると思ったのですが、2002/12/31 に動かしたら 2003 が代入
されまた。なぜでしょうか?
年は%Yだろが。もいちどman読むよろし。

%G is replaced by a year as a decimal number with century. This year
is the one that contains the greater part of the week (Monday as
the first day of the week).

年の最終月曜日からずれるってこった。
>>835
さんきゅ。
837名無しさん@お腹いっぱい。:03/01/11 21:28
Sat Jan 11 21:24:39 JST 2003
の2コ目と3こ目の
Janと11をディレクトリの名前にして
そのひ書いたドキュメントとかコードを格納したいのですが
dateコマンドなどを使ってディレクトリをコマンド一発で作りたいのですが
どういったスクリプトを書けばいいでしょうか?
教えてください
838名無しさん@お腹いっぱい。:03/01/11 21:33
AWK って複数ファイル扱えますか?

例えば、メインのフィルタ処理とは別に、別ファイルからパラメータを読み込む
とかできますでしょうか?

いろいろと探してみたのですが、基本は1ファイル入力のフィルタ何でしょうか?
>>837
mkdir `LANG=C date +%b%d`
とかかな? GNU coreutils-4.5.4
例えばログの最終2行を取ってきて、
それにawkするとどうなんの?
1行目だけが処理される?
841名無しはん@EMACS:03/01/11 22:32
>>838
> AWK って複数ファイル扱えますか?

扱えるよ。引数で与えられた順に順次処理していく。

> 例えば、メインのフィルタ処理とは別に、別ファイルからパラメータを読み込む
> とかできますでしょうか?

例えば、パラメータのファイルをフィルター処理したらパラメータを設定して、
そうじゃない時は、目的の処理をするようにスクリプトを作って

awk -f (スクリプト) (パラーメータのファイル) (処理ファイル) (処理ファイル)....

とすればでけるやろ。スクリプトの作り方の問題や。

普通は

awk -f (スクリプト) 変数=値 変数2=値2 (処理するファイル) ....

とする方が多いけどね。

>>838
FILENAME って変数に現在読み込み中のファイル名が入っている
FILENAME == "param.dat" {
パラメータの処理
}
とかすれば、いける

>>840
質問のいみがよーわからんが、2行流せば、2行処理するだろ
>>838
可能。getlineを用いる。例文を挙げる。

awk '{
if ($1 == 10) {
getline < "secondary.input"
print
} else
print
}'
>>841
オレは逆に
awk -f hogehoge.awk data-file parameter-file
のように最後にパラメータを書き、それを >>843 のように処理して
最後は ARGC-- であぼ〜んするのが普通だな。
parameter-file を指定しない場合は default 値で動作させるのも基本。
845841:03/01/12 02:08
>844

それは普通のコマンドみたいなオプションの使いかたで判りやすいだすな。

ついでに補足で>842みたいな処理で

BEGIN{ hogehage }
FILENAME ~ /.prm$/ {
パラメータの処理
NEXT
}
普通の処理

ってパラメータファイルを複数指定でけるようにすると、

awk -f hoge.awk data1 para1.prm data2 data3 para2.prm data4

てなふうに途中で処理が変えられたりするんだ。

846名無しさん@お腹いっぱい。:03/01/14 23:51
シェルスクリプト内でcdしても
スクリプトが終るとその子シェルがしんで
結局移動できませんが
親シェルにも移動してもらうにはどうすればいいですか?
>>846
このスレ頭から読んでみ
848名無しさん@お腹いっぱい。:03/01/15 00:04
>>847
わかりますた
ありがとう
849名無しさん@お腹いっぱい。:03/01/15 03:20
some strings not contain bracket <another string> stringsue
↑の行の< >内だけを sed で表示する方法ってありますか?
851名無しさん@お腹いっぱい。:03/01/15 03:53
IFSの中身は改行とタブとスペースらしいですが
それプラス:とかできないでしょうか?
852山崎渉:03/01/15 12:49
(^^)
853名無しさん@お腹いっぱい。:03/01/15 16:26
f, f1, f2, f3 という4つのfileにそれぞれ“ls”,“ls -F”,“ls -l”,“ls -lF”と記述されているとする
(“”は実際には記述しないし,“”内に改行は存在しません).この条件下で以下のscriptが全体的にどういったものかを
簡単にで結構ですので、説明していただけませんか。お願いします。
#!/bin/sh
case $# in
1) com=f1
;;
2) com=f2
;;
3) com=f3
;;
*)
com=f
;;
esac

eval `cat $com`
>>853
マルチキター
>>853
どの辺がわからないの?
856名無しさん@お腹いっぱい。:03/01/15 17:02
853です。このscriptによってどういった結果が得られるのでしょうか。
>>856
ふつーに実行すればどういう結果になるかわかると思うんだけど。
>>856
自分でスクリプトを読んでみて、どこまでわかった?
859名無しさん@お腹いっぱい。:03/01/15 17:26
わかりました。すいません、ありがとうございます。
860名無しさん@お腹いっぱい。:03/01/15 17:29
できればもう1つお聞きしたいのですが、
some strings not contain bracket <another string> strings...;
なる行の< >内だけをsedで表示する方法を教えていただけませんか。
>>860
そのネタ飽きた
862名無しさん@お腹いっぱい。:03/01/15 17:34
最後にこれだけ教えていただけませんか。お願いします。
>>860
つうか俺が犬板で答えた。
864名無しさん@お腹いっぱい。:03/01/15 17:37
犬板ていうのはなんでしょうか。どのようにして見ることができますか。
>>864
Linux 板。
866名無しさん@お腹いっぱい。:03/01/15 17:44
>>860
sed 's/.*/another string/'
>>853
>>860
小生、他のスレで見た記憶が・・・
でじゃぶーか・・・
はよねよー
869名無しさん@お腹いっぱい。:03/01/17 12:43
ファイル中からshell scriptで要素名(またはタグ)を
抽出するにはどうしたらいいんでしょうか?
>>896
と言われましても…どーゆー形式なのかによってやり方は…
一般的にはgrepとかsedとかperlとかawkとかを組み合わせてやるんじゃないんですか?
871名無しさん@お腹いっぱい。:03/01/20 22:10
sh スクリプト中で、ファイルの内容を一行づつ読んで、
その一行ごとに何かしたいときってどうすればいいんですか?

たとえば、
a
b
c
d
と書いてあるファイルに対して、

echo a
echo b
echo c
echo d

とか実行したいときです。
872名無しさん@お腹いっぱい。:03/01/20 23:03
>871

$ cat foo
#!/bin/sh

while read line
do
echo $line
done < $1
$ cat bar
a
b
c
d
$ ./foo bar
a
b
c
d
$
873871:03/01/20 23:20
>>872
できました。Thanks!
>>871
awkのほうがよくない?
恐ろしく長寿スレが多い板だな。。。
876名無しさん@お腹いっぱい。:03/01/21 13:03
<title>タイトル</title>
の「タイトル」が欲しくて
$ wget -q -O - http://aaa.bbb.ccc.ddd/index.html | sed -ne 's/<title>\(.*\)<\/title>/\1/p'
とやっているのですが、
<title>
タイトル
</title>
こういう時も対応するにはどうすればいいのでしょう?
emacsだと
<title>[C-qC-j]*\(.*\)[C-qC-j]*</title>
にあたるやつです。
877876:03/01/21 13:38
事故解決しました。すいません。
s/<title>\(.*\)<\/title>/\1/p
/<title>/{
N
s/ *\n/ /
s/<title>\(.*\)/\1/p
}
書き方的にはこれでオッケーですかね?
878名無しさん@お腹いっぱい。:03/01/23 23:28
shのtrapについて質問があります。
今、hostAにmain.sh、hostBにsub.shってのがあるとします。
で、hostAからhostBに対してrshの実行が可能だと仮定します。
両方のスクリプトにtrapで、killのシグナル(15)を拾えるように
記述します。つまり、

main.shは
-------------------------------------------
#!/bin/sh
trap "echo \"main.sh killed\"; exit 1" 15
rsh hostB sub ~sub.sh
-------------------------------------------

sub.shは
-------------------------------------------
#!/bin/sh
trap "echo \"sub.sh kill\"; exit 1" 15
# ずっと2chと出力
while true; do
echo "2ch"
done
-------------------------------------------
です。で、hostAからmain.shを実行すると
hostB上でのsub.shが実行されて、ずっと"2ch"の文字列が表示されるんですが
この状態で、hostA上の別のコンソールからsh main.shのプロセスをkillしても
終了してくれません。
理想は、main.shをkillすると、main.shでもsub.shでもkillのシグナルを
trapしてくれることなんですが、可能でしょうか。
どなたかよろしければご教授くださいm(__)m
879名無しさん@お腹いっぱい。:03/01/23 23:28
うは、長くなってすみません∧||∧
main.shのtrapにrsh hostB kill -15 PIDって書くのはだめ?
PIDはこれまたリモートシェルでps -aef|grep sub.sh|awk '{print $1}'
とかで、拾うとか。。。
手元にマシンがないからためせないけど。。。
ちなみにsub.shは、バックグラウンドで起動して
main.shをスリープしとかないとPIDは拾えないかもしれない。
882名無しさん@お腹いっぱい。:03/01/24 15:32
awkを使わないで文字列抽出ってできるのかいな?

hoge0 hoge2 mona2 giko0
hoge1 huga0 monaX giko2

の2行目の3番目を表示しなさい!って 一度TEXT化したらできるかもしれないけど

あたまいてぇ〜
>>882
head -2 | tail -1 | cut -f3 -d' '
おおおお、そーきたか!
目からうろこです

なるほど!
TNX
885うんじゃらげ:03/01/25 05:28
/bin/sh の定番本教えてください。
「入門UNIXシェルプログラミング」以外にもお勧めってありますか?

sh でなく bash だが、目を通しておいて損はない
ttp://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO.html

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

for file in $file_list
do

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

echo $拡張子
done

#よろしくおながいします。
>>889
basename
>>889
あーごめん、拡張子を抽出するのね。${var##word} かな。

for file in `ls`
> echo ${file##*.}

この方法だと、tar.gz なファイル名だと gz ってのが致命的だな…
ちなみに、CSHでは。。
#!/bin/csh -f
foreach fn (`ls`)
echo $fn:e
end
893名無しさん@お腹いっぱい。:03/01/26 02:24
bshでお知恵拝借願います。
どうしてもスマートなやり方が思いつかないもので…。

{
A.sh
echo $? > tmpfile
} | grep -v '^#'

・A.shが吐くメッセージのうち、先頭が#の行だけ出力したくない。
・A.shの終了ステータスを取りたい。
終了ステータスをファイルにリダイレクトする以外に良い方法はないでしょうか?
へるぷ〜〜

数値 で

10.0
22.1
210.1
20.0

ってhoge.txt があって
全部足したいんだけど…

cat hoge.txt | awk '{print $1+$1+$1+$1}' ではだめぽです〜

しぇるでなんとかならんですか?!

10.0 22.1 210.1 20.0 なら足せるのだが…鬱
あ、いや、shellでなくてもなんでもいいんですけど
縦に書かれている数値を横に並べるって方法でも
ヒント頂ければ幸いです

10.1
14.2
22.0

10.1 14.2 22.0

ってな感じ
>>895
echo `cat hoge.txt`
>>894
% awk '{ total += $1 } END { print total }' hoge.txt
>>893
$? を変数に入れとけば?
>>889
expr を使うなら

% filename=foo.tar.gz
% expr //$filename : '.*/.*\(tar.gz\)'

右側の部分は正規表現なのでちとめんどいかも。
>>893
ぜんぜんスマートじゃなくて、もしかした sh のバージョンによるかも
しれないけど、こんな感じでどうよ。

((A.sh; echo $? >&3) | grep -v '^#') 3<&1 | cat

最後の cat はてきとうに変えてくれ。標準入力から $? が読めるはず。
( ゚д゚)ポカーン

>>896
恐れ入りました!!、そんな簡単になるとは・・・・・・・・・

>>897
awkはEND がカギなのですね・・・・・・・・ 

まだまだ修行が足りませんでした逝ってきます
多謝多謝
したの<例>の${code}に処理を施して、先頭の5424を
取り出すにはどうすればいいでしょうか?

<例>
code=542489
codehead= ${code}を処理する書き方が分かりません!

>>902
cat hoge | grep 'code=' | sed -r 's/.*code=([0-9]{4}).*/\1/'
904cut 大好き:03/01/26 10:32
>>902
先頭4文字を取り出したいなら
codehead=`echo $code | cut -b1-4`
最後の2文字を消したいなら
codehead=`echo $code | sed 's/..$//'`
905expr 大好き:03/01/26 10:39
>>902
先頭4文字を取り出したいなら
codehead=`expr $code : '\(....\)'
最後の2文字を消したいなら
codehead=`expr $code : '\(.*\)..'
906902:03/01/26 12:49
適当にやっていたら、
codehead=${code::4}
で出来ました。(#!/bin/shだけど、多分bashの構文)

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

>>906
くだ質でいいじゃん。
>>900
いえいえ、たかがステータス取るだけでTMPファイル用意するのも
馬鹿馬鹿しいと思ってたので助かります。明日会社で試してみます。
>>893
とった終了ステータスはどう使うつもり?
910889:03/01/26 22:55
>>891
>>892
>>899
サンクスです。
勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
とりあえず対話形式でターゲットディレクトリ配下のファイル群を
接頭辞+連番+拡張子
に変更するような。

参考にさせてもらいます。
拡張子が無いファイルだとか.tar.gz、tar.Z等の
処理をまだ考えなきゃいけないんですけどね。
感謝
911名無しさん@お腹いっぱい。:03/01/26 23:49
shの変数名そのものに、別の変数の値を入れるにはどうやればいいのでしょうか

たとえば、value_2ch_tempという変数に"abc"と入れるために

hoge="2ch"
value_"$hoge"_temp="abc"
echo value_"$hoge"_temp

とするとうまくいきません・・・
どうすればいいのでしょうか。
負荷分散で複数のWebサーバをApacheで立ててるんですが,
ログファイルの acces_log にエントリがばらばらになってしまいます。
なので全部を単一ファイルにマージして,各行の時間順に再度ソート
したいんですが,どうやれば一番スマートでしょうか?単純にすると
えらいメモリ食って遅くなりそうで…
>>912
定期的に別マシンに送って、そっちで merge する。
914雨なのね:03/01/27 00:19
>>911
> value_"$hoge"_temp="abc"

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

merge sortを使え。

http://mergelog.sourceforge.net/なんてものある
916名無しさん@お腹いっぱい。:03/01/27 00:43
>>914
おぉ、ほんとだ
evalって、代入側でも参照側でも使えるんですね
ありがとうございましたm(__)m
変数が展開された後の文字列がevalに渡るから、
代入側とか参照側とか関係なし。
918名無しさん@お腹いっぱい。:03/01/27 01:18
なるほど・・・。もっとeval勉強せねば。

ついでにもう一つ、上でeval value_"$hoge"_temp="abc"としたときに
他の変数に代入するときは、

puni="eval echo $`echo value_"$hoge"_temp`"

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

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

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

(A.sh ; echo ":${?}:") | grep -v '^#' | awk -F: '
!/^:.*:$/{print $0}
/^:.*:$/ {STS=$1}
END {exit STS}'
exit $?
>>910
> 勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
いったいどういうシェルかと一瞬迷ったが、
リネーム用 シ ェ ル ス ク リ プ ト か。
923910:03/01/28 21:16
>>922
おぉ、確かにそう取れる。
いや、ただのムフムフ画像管理用のスクリプトなんですけどね。
これがケッコー懲り出すとメンドーで...
924878:03/02/03 23:40
インフルエンザで一週間寝込んでました(´Д⊂)
>>880さん
main.shのtrapにそう記述したのですが
main.shのPIDをkillしてもsignal 15を拾ってくれません(´・ω・`)
それ以前に、main.shのPIDをkillしても終了すらしません・・・

で、rshのPID(なぜか2プロセス立ち上がってます)をkillすると
止まってくれるんですが、これではtrapする意味がないれす。

やっぱり無理なんでしょうか(´・ω・`)
925名無しさん@お腹いっぱい。:03/02/06 22:35
shのスクリプトでしつもんがあります。

telnet localhost 21 << EOF > RESULT
とした時に
#cat RESULT
Trying 127.0.0.1...
Connected to kmdr (127.0.0.1).
Escape character is '^]'.
のような感じでレスポンスコードがとれません。

# telnet localhost 21 > RESULT
# quit
だと
Trying 127.0.0.1...
Connected to kmdr (127.0.0.1).
Escape character is '^]'.
220 Welcome To KOMADORI
221 Goodbye.
のように取れるのですが、<<を使わないで標準入力にquitを
送る方法がわからないため行き詰まっています。

FTPなら
ftp -v -n localhost << _EOF > RESULT
#cat RESULT
Connected to kmdr.
220 Welcome To KOMADORI
500 AUTH not understood.
221 Goodbye.
のようにレスポンスコードが拾えるのですが、、、

telnet -n hoge とかでトレースをとってもレスポンスコードが入りませんでした。
telnetの結果をレスポンスコード付きで拾うのはshellスクリプトでは難しいのでしょうか?
>>925
expect
927925:03/02/06 23:10
>925 さん ありがとうございます。

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

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

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

いっそのこと泣きながらCでがりがり、、、

別プロセス立ち上げて名前付きパイプ経由で
とったらうまくいかないかなとか今思いつきました。
できあがったら報告しまふ
930名無しさん@お腹いっぱい。:03/02/07 17:44
>>925

( echo quit ; sleep 1 ) | telnet localhost 21
( echo head http/1.0; sleep 1 ; echo \n ) | telnet localhost 80
( echo quit ; sleep 1 ) | telnet localhost 110
( echo helo ; sleep 5 ;echo quit ; sleep 1 ) | telnet localhost 25

sleepはサーバがお返事がのろいとき適宜いれるべし
>>930
ださっ
932名無しさん@お腹いっぱい:03/02/07 21:06
こんにてぃわ。

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

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

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

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

これでお願いします。
>>936
man find しる。
du -a /hoge | grep hage | awk '{print $2}'

# du より find のほうがいいかな?
# オレは手軽なので du 使うけど
expect試してみた。結構便利。

#!/usr/bin/expect
set site localhost
set from ore@localhost
set to posmaster@localhost
spawn telnet $site 25
log_file smtp.log
expect "220*" { send "helo $site\n" }
expect "250*" { send "mail from: $from\n" }
expect "250*" { send "rcpt to: $to\n" }
expect "250*" { send "data\n" }
expect "354*" { send "test\n.\n" }
expect "250*" { send "bye\n" }
send_user "script_end\n"
close
exit 0
940名無しさん@お腹いっぱい:03/02/07 23:49
>>933〜938

どうも!

決戦の日は近いぞ。

ガンバルゾぉぉぉ!
>>940
何と戦うのかは知らんが、manは味方にしとけよ。
>>936
find /hoge -name "*hage*"
943名無しさん@お腹いっぱい。:03/02/08 01:09
>>936
grep -lr hage /hoge
>>942
そりゃファイル名にhageを含むものだろう。
945名無しさん@お腹いっぱい:03/02/08 15:19
誰かいますか?

rm -Rf 'find / -name erogazou'

・・をしたいんですが、 "'" をサブシェルにしてもエラーでした。
察しの通り、rm の man を読んでない結果です。

検索結果に再帰的な問題はありますが、それは別として検索結果からの
該当ファイルとディレクトリを全て削除するよい方法ないでしょうか。
946んにゃ。。。:03/02/08 15:33
↑解決。

すっかりボケてるよ(w
>>945
どんなエラーだよ
948名無しさん@お腹いっぱい。:03/02/08 15:36
pythonってどうよ?
>>948
すごいよ。
>>948
ム板に行け。
行末に<br>とかつけるにはどしたらいいんすかね?
(hoge.txt)

hoge
huga
mona

hoge<br>
huga<br>
mona<br>

数値だったりする場合もあるので・・・・うにゃ〜
>>951
cat hoge.txt | sed 's/$/<br>/g' > hoge.new.txt
やぱsedでできるのか〜
修行が足りませんですた逝ってきます
>>953
むしろ拡張正規表現だけでいいから覚えれ。
sedでもperlでもgrepでも使えるから便利だぞ。
拡張正規表現ですかGoogってみます
ありがとやんした!
http://www.kt.rim.or.jp/~kbk/regex/regex.html
ネタが少し古めだけど、正規表現を一通り網羅してあるので便利。

>grepで使用できる正規表現
>egrepで使用できる正規表現
>sedで使用できる正規表現
>awkで使用できる正規表現
>perlで使用できる正規表現
>pythonで使用できる正規表現
>rubyで使用できる正規表現
>gawk 3.0で使用できる正規表現
>Tcl 8.1(以降)で使用できる正規表現
957名無しさん@お腹いっぱい。:03/02/11 20:26
awkで/begin/,/end/な
感じである範囲を検索しようと
したところ行が長すぎると異常終了します
まあ途中4kぐらいの行があるんですけど
でRSで適当な文字を指定したら
その文字だけかけちゃうのね
何かよいやりかたはないでしょうか
ちなみにsolaris7です
nawkでもだめでした
w3mで放置されたので, こちらで質問します.
(よく考えればむこうではスレ違い)

シェルスクリプトで
   default_option='-o extbrowser=mozilla'
   w3m $default_option
みたいにするとうまく行くのですが,
   default_option='-o extbrowser=mozilla %s &'
   w3m $default_option
だとダメです.

どうすればいいんでしょう?
>>958
default_option='-o extbrowser=mozilla'
w3m $default_option %s &
960958
>> 959
どうもです.
それだとw3mが "%s" を引数(URL)だと思っちゃうからダメなんです.

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