ない!!のでつくりました
CSVファイル内からシェルに引数で渡す時
オークで$0~$9を使うのはしっとりやすが
00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
15つ目の引数を引っ張りたい時はどうしたらいいでしょうか?
よろしくおねがいします
うはは、これじゃループだな
応援あげ
つーかAWKをちょっと使ってるから期待も有る(w
AWK256本は読んだこと無い
Bash256本とかだしゃいいのにな…アスキーさんよぉ
5 :
viマン@HP-UX(当時):01/09/13 03:31
AWKは知らない。(昔流行った駄洒落。)
↑しょうもない駄洒落で上げちゃった。逝って来ます。(寝ます。)
AWKは望まない。(あ~手が勝手に…)
あったんですね、修行してきます。
でもよかったら教えてください。
10 :
名無しさん@お腹いっぱい。:01/09/13 13:11
awk は書かねぇ たった一行
awkのprint文で,「"sample.txt" isn't found.」って
出力させたいんです。どうすればいいの?
13 :
名無しさん@お腹いっぱい。:01/09/13 22:29
awk '{print "\"sample.txt\" isn\047t found"}'
でどう?
Aho さんは、アホですか?
ってのもよくあった気がする。
awk じゃなくても
echo " 表示させたい文 " で出力できるよ?
Cシェルのループの記述について質問
---
echo -n "繰り返し回数を指定してください。(1~100)"
set count = $<
---
繰り返し回数を取得しました。
この回数ループするにはどう書けばいい?
C言語のfor文みたいに書けばいいの?
while ($count > 0)
hoge
hoge
@ count--
end
@マークはどういう意味ですか?
13さん,14さん
ありがとう。
まちがえた。
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の問題のような気がしますが、
どうやればいいのか分かりません。
啓示を授けてください。お願いします。
% awk '{printf"TEL='\'%s\'';\n",$1}' moto
エレガントジャナイネエ。
24 :
名無しさん@お腹いっぱい。:01/09/15 16:00
>過去ログをみろ
まったくです。24さん。すんません。過去ログつーかすぐ上ですね。
(恥ずかしい...。)
% awk '{printf"TEL=\047%s\047;\n",$1}' moto
TEL='000-111-2222';
TEL='000-333-4444';
TEL='000-553-5555';
できやした。
過去ログ巡礼してきます。(哀
ApacheでCodeRed*のログを切りたいのですが
XXXX
NNNN
を切り出す
おなじIP、ドメインを1つにする
時間も出す
って簡単にできないでしょうかねぇ?
どっかの過去ログで
NN、XXと時間を削除しただけの吐き出しスクリプト(つーかコマンドだな)は見かけたのですけどね~
みなさんはどのようにして顧客にログ提出してますか?(特に今回のCode系)
26へ データを切ってそれだけのデータにするとか?
もうちと説明くれないかな
>26
そういうもんはそのつど作るもんだ。
それで金もらってんだろ?
>>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;}'
自分のへたれ具合に悲しくなりました。鬱だ屍脳。
おもしろい
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
意味無し...
HTTPのアクセスログから
不特定のIPアドレス、アクセス数をシェルか、オークで収集、統計できますか?
できるとしたらやり方を教えてください。よろしくお願いします。
>>36 回答1、できる
回答2、ハッシュを使う
以上
awk、sedでできることはperlでなんでもできふか?
perlってやっぱ覚えとくと便利で不可?
>38
perl は system を使えばなんでもできるYo!
awkもsystemなかったか?
>>39 なるー。るびーも能力的には互角?
まあ、テキスト処理が楽に統一的に使えそうでいいな
っておもてマフ。
42 :
名無しさん@お腹いっぱい。:01/09/19 22:31
>>38 perlは、syscall.phをrequireして、
引数をpackして直接syscallよびだすとなんでもできるよ
>>40 systemはawkにもある。
>>36って同じ質問をいくつものスレッドでするし、
前の$15の件も解決したんだか、しないんだか何も言わないし
なんだかな~。
>43
たぶん望む答えが出てきてないんだろうな。
つーか、自分が何を望んでいるかがわかってないのか。
すみません 私がカキコしてるのはここと便利なシェルをみせろの二つっす
$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
だろが!!!
馬鹿たれが!!!!!!!!!!!!!!!!!!!!!!!
そんなこともわからんのか!!!!!!!!!!!!!!
チンカス
マンカス!
ふう。
"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 ハード/シンボリックリンクのことですね。
それは知ってる(と思う)
複数の美術館からもらってきた美術画像に同じものが
大量に含まれているんですよ。
59 :
名無しさん@お腹いっぱい。:01/10/01 22:53
>>56 なるほど.... find -lsで"バイト数-名前 ディレクトリつきの名前" という形
にしてソートして抽出するわけですね。変なファイル名もはいっているので
(オレが作ったわけじゃないから)、自分でももうちょっと考えてみます。
しかしよく考えたら数万行ソートしなきゃならんのだな。
>>59 > しかしよく考えたら数万行ソートしなきゃならんのだな。
ソート(そーっと)やって下さい。(オヤヂギャグ)
11万行ぐらいあるけど、
今の機械ではこれくらい一瞬ですね。
変な名前のファイルはあらかじめ排除しておくことにしたけど、
大文字小文字の問題があることを発見したのでもうちょっと検査中。
参考になりました。ども。
その後、ファイル名とサイズがいっしょってだけでは
まだまだ重複があることに気づき、
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"
で検索すると、そのものズバリのソフトが結構出て来たぞ。
多くは書かないたった一行。
お祝いに美術画像おくれ。
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
どのシェルがお勧め?
昭和シェル
ラルク(以下省略)
サム・・・。
なんで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 に登録すればいい。
これくらいなら自分で書けるだろう?
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 でも使ってください。
92 :
名無しさん@お腹いっぱい。:01/12/09 15:20
$ sed s/foo/var/g < FILE | cat > FILE
>>92 これって安全な事が保証されてますか?
もしそーだったらスゲー便利。
思いつきで書いたけど、よく考えたらチョー危険です。
出力バッファリング範囲内しか保証しません。
cat の部分が確実にバッファリングするコマンドならいいんだけど。
なんかなかったかなぁ。
>>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して一撃でできない?
その程度のものをわざわざ作んなくていいんじゃないかなぁ?
エラー処理と言うは?
お教えいただけないでしょうか?
>106 笑った人に聞けば?
>>106 tarの後に無条件でrmしてるよね?
もしtarが失敗してたら、
バックアップとらないままlogは「あぼーん」でしょ?
(ここよりも、その人にちゃんと理由を聞いて将来の糧とするべし)
もう、無茶です。無理です。
私の枕もとの靴下の中に、単位を忍ばせてって下さい。
日本にはサンタさんはいませんか???
パラメータとして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を計算させるのか?
それはかなり高度だな。ってゆーか、用途を激しく間違ってる。
それに比べて行数カウントの方は溜息つきたくなるほどの情けなさだ。
わざわざスクリプトにする必要がない。やっぱり用途を激しく間違ってる。
出題者はいったい何を考えてるんだ?
やってみたら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#.UB@4.86#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
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
115 :
FNS (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 あ、"$filename"とくくらないと減点だな。
awkで1のようなテキストを2のような形に整形したいんですが、どうすれば
いいんでしょうか。
1
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という風に切り出せれば問題ないんですが。
要素数は不定です。
よろしく。
これでどうよ。
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無いから動かせないんです。
間違えました。
mv muni fuga です。
マスタを更新して又参照したい感じ。
>>121 まず文法的にだめ。
セミコロンが抜けてる。
while read V1 V2 ; do
while read V3 V4 ; do
変数を参照するには $ をつける。
[ $V1 -eq $V3 ]
-eq は数値の比較だが、いいのか?
アルゴリズムでは、mv muni fuga はもうひとつ
ループの外じゃないとだめ(muni は $V1 = $V3
のエントリしか含まないので)。
>>123 ご指摘どうもです。
セミコロンとダラー忘れてました。反省。
>アルゴリズムでは、mv muni fuga はもうひとつ
>ループの外じゃないとだめ
一致しなかった分を又fugaに戻さないと駄目って事ですか?
例えば「mv muni fuga」の代わりに「sort -mu -o fuga -k1n muni fuga」
なんてのは通用しますかね?
(思いつきで書いてるだけなので文法的に自信無しです)
>>124 一致しなかった分を捨てるということは、fuga の一行目の
$V1 と値が違うものはすべて捨てられてしまうがいいのか?
マージして sort するのは意味的には正しいが、mv を外に
出すのと同じことだと思うが?
2行でいいから、fuga, hoge の例を出してくれた方が説明
しやすいんだが。
sed 's/Д/∀/g'で、どだ!
>>125 hoge、fugaはこんな感じです。
トランザクションhoge → 「23:air:fly」
マスタfuga → 「23:air:champ」
更新されたマスタfuga → 「23:air:fly:champ」
トランザクションが複数になった場合、
又whileループで回すと思うんですが、
その際常に更新済み且つ不一致を含む
fugaを読ませたいなあと。
hoge1とfugaでマッチング
→ 中間ファイルmuniとfugaでマージ
→ hoge2とfugaでマッチング
こんな感じでやらせたいです。
>>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
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つファイルがあるんですが、これを一まとめにすることって可能なんでしょうか。
長くなりましたが、ご教授宜しくお願いします。
>129
$ (true && echo catched)|tee foo
catched
$ (false && echo catched)|tee foo
$
すみません、そうではなくて、
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
でどうよ。
>135 >134でどこがあかんの?
$ (make a && make b)|tee foo
make aのみteeに出したいんだったらmake bを/dev/nullに捨てればよし。
>>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
146 :
名無しさん@お腹いっぱい。:02/03/15 01:09
ユーザーや、新規ドメインやらを書かなければならない
新米スクリプターに捧ぐ
# 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にマージさせて終り
漏れが厨房の頃に作ったスクリプトです
勝手に使いやすいように直してくれ
つーか、へたれでスマソ
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 omaemona@hogehoge.mona
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
AwkをShell(bash)に変えたのですね
つーか、早いですー
やぱ、みなさんさすがですね
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 サンプルを提示してください。
サンプル書きます。
abc abc def efg xyz・・・
abc def efg vwx xyz・・・
という複行があったとして
abcが二つ以上ある行だけ検索したい場合はどうしたらいいですか?
ありがとうございます。
同じ言葉が3つ以上ある行を拾うにはどうしたらいいでしょうか?
例
012 345 678 901 123 345 456 345
012 678 012 890 012 678 890 234
これも161のコマンドでいけるんでしょうか
grep '\<\(..*\)\>.*\<\1\>.*\<\1\>'
>>162 > これも161のコマンドでいけるんでしょうか
おまえなんにもわかってねーのな。
163さんが不憫だね
てか「設問は以下のとおり」
とかって、もすかして宿題?
…… (ノ-_-)ノ~┻━┻
この時期だと新人研修か?
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 (1) PATHはsh系のシェルではコマンドパスを指定する環境変数
だから、これを書き換えたらcatもlsもフルパスで指定しないと
動かない。
(2) PATH=/home/*.* を実行した段階で *.* が展開されてしま
うので、はじめのコマンドと同じにはならない。展開してほし
くないのなら PATH="/home/*.*" などとする。
175 :
Solarisど素人: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
とすればいいけど.
>>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: "な。
>>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:"と表示しときながらリターンキーが必要な罠。
>>180 おやまあ。
read xの代りに、bash -c 'read -n 1 x'かな。
182 :
Solarisど素人: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シェルにありませんか?
187 :
名無しさん@お腹いっぱい。:02/04/24 00:28
Solaris の sh で,
$ usage
使用法: 見つかりません
となりますが,どうしてですか.なんとかしてください.助けてください.
>>188 わからない?気づいてくれよ.マジ話だし.
>>189 マジ話なのはわかるけどどうなって欲しいのかはさぱーり見当が付かない。
>>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'
見つかりません。: 見つかりません。
ということで Solaris スレで尋ねるべし。
196 :
名無しさん@お腹いっぱい。:02/04/28 02:41
こんなのをBourneシェルで作れる人いますか。
あるアドレスをユーザが入力してそれが正しいドメイン名かをif文などでY/Nしたい。
サブドメインは許すとして入力したアドレスが*.nifty.comならYES、違えばNOと
なるシェルができますか?
>>196 shのビルトインコマンドだけでという事か?
198 :
名無しさん@お腹いっぱい。:02/04/28 18:35
$ 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で"$番号"で指定出来るのでは分かるのですが、
コンマの場合はどうやって対処すればいいのか分かりません。是非ご教授お願いします。
207 :
名無しさん@お腹いっぱい。:02/05/02 12:26
>>204 203が書いていてくれてるじゃない。
”awk -F,”って。
208 :
名無しさん@お腹いっぱい。:02/05/02 12:28
>>203 ありがとうございます。出来ました。感謝します。
>>205 お前殺すまってろ 自宅近辺で一人であるくなよ。顔ぶっ壊して
ポリ袋で湖にしずめる。
実力が自尊心に永遠に追いつかないカスの常套句(プ
↓
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
とやればよいですが、ただの例です。パターンのところにシェル変数を
使用する方法はありませんか?
$ 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
>>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など)も拾っちゃうよ?
いいの?。
>>234 > ただ、これだとIPアドレスとしてあり得ない文字列(999.999.999.999など)も拾っちゃうよ?
数字はIPアドレス以外はないので大丈夫です。
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'
だとどーよ?
>>239 兄さんすごいっす。
ちゃんと拾えました。
これで、IPアドレスの履歴ファイルを作る事は出来ました。
次は、IPアドレスが前回と違うのかを検知する仕組を考えなければ。
逝ってきまふ。
242 :
名無しさん@お腹いっぱい:02/06/03 20:42
>>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}'
でちゃんと拾えますが。
>>244 だな。gawkなら--re-interval使えるし。
246 :
初心者@べんきょうちゅう:02/06/10 04:53
そだね。
一行目と二行目が同じかどうかを判定するのを難航しています。
それぞれ別のファイルに出力して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
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
>>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
正規表現で使われる $ になっているということですね。
煩わせました。
ありがとうございます。
解決したと思ったら解決していませんでした。
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"
できました。
有難うございました。
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
>>285 うーむ。そう来ましたか。
ちょっと違うような。
それだと、元のファイルを数字を増してmoveしていますが
新しく作るファイル名の数字を増せたらなと思っています。
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
>>287 俺も動かしてないけど、10を超えた時の挙動があやしい気がする。
>>289 yes
要件次第だけど、とりあえず安易に逃げとく。
filename=`echo $a | awk '{printf("hoge.%03d", $1+1);}'`
違う、そうじゃねーや。
まぁ、動かないけどそんな感じで(死
あ、動いてるわ(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
みなさん凄すぎです。
参考にさせてもらいます。
>>294,295
これを、hogeではなくて、`date +%y%m%d`の時は、
そのまま置換するだけでは駄目ですよね?
どうすればいいのでしょう?
>>299 そろそろ「何故駄目だと思ったか」そちらの手と頭の内を見せてよ。
君は雛鳥と違って可愛いくないんだから、口を開けてるだけじゃ飽きられちゃうzo
なぜ駄目かと思ったかは、簡単に置換して
#! /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 でいいじゃん。
>>311 wgetはhttpプロトコル上でしか無理じゃなかった?
(微妙に板ちがいかも…)
>>312 man wget すれ。
lftp とか ncftpget とかもあるし。
% 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....
だとどう?
>>315 それだと、一行に書けるキーワードの個数が固定されませんか?
IFS
>>316 ↓みたいな感じの結果では不満?
> $ cat list
> foo
> bar baz
> hoge
> $ cat list | ( while read i; do echo "[$i]"; done )
> [foo]
> [bar baz]
> [hoge]
出来ました。 while read のそのような使い方は知りませんでした。 出直してきます。
321 :
putsと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にちゃんと表示される。
これって仕様ですか?
すれ違いでした。
323 :
echoBACK:02/08/01 09:28
~/local/bin にスクリプトを置いてそれを実行した時に エコーバックするのがウザイので、 echo -n を実行しますが、 まだエコーします。 エコーバックしないための方法は一体何でしょう? googleで探してきます。 それでは。
エコーバックではなく、
ggmg 2>&1 > /dev/null
などで、
ggmg 2>&1 > /dev/null &
とすると
% ggmmg &
[4] 13573
%
[4] done ggmmg
% ggmmg
とエコーしてくるのを止めさせたいのです。
バックグランドで動作させると
IOを制御できないのでしょうか?
Googleを使って、解決法を探してきます。
それでは。
スクリプトの最後に、
2>& 1 > /dev/null &
をつけて、フツーにフォアで実行させると
求めていた結果を得ました。
解決できました。
以上。
2>&1 > /dev/null
この書き方だとstdoutを捨てて、
stderrだけ拾うことになるんだけど、それでいいのかな。
>>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組み合わせて作ればヨロシイ
grep -L "STR" -R DIR はどう?
>>334 > おまけに-rだという罠
--color=auto で色が変わらなかったら、バージョン上げてミソ。
gawk いつのまに /inet なんていう怪しい実装を?
凄いというかわけわからんというか
あるディレクトリ内の全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等きぼんぬ
リリースノート
事故解決しますた
別マシンの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
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 スクリプトを書きました...
あっ,私の書いた printf は /usr/bin/printf のつもりです.
ちょっと頭が固くなって,「perl ばっか使われやがって.sh でも頑張れば出来るはず.」
と cgi を書いていましたが,sh はそういうものに使うのではないことを思い知らされました.
適材適所ってヤシなんですね.
今度こういうスレに「sh で cgi を...」と来たら,「perl あるんだろ?ヴォケ.」と
返してあげるのがいいのでしょうか?それともわざわざ挑戦する価値はありますか?
>>365 > わざわざ挑戦する価値はありますか?
ない。一般的には。
頭の体操にはなるから、趣味で楽しみたければ、アリ。
shell script 用の configure が出来る日も近いかもしれない(w
>>353 Solaris の old awk (/bin/awk) ?
/bin/nawk なら…どうだろ
>355
manにありました。ありがとうございます。
・フィールド定義可能個数:199個まで
・引数設定可能ファイル数:100個まで
でした。
>>354 おれはメーカーのサポートに電話してる。
いちいち確認しとる暇ないし、sed、pasteなど他のコマンドにも実はいろいろ制限あるから(pasteコマンドで一度に引数に取れるファイルは12個までとか)、そういうのをまとめて聞いておくといい。
>>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
374を試してみるよ。
>>374 ファイル名に空白文字が混ざってたらどーすんの?
377 :
名無しさん@お腹いっぱい。:02/08/30 09:32
$fを""で囲ったらダメなのか?
オークの死体
そもそもnkfが入ってなかった。爆死。
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
/
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
みたいなのがあったとして、欲しい答えは?
>>383 3カラム目 の 1 - 2 - 3 = -4
必ず 2行しかなくて、1行目 > 2行目 です。
なんか変な質問だったのでしょうか。
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で確認。
>>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 がお勧め。
ありがトン。
質問には具体例が必要だと感じた土曜の午前だった。
ついでに質問。
ディスクの使用率などを数字じゃなくて 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?
どうもです。
$ echo zzz | { read AAA; echo $AAA; }
zzz
の方向で行くことにします。
ログインシェルが bash なのがいかんのかな……。
echo zzz|read AAA
だと、readがカレントプロセスで実行されるとは限らん。
何をしたいのかよく分からんが、
AAA=`echo zzz`
echo $AAA
ではいかんのか。
>>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
じゃだめかい?
>>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 を起動して、ちゃんと終了させなかった人
420 :
名無しさん@お腹いっぱい。:02/09/22 23:30
>>374 ファイル名に空白があるとダメです。いや、前は出来ていたようなんですが。。。
ダブルクォートを付けても付けなくても、
mv: 複数のファイルを移動させる時は、最後の引数はディレクトリでなければなりません
と言われてしまいます。どうしたらいいのでしょう?
emacs の dired でも操作できない。。。何か別のものが異常なのか。。。
>>420 mv "$f" "`echo \"\$f\" | nkf -e`"
今更だが、スレタイについて。
「オーク」って書かれると違和感あるな。awkはawkだろ。
rootを「ルート」って書くやついるけど、あれも気持ち悪い。
>「オーク」って書かれると違和感あるな。
まぁねー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
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!
あんな姿やこんな姿をした娘。たちが、あなたを待っています!!
いまだに・・・。
あるディレクトリに
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/ のような気がするなぁ。
>>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!
>>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;
}
とでもすれば?
>>441 Pでパターンスペース内の最初の改行までを表示した後で、
Dでパターンスペース内の最初の改行までを削除してるから。
でもややこしい事してるね。連続した空白行を1行の空白にしたいなら
/^$/{
N
/^\n$/D
}
でいけるのに。
つーか、この場合は sed を使うよりも、divert() あたりを使って
m4 の出力に余計な空行が入らないようにした方がいいのでは。
亀レス
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 でリダイレクトするとありがち)
>>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
>>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
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の出力みたいに綺麗に表示
したいのです。
すみません。どうか解決できないでしょうか?
すみませんでした。上の
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
よーするに、while で終了コードが0以外のときに、
繰り返しがしたいのですが。。。
while ! false; do echo '
>>468 まさかこれのことか?';done
>>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
メリットは
% 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を伸ばせるから。
ループ一発書きはちょっと怖い時に・・・
ファイルのタイムスタンプを
バックアップするファイル名に付加したいんだけど
いい方法あります?
例えば
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でハジいたほうがいいかも・・・
>>476 そのまま実行すると
"オプションには引数が必要です -- T"
と出ますが未熟者ですんません。
>>477 lsはOSによってオプションが大幅に違う可能性大です(当方NetBSD)
Linux(GNU ls)だったら
ls -lT
を
ls -l --full-time
に変更しないとだめかも(JMにて確認しただけなんで、ちょっと自信なし)
あとawkの引数も調整する必要ありかも
でも、よーはするに、awkにls -l形式のファイルリストを渡して
変形するだけなんでポイントだけつかめば、pipeの開始点は
柔軟に対応することが大切です
>>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
>>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)は強力。
使う機会があったら、やってみよ。
#!/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 が実行されないように
するにはどうしたらいいんでしょうか?
#!/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
実体が同じでも呼び出す名前で動作が違う罠
% 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なんてのもいろいろ勉強する価値ありそうなので……
% cat aho | iroduke 2002
みたいなツールで、引数にしていしたパターンを色づけしてほしいのですが
いろいろ見ましたが、見当たりませんでした。
#絶対、だれか作っているはずだ……
>>501,503
ありがとうございます。
勉強になりました。
独り言、ばっかりでごめんなさい。
% perl -pe 's{2002}{\033[41m2002\033[0m}g;' aho
でできました。もう少し考えてみます。
オークというとOakの綴りを連想してしまう。
リダイレクションで書き込んでいるファイルをリアルタイムで表示させる方法って
tee以外でありますか?
tail -f
tail -f
説明不足もいいとこでした……すんません。
Bシェルで組んだシェルの中で、ある実行結果をファイルにリダイレクションさせて
いるところがあるのですが、この部分を標準出力に表示させたいのです。
しかし、ある理由でteeが使えないのでどうすればいいのかわかりません。
どなたか教えていただけないでしょうか?
>>515 まだ説明不足だな。
スクリプトの断片だけでも出せない?
> Bシェルで組んだシェルの中で、
すごい表現だな。
>>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) # なくてもいいはずだけど念のため
}
アホだ。色をつけるだけで grep の動作をしねぇ(藁
$0 ~ regex {
gsub(regex, i "&" o)
print
}
こうだ。
>>517 test.shのなかで、ある時間のかかる繰り返し処理をしていまして、これの
スタート及び終了をリアルタイムでアナウンスさせたいのです。
また、一連のバッチ処理の中の一部なので「tail -f」だと処理を手動で
中断させなければならない為に使えません。
>521 test.shの中でstderrに「アナウンス」すれば?
どのように使うのでしょうか?
うちのktermでは
i = "\033[42m"
#i = "[31m"
o = "\033[0m"
#o = "[m"
にすれば色がつきます。
書き込みのときに ESC が落ちたんじゃない?
つーことで、524の修正であってると思う。
だれか、
オプション作ってください。
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ならできるぞ。
>>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の出力を全部比較すればいいだけでは・・・
>>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で動くと考えて良いのではないでしょうか。
>>533 wget -i - <<END
aho.rm
baka.rm
END
>>545 そーかもしれないです。
気をつけなくちゃいけないのは、*BSD <-> Linux とかかな?
あと、GNUのtoolをつかってるとき。
549 :
名無しさん@お腹いっぱい。:02/10/29 14:40
最強の.tcshrcってどこにあるんですか?
>>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 &
ワラタ
>>563 シェルスクリプトで
kon を起動してからその上で日本語表示をしたいんです。
man kon
> STARTUP(string)
> スタートアップ時に起動するコマンド文字列を指定します。
すいません
>>562 での使用例を示していたでけませんでしょうか?
それはやり過ぎでない?
>>586 やりすぎってのは??
どう書いていくのかよくわからないんです。
ようするに、
#!/bin/sh
kon STARTUP echo "こんにちは"
exit
みたいな感じですか?
570 :
名無しさん@お腹いっぱい。:02/11/02 12:50
>>569 いちいちきくまえに自分である程度テストしてみるって頭はないのかな?
パターン1→これこれこうで×
パターン2→これこれこうで×
パターン3→これこえこうで×
ぐらいのレポートでも付けときゃ案外すんなり正解が引き出せるかも
知れないのにねぇ~
572 :
名無しさん@お腹いっぱい。:02/11/02 12:58
>>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 を上げておくことはできないの?
いっそローマ字で表示する、とか。
要件から見直した方がいいんでないかな。
自分の技術レベルとよく相談すれ。
>>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
>>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 いったいいつの時代からローマ字が日本語でなくなったんだ?
>UNIXの特殊ファイルでnamed pipeってあるけど,
>ユーザが気軽につくれるものですか?
mkfifo
みなさん ありがとうございます.
早速試してみます.
>>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 ローマ字は日本語とは限らないよ。
英語を表記しているのもローマ字。
ローマ字の対義語はギリシャ文字。
いつの頃からか、日本語をローマ字(つまりアルファベット)を
使って綴ったもののことを称して「ローマ字」と言うようになり、
ローマ字=日本語という、誤解が広まってしまったのだが。
594 :
YAHOOO情報:02/11/03 21:43
「ロ」、「ー」、「マ」、「字」
全部日本語で使用する文字なんですが。
ローマ字談義は余所でお願いできますでしょうか?
>>590 わかっているとは思うけど、
国語の時間に習うのは「ローマ字綴り方」
「ローマ字」を習うのは英語の時間。
ローマ字談義は余所でお願いできますでしょうか?
ゆったりと600get
601ゲト
"< /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 は日暮れてって掲示板あったんだね。
608 :
名無しさん@お腹いっぱい。:02/11/06 20:42
ループの break や goto はないの?
>>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 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
と叱られます。
そもそもやる必要がありません。
>>613 とりあえず
while: Expression Syntax.
ってどういうエラーの意味なんでしょうか。
Expression は表現って意味はわかったんですが・・・。
>>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でも似たようなことができるけど。
>>624 echo $SHELL は関係ないか。
head -n1 sample.sh ぷりーず。
vi の 小 ネ タ 、
カモーーーーーーン!!!!!!!!
>>626 そーそー
環境そろってないとこでも、csh + vi をうまく使えばかなりのことできる
Bill Joyはイカすね!
>>622 そのサイトは知りませんでした、以後役に立ちそうです。
ありがとうございます。
>>613-625-628
なんでかわかりませんが、全部書き直したらうまくいきました
たぶん改行がどこか抜けていたんだと思います。
ありがとうございました。
マルチバイトのパッチをあてたsedで
sed 's/aaa/\n/' がうまくいきません。
nに置換されてしまいます。
\\nとすると改行ではなく文字としての\nになってしまいます。
普通のsedだと大丈夫なんですが・・・
emacs派のオレは用無しか・・・
M-x shell なんて誰も使わないのか・・・
ただの愚痴です。気にしないで下さい(w
>>635 Emacsで該当するのは M-x shell ではなく M-| (shell-command-on-region) かと。
>>632 なんだそのオチは……。
while: Expression Syntax. なんてのを出すのは csh 系だろう、
とにらんだんだが。
すれ違いかどうか確認ですが、
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
>>644 % cat ./google
これって、ファイルに書いたらうまくいったって例じゃない?
which google
して関数がでるのは、コマンドのサーチプライオリティが
shell関数->外部コマンド だからだと思う。
./google ってのは明示的に外部コマンドをしていしてるように見えるし。
>>638を改造して複数のキーワードを受け付けるようにできませんか?
今の状態だとhoge hogeをキーワードにするとhogehogeとくっついて検索されます。
>>646 keyword=`echo $* | sed 's/ /+/g'`
して
$* のかわりに $keyword をappendしる
日本語は面倒みきれないけど・・・
GUI が作成できる shell って無いですか?
qtopia の opie-sh の強化版みたいなの。
>>649 だったら、tcl/tk が手っ取り早い
tcl/tk なら py-gtk で良いです。我がまま言ってすまそん。
shell script とシームレスに書けると嬉しいんですが。
探してみても無かったので諦めます。
>>651 商用だけど、CDE に付いてくるdtkshは?
>642
おー、けっこう使える
>>652 正に其れって感じなんですが、CDE 環境持ってないので使えないんです。
面白いと思ったので、bash + gtk とかで同じようなものが無いかなと
探したのですが、見つかりませんでした。
>>654 gdialog じゃ力不足?
gdialog --yesno 'Are you OK?' 10 100 とか。
less376以降だと
grep string test.txt|less -R
とすることでカラーを損ねないまま見ることができるようですが、
日本語化パッチ出てますか?
見つかりませんでした&すれ違いスマソ
>>655 良いのを教えて下さってありがとう!!
イメージを貼り付けられたり、ウィジェットを階層的に配置できたら
最高なのですが、多くは望まないことにします。
grep (GNU grep) 2.5
以降の話。
659 :
名無しさん@お腹いっぱい。:02/11/09 00:59
>>638 $ typeset -fx
だめかも…
単一ファイルなら 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 | 下記のようにしてもだめでした。
「だめ」とは?
>>663 Syntax error:Unterminated quoted string
と表示されます。
>>664 caseのネストの問題じゃない。
たぶん echo "..." の中の文字列が悪さをしてると思う。
うおーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
いけました
echo -n "comment-1"...[pattern1/pattern2]"
と " の後にさらに " を入れていました、初歩的ミスでした...
case のネストの文法はこれで問題なかったんですねぇ...
助かりました、ありがとうございます!!!
>>667 一見、(質問者にとっては)関係なさそうに思われる部分についても、
質問する時には省略しないでコピペした方がいいという、
典型例ですね。
いや、書き写し元に " が入っていました。
だから
>>662 をテンプレにしても問題はないと思います。
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
ではうまくいくな
原因がわかりました。
テスト用に切り出したスクリプトは、テキストの1行目に
#!/bin/sh
を記入しており、元のファイルから分離させたときは正常に動きます、
しかし、それを元ファイルに戻すとcsh的なエラーを返すのは、
#########
#comment#
#########
#!/bin/sh
と、していたからでした。ファイルの一番先頭に#があった場合は
cshとして動くというのを知りませんでした。
ああ・・・これで一日ふっとんだ・・・
でもがんばる・・・
>>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/\
/'
としたほうがいいでしょう。
>>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だとそれで動くが、ダメだったのなら\\にしてみ。
>>687 あ,そうですか.\ が食われちゃってますね.
私は bash と GNU sed でできることを確認してみたんですけどね.
使ってる shell と sed によって指定の仕方が異なるかも知れないです.
\\ ではどうですか?
escりたくなくて、sedじゃなくていーなら
awk '{print} /ef/ { print "gh" }'
>>688-689 sed '/ef/a\\
gh' sample.txt
でできました。
sed わんや
awk 凡人
ab ab
cd cd
ef → ef
ij gh
ij
のようにしたいのですが、
sed '/ef/a\\
gh\
' sample.txt
としても、ghの前に空白が入力されません。ただスペースを入力しただけでは
だめなんですか?
わかりました
#!/bin/sh
sed '/ef/a\
\ gh\
' sample.txt
でした。
>>693 うーん、bash だとうまく行きますけどね。
空白も shell に食われてるんではないかなと思いますよ。
複数行使うような場合は shell script の表現能力によると思います。
tcsh だとうまく行きませんでした。
もし tcsh を使っているのであれば注意が必要です。
確かにパイプを繋げただけの「一行野郎」なら tcsh でもよいのですが、
一般的に tcsh は script 書きには向いていないと言われてますので。
(今回の例が tcsh のせいかどうかはわかりませんが。)
sh か、補完機能などを強化した bash などを使うべきでしょう。
あ、解決しましたか(^^;
>697
キミはもしかして大伝馬町か?
>>697 awk 厨なら awk 書けるんじゃないの?
つか、個数を出すのが目的なら 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回に扱うファイル数を越えると破綻する。
そんなにファイルも多くなかったんで、705さんの方法でなんとか
なりました。
んで、参考にしてファイルが多いとき用も描いてみますた:
find . -printf "%T@\t%p\n" |sort +0n | cut -f 2 | xargs ls -ld
たぶん GNU find でしか使えないだろうけど..
>>709 xargs が一度に処理する引数の数を減らして試してみればわかる。
% find . | xargs -n10 ls -dt
711 :
名無しさん@お腹いっぱい。:02/11/20 11:05
man はどの様な環境変数を利用しているのでしょうか?
>>710 なるほど、わかりました。xargsでls使うのがそもそも間違いかもしれませんね。
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\}/& /' がいいでしょうな
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 って感じのナガれなの?
>>735 Thanks! って、今まで見てたので良かったんですね。
>>735 後方参照って、 IEEE Std 1003.1-2001 で定義されてたんですね。
僕がRE覚えたのが、10年くらいまえだったんで、そのころは
まだPOSIXで定義されてなかったのかな・・・・
POSIXはあったと思うが、REの後方参照に関する記述があったかどうかは知らん
738 です。
フィールドにマッチする正規表現は簡単に書ける事がわかったので逝ってきます
' '区切りの 3番目のフィールドのregexにマッチさせる
'[^ ]* *[^ ]* *regex'
これだけのために1週間かけてプログラム作ったなんて鬱だ
>>740 スペースが消えちゃったい
-E '[^ ]+ +[^ ]+ +regex'
>>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でいいんか?
@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 }'`
こんなかんじ。
レス下さった方、質問文が言葉足らず+情報不足で住みませんでした。後で、スクリプト全て貼り付けます。
>>754 ># gyosuのtmpCってのはdata.resultでいいんか?
僕が途中の式を省いたため754さんは混乱されたかもしれません。すみませんでした。
>>756 >あと、上のminを代入するところは、用件的にまちが>ってるんじゃ?
これも情報不足でした。minレコードの第1フィールドだけ欲しいのです。
~$ 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
-----------------------------------------------------
~$ 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
-----------------------------------------------------
~$ 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
# 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`
# 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
762-758
長くて済みません。
無駄が多いスクリプトだと思います。
指摘して頂ければ
大変助かります。
$ 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
最初と最後でデータ数違うけど、いいの?
つーか、やりたいことを書け。
こんなの読むのめんどくさ杉。スクラッチからのほうが早い。
おれも思った。「読む気せん。」
読んでないので何やってるのわからんが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`
あと、「群」な。
どもDeath。
$0 は偽装可能だけどな。
>>778 UNIX FAQ にもあるけど、portable な方法はない、が最終的解決
オレはこういうときは SCRIPTPATH とか環境変数に入れといてそれを使う。
あまりにもヘタれ方式だがとりあえず自分で使う範囲では問題ない。
$0の方法では絶対パスでないと駄目なので万能の方法を考える・・・
コマンドと現在位置の複合でどうにかならないか・・・と
cd "$(pwd)/$(dirname $0)"
これで良いのかな!?良さげだけど
>>784 > $0の方法では絶対パスでないと駄目なので
なんで?
# 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 ばっかりだな・・・
あいた、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
Solarisの端末エミュレーターで以下のコマンドをうってみました。
%hensu=`date`
とすると
hensu=`date` : 指定があいまいです。
とエラーメッセージがでます。
なぜでしょうか?
>>791 ポータビリティに難が有るけど、realpathに頼る手も有る。
#!/bin/sh
# FreeBSD 4.3 以降
cmd=`realpath $0`
dir=`dirname ${cmd}`
echo ${dir}
cd ${dir}
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系だとどういう風に直せばいいのですか?
804 :
名無しさん@お腹いっぱい。:02/12/09 18:28
自身のホスト名やIPアドレスを変数で取得して
更に下位のシェルに引数として渡したいんですが・・・
カレントディレクトリ以下にあるテキストファイルのみを全て表示したい
とりあえずできた。
けど、スマートじゃないと思う。
そうか。
% 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
などを使って
出来そうで
出来ません。
join -v 1 Zenkoku.all Zenkoku.parted
有難うございました。
findについて質問します。
find ~/work -ls
を最終更新時間順に並べるオプションありますか?
というのも、find -ls の最終更新時間が
11月 1 10:09
のように表示されて
| sort
の構文考えるのがめんどくさいのでfindのオプションで解決できない
のかなーと思っています。
>>816 special 39s!
m(__)m
historyが吐くコマンド履歴から、実行された日付と時間は
判りますが、「どのディレクトリで実行されたか?」を知る
手立てはありませんか?
さっきのコマンドの結果、何処のディレクトリに保存したっけ?
と一度は誰しも思ったことがあるはずです。
微妙にスレ違いですけど、皆さんの意見聴きたいです。
csplitでできそうだが、環境は?
>818
プロンプトに$(pwd)いれて、screenのログから引き抜くとか。
OSはRH7.2です。
% csplit --version
csplit (textutils) 2.0.14
>>822 少なくともAsumiから入れたcsplit 2.0.16ではできた。
>818
cd|pushd|popdのコマンドはhistoryに残ってないのか?
>>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 せよ。
なるへそ。コマンド自身にそういうのがあって、明示的に標準入力や
標準出力と示しておいてパイプで送るのね。ってことはコマンド依存か・・・
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からの改造が完全じゃないんだろうね。
% 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).
年の最終月曜日からずれるってこった。
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行目だけが処理される?
>>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 値で動作させるのも基本。
>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しても
スクリプトが終るとその子シェルがしんで
結局移動できませんが
親シェルにも移動してもらうにはどうすればいいですか?
848 :
名無しさん@お腹いっぱい。:03/01/15 00:04
849 :
名無しさん@お腹いっぱい。:03/01/15 03:20
some strings not contain bracket <another string> stringsue
↑の行の< >内だけを sed で表示する方法ってありますか?
851 :
名無しさん@お腹いっぱい。:03/01/15 03:53
IFSの中身は改行とタブとスペースらしいですが
それプラス:とかできないでしょうか?
(^^)
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`
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で表示する方法を教えていただけませんか。
862 :
名無しさん@お腹いっぱい。:03/01/15 17:34
最後にこれだけ教えていただけませんか。お願いします。
864 :
名無しさん@お腹いっぱい。:03/01/15 17:37
犬板ていうのはなんでしょうか。どのようにして見ることができますか。
866 :
名無しさん@お腹いっぱい。:03/01/15 17:44
>>860 sed 's/.*/another string/'
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
$
恐ろしく長寿スレが多い板だな。。。
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>
にあたるやつです。
事故解決しました。すいません。
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の入門書探してた。サンクス。
#! /bin/sh
#オッス。
#お願いします。
#ファイル名の拡張子を抽出したいのです。
#$file_listは任意のディレクトリの`ls -rt`です。
for file in $file_list
do
# exprの":"パターンマッチとかmanを見てやってたんですが
# どうも上手くできません。
echo $拡張子
done
#よろしくおながいします。
>>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
>>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/'
>>902 先頭4文字を取り出したいなら
codehead=`echo $code | cut -b1-4`
最後の2文字を消したいなら
codehead=`echo $code | sed 's/..$//'`
>>902 先頭4文字を取り出したいなら
codehead=`expr $code : '\(....\)'
最後の2文字を消したいなら
codehead=`expr $code : '\(.*\)..'
適当にやっていたら、
codehead=${code::4}
で出来ました。(#!/bin/shだけど、多分bashの構文)
ついでに、質問です。
ImageMagicの質問は何処ですればいいでしょうか?
スレが無かったので、立てようかな?
>>900 いえいえ、たかがステータス取るだけでTMPファイル用意するのも
馬鹿馬鹿しいと思ってたので助かります。明日会社で試してみます。
>>893 とった終了ステータスはどう使うつもり?
>>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 する。
>>911 > value_"$hoge"_temp="abc"
eval value_"$hoge"_temp="abc"
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`"
とやってみたらうまくいったのですが、もっと簡単に記述できますか?
>> puni="eval echo $`echo value_"$hoge"_temp`"
ありゃ? うまくいってない・・・
気のせいだったみたいです∧||∧
>>909 ごく普通です。終了ステータスが0以外だったらエラーメッセージを吐くだけです。
なのでなるべくステータスの値も出力したくなかったんですが、
もっと詳しく書けば良かったですね。
パイプがサブシェルで実行される事に気づかず、ドツボに嵌ってました。
ちなみに今日思いついたのですが、こんなのもアリかな…と。
(A.sh ; echo ":${?}:") | grep -v '^#' | awk -F: '
!/^:.*:$/{print $0}
/^:.*:$/ {STS=$1}
END {exit STS}'
exit $?
>>910 > 勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
いったいどういうシェルかと一瞬迷ったが、
リネーム用 シ ェ ル ス ク リ プ ト か。
>>922 おぉ、確かにそう取れる。
いや、ただのムフムフ画像管理用のスクリプトなんですけどね。
これがケッコー懲り出すとメンドーで...
インフルエンザで一週間寝込んでました(´Д⊂)
>>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調べてみました。
便利なものがあるのですね。
実は簡単なポート監視に近いshellスクリプトを作っているのですが、
これを入れるサーバー(Solaris2.6)が他社の基幹システムの本番機でして、
手続きが少しめんどそうです。でも明日きちんと説明してみようと思います。
#Perlで作られたそういうプログラムがあったのですが、
#Perl入れちゃだめってことでボツってしまいました。・゚・(ノД`)・゚・
>>927 と、レスポンスコードが要るのか、てんで見てなかった。スマソ
う、いまから検証用スクリプト作ろうかなとおもつていたのでつが、、
とれないんですか、、、、・゚・(ノД`)・゚・
いっそのこと泣きながら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はサーバがお返事がのろいとき適宜いれるべし
932 :
名無しさん@お腹いっぱい:03/02/07 21:06
こんにてぃわ。
いきなりだけど、特定ディレクトリの不特定多数ファイルから該当文字
列に一致するファイル名を抽出しようとし根性が尽きました。
grep と find とパイプを駆使しても知能が足りませんでした。
どうすればうまくいくでしょう?
>>932 何か抽象的過ぎるな(;´Д`)
FIND_DIR: 特定ディレクトリ
STRING: 該当文字列
として、
find FIND_DIR -name 'STRING'
じゃだめかね。てか、man find しる。
grep -rl
936 :
名無しさん@お腹いっぱい:03/02/07 23:04
確かに抽象、というかミスでした。
例えば、/hoge 以下の全てのディレクトリの全てのファイルから、文字
列 hage を含む全てのファイル名を表示する・・・場合どうやりますか。
これでお願いします。
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
948 :
名無しさん@お腹いっぱい。:03/02/08 15:36
pythonってどうよ?
行末に<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 &
>> 959
どうもです.
それだとw3mが "%s" を引数(URL)だと思っちゃうからダメなんです.
w3m -o extbrowser="mozilla %s &"
と直接shellからうちこめばうまく行くのですが.