シェルスクリプト総合 その7
レス数が1000を超えています。これ以上書き込みはできません。
0001ミスターシェル
2006/09/07(木) 13:00:11スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0002ミスターシェル
2006/09/07(木) 13:01:14シェルスクリプト総合 その6
http://pc8.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc8.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc8.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc8.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc8.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc8.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc8.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/
□他板の関連スレ:
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc8.2ch.net/test/read.cgi/linux/1154578200/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0003ミスターシェル
2006/09/07(木) 13:02:10「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/
□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
0004ミスターシェル
2006/09/07(木) 13:03:23(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
0005ミスターシェル
2006/09/07(木) 13:06:03FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi
Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/
Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html
UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/
0006ミスターシェル
2006/09/07(木) 13:07:12・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
テンプレは以上です。引き続きよろしくお願いします。
0007名無しさん@お腹いっぱい。
2006/09/07(木) 13:11:37スレ立て乙です。
0008名無しさん@お腹いっぱい。
2006/09/07(木) 15:48:220009質問
2006/09/07(木) 17:25:28awkの中で変数を使いたいんですが出来ません。
例えば
#!/bin/sh
a=xyz
awk '/^${a}/{print $2}' abc
行き詰まってしましました。
解決策を教えてください。
0010名無しさん@お腹いっぱい。
2006/09/07(木) 17:36:00awk '/^'"${a}"'/{print '"$2"'}' abc
0011名無しさん@お腹いっぱい。
2006/09/07(木) 17:38:38$2 は awk側の変数だろ。
awk '/^'"${a}"'/{print $2}' abc
0012名無しさん@お腹いっぱい。
2006/09/07(木) 17:48:58せっかくシェルスレなんだからawk何か使わずに
シェルだけでやれ。
↓
#!/bin/sh
a=xyz
while read f1 f2 f3
do
case "$f1" in
"$a"*) echo "$f2";;
esac
done < abc
0013名無しさん@お腹いっぱい。
2006/09/08(金) 01:47:20前スレから見てるけど、改良や改善などの挙げ句どのみち何らかの
スクリプト言語になっちまうのは、避けられない宿命っぽいよ。
0014名無しさん@お腹いっぱい。
2006/09/08(金) 01:57:380015名無しさん@お腹いっぱい。
2006/09/08(金) 03:53:420016名無しさん@お腹いっぱい。
2006/09/08(金) 16:10:480017名無しさん@お腹いっぱい。
2006/09/08(金) 16:20:30つながりがよくわからんが、Solarisにはwhoamiコマンドが無かった希ガス。
0018名無しさん@お腹いっぱい。
2006/09/08(金) 16:30:260019名無しさん@お腹いっぱい。
2006/09/08(金) 16:33:490020名無しさん@お腹いっぱい。
2006/09/08(金) 16:47:140021名無しさん@お腹いっぱい。
2006/09/08(金) 17:22:090022名無しさん@お腹いっぱい。
2006/09/08(金) 17:35:35whoamiは
sunOS 5.7には無かった
sunOS 5.9には有った
who am i
はどちらでも使える。
5.8は使ってないからわからん。
0023名無しさん@お腹いっぱい。
2006/09/08(金) 17:38:02su して who am i しても、su前の一般ユーザーが表示されるはず。
0024名無しさん@お腹いっぱい。
2006/09/08(金) 17:43:54いや それはもちろんわかってるって w
ネタとして遊んで欲しかった・・・
0025名無しさん@お腹いっぱい。
2006/09/08(金) 18:38:36ps u | awk '$2 == '`echo $$`' {print $1}'
0026名無しさん@お腹いっぱい。
2006/09/08(金) 18:40:35echoが無駄です。$$ だけで桶。
0027名無しさん@お腹いっぱい。
2006/09/08(金) 18:46:46↓
ps u | while read f1 f2 f3; do case $$ in $f2) echo "$f1";; esac; done
0028名無しさん@お腹いっぱい。
2006/09/08(金) 18:53:120029名無しさん@お腹いっぱい。
2006/09/08(金) 18:56:28ps -h -o user $$
0030名無しさん@お腹いっぱい。
2006/09/09(土) 09:42:37それ処理系依存。Solarisじゃだめだった。
0031名無しさん@お腹いっぱい。
2006/09/09(土) 10:56:05↓
getent passwd `id -u` | (IFS=: read user other; echo $user)
まあ、id -unが使えれば一発なんだが、Solarisだと使えないし。
0032名無しさん@お腹いっぱい。
2006/09/09(土) 11:02:18Solarisは id -u も使えないよ。結局 >>28 か?
0033名無しさん@お腹いっぱい。
2006/09/09(土) 11:10:32id | (IFS='()' read f1 f2 f3; echo $f2)
0034名無しさん@お腹いっぱい。
2006/09/09(土) 11:24:30/usr/xpg4/bin/id -u
0035名無しさん@お腹いっぱい。
2006/09/09(土) 11:53:15絶対PATHを決めうちすると今度はSolaris以外で動かない。
psもポータブルじゃないし、
最もポータブルなのは >>33 か?
0036名無しさん@お腹いっぱい。
2006/09/09(土) 12:08:210037名無しさん@お腹いっぱい。
2006/09/09(土) 12:26:59だから、ps -o user というオプションが使えない psもあるんだって。
あと、Linuxの一部では tail -1 も使えない。tail -n 1 にしないと。
よって、>>33 が最もポータブル。
0038名無しさん@お腹いっぱい。
2006/09/09(土) 12:41:11マジかよ……。
たしかに引数の指定のしかたは現代的ではないけど、
過去に作られたスクリプトとの互換性とか移植性とかってのは考えないんだろうか。
0039名無しさん@お腹いっぱい。
2006/09/09(土) 12:58:55イヌックスのその辺りのコマンドは全部GNUじゃないの?
0040名無しさん@お腹いっぱい。
2006/09/09(土) 13:02:430041名無しさん@お腹いっぱい。
2006/09/09(土) 13:11:100042名無しさん@お腹いっぱい。
2006/09/09(土) 14:37:42あまりに不評で戻らなかったっけ?
一部のディストリビューションで独自にやってるのかな。
0043名無しさん@お腹いっぱい。
2006/09/09(土) 21:23:28シンボリックリンクの内容をポータブルに読むにはどうすればいい?
0044名無しさん@お腹いっぱい。
2006/09/10(日) 20:03:31ls -l "$file" | sed 's/.*-> //'
というような処理をしているのを見たことがあるけど、
当然lsの実装に依存するしファイル名が->を含んでいたら終わり。
どうしても必要ならperlを呼ぶのが一番まし。
0045名無しさん@お腹いっぱい。
2006/09/11(月) 18:26:460046名無しさん@お腹いっぱい。
2006/09/11(月) 20:20:29もうかれこれ10回くらいこれでサーバーダウンしてます(T_T)
0047名無しさん@お腹いっぱい。
2006/09/11(月) 20:39:32dfもフォーマットがあんまりポータブルじゃないのでアレだが、
これでどうだ?
↓
while :
do
for i in `df -k /var`; do
case $i in
[89][0-9]%|100%) df -k /var | mail omae@example.jp;;
esac
done
sleep 60
done
でも、メール送っても根本的な解決にならないよ。
0048名無しさん@お腹いっぱい。
2006/09/11(月) 22:21:43そしてこれが /var を圧迫し、結局サーバが落ちるのだった。続く
0049名無しさん@お腹いっぱい。
2006/09/11(月) 22:45:43100%オーバーも考えたほうがいいと思う。
0050名無しさん@お腹いっぱい。
2006/09/11(月) 23:18:510051名無しさん@お腹いっぱい。
2006/09/13(水) 15:24:45xargs の -O とか find の -printOってオプションは
どういう動き?何のマニュアルなら載ってる?
AIXにものってないよ。
AIXとかソラリスにもないのに載せる必要
あるのか?
0052名無しさん@お腹いっぱい。
2006/09/13(水) 15:26:510053名無しさん@お腹いっぱい。
2006/09/13(水) 15:30:12じゃあ逆に聞くけど、(Sambaサーバとかで)「Program Files」みたいな
スペース入りのディレクトリorファイル名がバリバリに使われてる環境で、
正しく find | xargs するにはAIXではどうやってるの?
それとも問題に気づいてない?
0054名無しさん@お腹いっぱい。
2006/09/13(水) 17:42:03ttp://www.linux.or.jp/JM/html/GNU_findutils/man1/xargs.1.html
0055名無しさん@お腹いっぱい。
2006/09/14(木) 00:02:07Solarisのxargs(1)
入力データは行の集まりとして解析されます。引数は空白文字により 区切ら
れます。xargs を使って find dir -print や ls などのコマンドの出力を、
実行対象コマンドの入力とする場合、ファイル名に空白文字や復帰改行文字が
含まれていると、処理の結果は予測できません。これを防ぐには、見つかった
各ファイル名を引用符つきの文字列に変換するスクリプトを find を使って呼
び出し、そのスクリプトを xargs にパイプでつなげるようにしてください。
なお xargs が使う引用符の規則は、シェルの規則とは異なります。同じ規則
を採用しないのは、既存のアプリケーションが現状の規則に依存しているのに
対し、シェルの構文規則はそれと互換性を持たないためです。文字列を xargs
が正しく解釈できる形式に変換 する簡単な方法は、各文字の前にバックスラッ
シュ(\fR) を付加することです。
0056名無しさん@お腹いっぱい。
2006/09/14(木) 00:08:25SUSv3のxargs(1)
Note that input is parsed as lines; <blank>s separate arguments. If
xargs is used to bundle output of commands like find dir -print or ls
into commands to be executed, unexpected results are likely if any
filenames contain any <blank>s or <newline>s. This can be fixed by
using find to call a script that converts each file found into a
quoted string that is then piped to xargs.
0057名無しさん@お腹いっぱい。
2006/09/14(木) 00:26:42ファイル名:file_a
データ:
1,abc,b,c
2,def,e,f
3,ghi,h,i
これを先頭の数字次第で別ファイルに吐き出したいのですが、
#!/bin/sh
for REC in `cat file_a`
do
echo "$REC" >> record.dat
NUM=`cat record.dat | cut -d "," -f1`
case $NUM in
1) cut -f1- record.dat >> text1.txt ;;
2) cut -f1- record.dat >> test2.txt ;;
*) echo "error";;
esac
rm record.dat
done
--
forでfile_aを一行ずつ読んで、一時的にrecord.datに格納し、先頭の文字でcaseで振り分けるというやり方をして動かしています。
これで上記のデータであれば動くのですが、
データ:
1,a bc,b,c
2,def,e ,f
3,ghi,h,i
という風に半角スペースが入るとそこで改行と認識されるようで、一行単位で認識をしません。
何か良い方法はないかアドバイスをいただけないでしょうか。よろしくお願いします。
0058名無しさん@お腹いっぱい。
2006/09/14(木) 00:59:14for に与える引数リストが改行区切りだなんてどこに書いてあった?
行単位で認識されると思ってるのがまず勘違い。
改行区切りで欲しければ read を使う。
while read a; do
case "$a" in
1,*) echo "$a" >> text1.txt;;
2,*) echo "$a" >> text2.txt;;
*) echo error;;
esac
done < file_a
sed -n -e '/^1,/w text1.txt' -e '/^2,/w text2.txt' file_a
005957
2006/09/14(木) 01:43:28>for に与える引数リストが改行区切りだなんてどこに書いてあった?
>行単位で認識されると思ってるのがまず勘違い。
>改行区切りで欲しければ read を使う。
知りませんでした。
ありがとうございます、試させていただきます。
0060名無しさん@お腹いっぱい。
2006/09/14(木) 01:55:34区切り文字はIFSで設定する。
↓IFSを改行に設定
#!/bin/sh
IFS="
"
for rec in `cat file_a
echo $rec
done
0061名無しさん@お腹いっぱい。
2006/09/15(金) 07:36:45文字列をも含んだ形で、それぞれ個別のファイルとして書き出したいと考えて
います。ファイル名は重複さえしなければどのような名称でも構いません。
なお、 bash 上で、
$ awk '/^開始/,/^終了/{print}' ~/tmp/data.txt > ~/tmp/data2.txt
のようにすることで、 data.txt 中に含まれる
開始
あああああああああああああああああああああああああ
あああああああああああああああああああああああああ
あああああああああああああああああああああああああ
終了
のブロックが、全て data2.txt に出力できることはわかりました。
しかし、これでは単一のファイルとなってしまい、目的とは異なります。
このような形で切り出したブロックを単一のファイルとしてではなく、それぞ
れ個別のファイルとして出力させるには、条件処理を追加する必要があること
はわかるのですが、どのように記述すればよいのかでつまずいています。
0062名無しさん@お腹いっぱい。
2006/09/15(金) 08:02:35もしくはそれを決めないと、何とも言えん。
0063名無しさん@お腹いっぱい。
2006/09/15(金) 08:30:21awk使っていいなら簡単じゃん。
awk '
/^開始1/,/^終了1/{ print > "data1.txt" }
/^開始2/,/^終了2/{ print > "data2.txt" }
/^開始3/,/^終了3/{ print > "data3.txt" }
' data.txt
0064名無しさん@お腹いっぱい。
2006/09/15(金) 09:14:54ファイルの名称は重複さえしなければ、どんな名称でも構いません。
見つかった順に 0001.txt, 0002.txt,...のような形でも構いませんし、ラン
ダムに生成した名称でも構いません。
>>63
あっ ごめんなさい。
ファイル中に複数存在するブロックというのが、数百のオーダーで存在してい
ます。
また、区切り文字列は全て同じもの(今回の例では「開始」〜「終了」)です。
0065名無しさん@お腹いっぱい。
2006/09/15(金) 09:39:15シェルスクリプトと直接関係ないし。
0066名無しさん@お腹いっぱい。
2006/09/15(金) 09:46:50簡単じゃん。
↓
awk '
BEGIN { n=0 }
/^開始/{ n++ }
/^開始/,/^終了/{ print > n ".txt" }
' data.txt
0067名無しさん@お腹いっぱい。
2006/09/15(金) 10:15:44情報を小出しにするつもりはなかったのですが、結果
としてそうなってしまいました。
書き込む前にもうちょっと冷静に読み返すべきでした。
ごめんなさい。
>>66
ありがとうございます。
ご教示頂いた方法で希望通りの処理を実現できました。
0068名無しさん@お腹いっぱい。
2006/09/15(金) 10:39:57csplitも使えるかな。
0069名無しさん@お腹いっぱい。
2006/09/15(金) 15:26:51find は大丈夫そうだけど
[root@cis_svr_p]# find . -name *bb* -exec ls -l {} \;
-rw-r--r-- 1 root system 0 Sep 15 15:16 ./xx/aa bb
-rw-r--r-- 1 root system 0 Sep 15 15:17 ./xx/aa bb dd
-rw-r--r-- 1 root system 0 Sep 15 15:17 ./xx/ aa bb dd
xargs はないと困りそうだね。
15年以上UNIXシステムに携わってるけどブランク入りファイルが
メンテナンスの対象になるシステムは見たことないや。
学校系に多いのかな。
0070名無しさん@お腹いっぱい。
2006/09/15(金) 15:30:15だから Sambaサーバーって言ってるだろ。
スペース入りのファイルなんて日常茶飯事的にユーザーが作るよ。
0071名無しさん@お腹いっぱい。
2006/09/15(金) 15:47:00Windows でかためた方が楽じゃん。
0072名無しさん@お腹いっぱい。
2006/09/15(金) 15:59:32UNIXユーザーでも普通にスペース入りのファイル名作るよ。
0073名無しさん@お腹いっぱい。
2006/09/15(金) 17:36:430074名無しさん@お腹いっぱい。
2006/09/15(金) 20:02:00ちなみにユーザーが作ったファイルを
find やら xargs で何するの?
0075名無しさん@お腹いっぱい。
2006/09/15(金) 20:05:31チェックするんじゃないか。
0076名無しさん@お腹いっぱい。
2006/09/15(金) 20:26:060077名無しさん@お腹いっぱい。
2006/09/15(金) 21:31:280078名無しさん@お腹いっぱい。
2006/09/15(金) 21:44:380079名無しさん@お腹いっぱい。
2006/09/16(土) 00:05:520080名無しさん@お腹いっぱい。
2006/09/16(土) 08:23:03find ... -print0 | xargs -0 が使えない環境では、xargsを使わず、
find ... -exec ... で個別に -exec するのが正しい。(プロセスが無駄でも)
0081名無しさん@お腹いっぱい。
2006/09/16(土) 17:59:11-print0がつかえず、かつファイル数が多すぎるときは?
0082名無しさん@お腹いっぱい。
2006/09/16(土) 18:00:30GNU findutilsを入れる。
0083名無しさん@お腹いっぱい。
2006/09/26(火) 21:09:460084名無しさん@お腹いっぱい。
2006/09/26(火) 21:51:530085名無しさん@お腹いっぱい。
2006/10/04(水) 16:47:35それをシェルで一括で変換したいんです。
echo ########## | awk '{print strftime("%c",$1)}' >tempuni.txt
みたいな感じで
どのようにやればいいでしょうか?
お願いします
0086名無しさん@お腹いっぱい。
2006/10/04(水) 16:53:54イマイチ仕様が不明確だが、
$ echo 1157601611 | date -d "1970-01-01 `cat` seconds"
Thu Sep 7 04:00:11 JST 2006
↑みたいにできればいいのかな?
タイムゾーンは別途考慮のこと。
では、後出しの仕様どうぞ
↓
0087名無しさん@お腹いっぱい。
2006/10/04(水) 16:56:150088名無しさん@お腹いっぱい。
2006/10/04(水) 16:59:210089名無しさん@お腹いっぱい。
2006/10/04(水) 17:00:150090名無しさん@お腹いっぱい。
2006/10/04(水) 17:01:41そんな感じです。
それをファイルの中のUNIXTIMEを1行目から500行目まで一括で変換したい。
1157601611
1157601612
1157601613
1157601614
・
・
・
みたいにならんでます
>>87
すいません。コマンドでした。
でもシェルでも出来ると思って・・・。
0091名無しさん@お腹いっぱい。
2006/10/04(水) 17:05:17じゃあ、hoge.txt に
1157601611
1157601612
1157601613
1157601614
が書かれてるとして、
以下を実行
↓
for t in `cat hoge.txt`
do
date -d "1970-01-01 09:00 $t seconds"
done
0092名無しさん@お腹いっぱい。
2006/10/04(水) 17:12:32ありがとう御座います。
temp.txtに書き出しながら処理するにはどうしたら良いですか?
0093名無しさん@お腹いっぱい。
2006/10/04(水) 17:15:11done の行を
done > temp.txt
にすればいいだろ。ただのリダイレクトだよ。
0094名無しさん@お腹いっぱい。
2006/10/04(水) 17:17:41何を質問したいのか意味不明。
>>85 のやりかたでやるなら、
awk '{print strftime("%c",$1)}' > tempuni.txt < hoge.txt
で桶。
もしかして、単に入力ファイルのリダイレクト方法を知らなかっただけ?
0095名無しさん@お腹いっぱい。
2006/10/04(水) 18:40:49CSVファイルの特定のフィールドの日付を書き換えなきゃなりません。
たとえば三番目のフィールドを199912から200001のように全行書き換える
にはどうしたらいいのでしょうか。
日付計算は終わってます。${B_YEAR}${B_MONTH} →${A_YEAR}${A_MONTH}
に入れ替えたいのですがsed使ってもなかなかうまくいきません。
awkで特定のフィールドを表示する方法ならわかるのですが、特定のフィールド
を置き換えた上で他のフィールドをそのまま表示する方法がわかりません。
0096名無しさん@お腹いっぱい。
2006/10/04(水) 18:54:49厳密な仕様をください。""中の"や,の扱いとか。
0097名無しさん@お腹いっぱい。
2006/10/04(水) 19:59:49date -f hoge.txtは使えないのかなあ
0098名無しさん@お腹いっぱい。
2006/10/04(水) 20:07:02date -f は、UNIX時間の形式(ただの数字)には対応してない。
(やってみればわかるが)
なので、>>91 で正解。
0099名無しさん@お腹いっぱい。
2006/10/04(水) 20:27:02cat hoge.txt |sed -e "s/.*/1970-01-01 & second/;" |date -f -
で出来た
0100名無しさん@お腹いっぱい。
2006/10/04(水) 20:37:30お約束の突っ込み。「catが無駄です」
0101名無しさん@お腹いっぱい。
2006/10/04(水) 20:38:07""はないです。
YYYYMM,HOGE,0,YYYYMM,YYYYMM,------中略-------,YYYYYMM,0,0,0,0
のような感じで日付が何箇所あります。現時点では各日付の関係
がわかりません。 m(_ _)m
0102名無しさん@お腹いっぱい。
2006/10/04(水) 20:39:40いや、わざわざ sed 通すくらいなら >>94 でいいだろ。1プロセスで済むし。
0103名無しさん@お腹いっぱい。
2006/10/04(水) 20:48:16manにdate起動のオーバーヘッド云々って書いてある。
0104名無しさん@お腹いっぱい。
2006/10/04(水) 20:51:48欲嫁。>>94 って言ってるんだよ。dateなんて1度も起動しないよ。
0105名無しさん@お腹いっぱい。
2006/10/04(水) 22:15:560106名無しさん@お腹いっぱい。
2006/10/05(木) 01:02:04WINDOWS上でシェルスクリプト動作確認をする方法はありますか?
0107名無しさん@お腹いっぱい。
2006/10/05(木) 01:13:36cygwin
0108名無しさん@お腹いっぱい。
2006/10/05(木) 01:28:44バカくせぇ
0109名無しさん@お腹いっぱい。
2006/10/05(木) 13:16:35cutやpasteコマンドを使うところなのかもしれないし、
シェルスクリプトとは言い難いが
perl -apF, -e '$, = ","; $/ = "\n"; splice(@F, $n, 1, $F[$n]を加工); print @F' < csvファイル
で出来ない?
0110名無しさん@お腹いっぱい。
2006/10/05(木) 13:17:050111名無しさん@お腹いっぱい。
2006/10/05(木) 23:37:13GNU sed を使うという手もある。
例)
$ echo 'abcdef' | sed 's/a\(b\)c\(de\)f/x\1y\2z/'
xbydez
0112名無しさん@お腹いっぱい。
2006/10/07(土) 03:06:18Solaris環境で自分で勝手にはgnu sed使えないのですが
perlは入っているので試してみます。∩(´∀`)∩ワァイ♪
0113名無しさん@お腹いっぱい。
2006/10/07(土) 10:54:57Windowsで使う下記のような内容のバッチファイルを作るために、
Solaris8上で簡単なスクリプトを作成しますた。
<バッチファイルの中身 (期待している実行結果)>
lha32 a D:\save\0.lzh D:\work\0\
lha32 a D:\save\1.lzh D:\work\1\
lha32 a D:\save\2.lzh D:\work\2\
:
lha32 a D:\save\9999.lzh D:\work\9999\ (←9999部分は、実際は第1引数で指定)
<作ったスクリプト>
#!/bin/sh
COUNT=0
LAST=$1
while [ $COUNT -le $LAST ]
do
echo "lha32 a D:\\save\\$COUNT.lzh D:\\work\\$COUNT\\"
COUNT=`expr $COUNT + 1`
done
0114続き
2006/10/07(土) 10:55:420の値が消えてしまう現象が出てしまいまつ。(´・ω・`)
<shの実行結果>
lha32 a D:\save.lzh D:\work ←0が消えている
lha32 a D:\save\1.lzh D:\work\1\
lha32 a D:\save\2.lzh D:\work\2\
:
試しにシェルの種類を変えてみたところ、ksh, zsh は sh と同じ挙動を示し、
bashのみ期待していた出力となりますた。
<bashの実行結果>
lha32 a D:\save\0.lzh D:\work\0\
lha32 a D:\save\1.lzh D:\work\1\
lha32 a D:\save\2.lzh D:\work\2\
:
この現象について、
・何故、0が消えるのか?
・/bin/shを使った場合に0を表示させる方法
について教えてください。
おまいら、よろしくおながいします。
0115名無しさん@お腹いっぱい。
2006/10/07(土) 11:39:340116名無しさん@お腹いっぱい。
2006/10/07(土) 11:50:42それは、echoコマンドの仕様が違うため。
Solarisなどの /bin/sh の echo は、bashの echo -e に相当する。
echo -e 相当だと、\ が、シェルと echoで2回解釈されるので、
単純な \ を出力させたければ、\\\\ と書かないと行けない。
よって↓で桶。
echo "lha32 a D:\\\\save\\\\$COUNT.lzh D:\\\\work\\\\$COUNT\\\\"
0118名無しさん@お腹いっぱい。
2006/10/07(土) 12:10:55echo "lha32 a D:\\save\\\\$COUNT.lzh D:\\work\\\\$COUNT\\"
でもいいな。
0119名無しさん@お腹いっぱい。
2006/10/07(土) 12:42:08ashとかだと、\1 でも 8進数の1と解釈するから、それはお勧めできない。
すべて \\\\ にするのが吉。
0120名無しさん@お腹いっぱい。
2006/10/07(土) 13:00:20echo時は無難な/にでもしといて |sed とかしてまとめてエスケープつけると
見やすいかも。好きずきだが。
0121名無しさん@お腹いっぱい。
2006/10/07(土) 13:02:25んな中途半端なもん使うなや
それに\1になりうるのは\\$COUNTのところだけだろ。
0122名無しさん@お腹いっぱい。
2006/10/07(土) 13:22:46D:\\tave とかだったら困るだろ。
\\\\ にしとけ。
0123名無しさん@お腹いっぱい。
2006/10/07(土) 13:24:36ディレクトリ区切りは/としておいて、最後に一括変換すればよい。
#!/bin/sh
COUNT=0
LAST=$1
while [ $COUNT -le $LAST ]
do
echo "lha32 a D:/save/$COUNT.lzh D:/work/$COUNT/"
COUNT=`expr $COUNT + 1`
done | tr '/' '\\'
0124名無しさん@お腹いっぱい。
2006/10/07(土) 13:38:18んな中途半端なもん使うなや
0125名無しさん@お腹いっぱい。
2006/10/07(土) 19:02:19というかむしろ変数展開部分だけ"〜"使え。ややこしいときは。
echo lha32 a 'd:\\save\\'"$COUNT.lzh" 'd:\\work\\'"$COUNT"'\\'
0126名無しさん@お腹いっぱい。
2006/10/07(土) 20:28:15printf があるのに、エスケープシーケンスを解釈してしまうようなままにしとくのがいけない。
バッドノウハウの典型だな。
0127名無しさん@お腹いっぱい。
2006/10/07(土) 20:32:360128名無しさん@お腹いっぱい。
2006/10/07(土) 22:39:17んで、echoがエスケープシーケンスをデフォルトで解釈するビルドもできちゃう
どっちつかずなbashがGJなのかよw
0129名無しさん@お腹いっぱい。
2006/10/08(日) 00:09:400130名無しさん@お腹いっぱい。
2006/10/08(日) 01:13:220131名無しさん@お腹いっぱい。
2006/10/08(日) 06:43:25Solarisなどのecho(/bin/echoも含む)が、エスケープシーケンスを無効にする方法がないことをいってるんジャマイカン?
013295-101
2006/10/10(火) 14:04:36/usr/bin/sed /usr/ucb/sed /usr/xpg4/bin/sed でも動作しました。
0133名無しさん@お腹いっぱい。
2006/10/16(月) 01:05:51特定拡張子のファイルを一括処理しょうと思い、
for file in `find . -name "*.hoge"`
do
のようにやると、スペースごとに変数fileに入ってしまうのだが
簡単な回避方法ありますか?
0134名無しさん@お腹いっぱい。
2006/10/16(月) 01:25:320135名無しさん@お腹いっぱい。
2006/10/16(月) 01:40:44ありがと。勉強になりました。
while 使えば行処理できたのか〜。
0136名無しさん@お腹いっぱい。
2006/10/16(月) 03:24:33find ... -print0 | xargs -0
もあり。
0137名無しさん@お腹いっぱい。
2006/10/17(火) 17:36:58aaa
bbb
ccc
ddd
eee
fff
といった文字列(6行)が入っている。
変数$2222には
bbb
ccc
といった文字列(2行)が入っている。
$2222の中身を、「1行ずつ」grepキーワードとして、
cat $1111 | grep bbb
cat $1111 | grep ccc
と個別にcatを実行したい。
どうしればいいだろう。
0138名無しさん@お腹いっぱい。
2006/10/17(火) 17:41:220139名無しさん@お腹いっぱい。
2006/10/17(火) 17:47:04$2222 って、2,222個目の引数のことだぞ。普通のシェル変数じゃない。
で、勝手に $hoge1 $hoge2 と置き換えさせてもらうが、答えは echoを使うこと。
echo "$hoge1" | grep bbb
echo "$hoge2" | grep ccc
ダブルクォート " " で囲むのが重要。
0140名無しさん@お腹いっぱい。
2006/10/17(火) 17:47:430141名無しさん@お腹いっぱい。
2006/10/17(火) 17:49:360142名無しさん@お腹いっぱい。
2006/10/17(火) 18:21:590143名無しさん@お腹いっぱい。
2006/10/17(火) 18:30:25後付けで問題訂正されるより、 >>137 がもう一度正確な問題を書くまで待機した方が良さそう。
0144名無しさん@お腹いっぱい。
2006/10/17(火) 18:33:44↓
for keyword in $hoge2
do
echo "$hoge1" | grep "$keyword"
done
$hoge2のところは " " なし(←これ重要)
$hoge1のところは " " あり(←これ重要)
0145名無しさん@お腹いっぱい。
2006/10/17(火) 18:38:150146名無しさん@お腹いっぱい。
2006/10/17(火) 18:39:32だから、catだと勘違いしてる >>137 の問題が間違いだろ。
0147名無しさん@お腹いっぱい。
2006/10/17(火) 18:41:20勘違いかどうかわかんないじゃん。
決めつけはよくないよ。
0148名無しさん@お腹いっぱい。
2006/10/17(火) 18:43:56オマエアフォだな。もし catだと、
aaa
bbb
ccc
ddd
eee
fff
という改行付き6行もある変態的なファイル名のファイルを読み込むことになるんだよ。
echoの間違いだとエスパーしてあげたのは親切と言えよう。
0149名無しさん@お腹いっぱい。
2006/10/17(火) 18:45:200150名無しさん@お腹いっぱい。
2006/10/17(火) 18:48:00↓こういうことか?
for file in $hoge1
do
for key in $hoge2
do
grep "$key" < "$file"
done
done
0151名無しさん@お腹いっぱい。
2006/10/17(火) 18:50:42変態的なファイル名の可能性もあるし、
複数のファイル名が変数に格納されてるのかもしれない。
勝手な解釈しちゃいかんよ。
0152名無しさん@お腹いっぱい。
2006/10/17(火) 18:54:55変数 $1111 改め $hoge1 の内容はファイル名じゃなく、文字列そのものだろ。
>>144 のエスパー(echo)が正しいに1票。
>>150 だと、「変数 $1111には1行ずつファイル名が入ってます」とかいう表現になるはず。
0153名無しさん@お腹いっぱい。
2006/10/17(火) 18:58:04その可能性もあるけど、あくまで可能性。
そこは本人に言わせなきゃだめだよ。
0154名無しさん@お腹いっぱい。
2006/10/17(火) 19:02:180ポイントのけいけんちかくとく
0155137
2006/10/17(火) 22:47:25あ、そうだった。1111番目のひき数って意味ではなく、ご認識の通り。
catはファイル名対象が前提なんですね。
スクリプト内での処理ですので、echoのことです。訂正します。
>>144氏ので行けそうな気がする。ありがとうございます>各位
今回は"ファイル名"というものは存在しません。
0156137
2006/10/17(火) 22:59:57というか、変な質問してしまったことに今気がついた。
迷惑かけた。
今日8時間ぐらいずっとそれで悩んでたんだ。
googleで調べるとreadって命令を見つけたのでずっとそれと格闘してた。
0157名無しさん@お腹いっぱい。
2006/10/18(水) 10:08:51>$hoge1のところは " " あり(←これ重要)
これなんで?
あっても無くても同じじゃないの?
0158名無しさん@お腹いっぱい。
2006/10/18(水) 10:13:48word splittingが行われるので違ってくるんだな。
0159名無しさん@お腹いっぱい。
2006/10/18(水) 10:14:100160名無しさん@お腹いっぱい。
2006/10/18(水) 10:14:37do
echo "$hoge1" | grep "$keyword"
echo TEST
done
別人だけど、これを実行しても
aaa
bbb
ccc
ddd
eee
fff
TEST
と表示されてしまうぞ。
bbb
TEST
ccc
TEST
とならなってくれないとおかしいのでは。
0161157
2006/10/18(水) 10:17:06echo $hoge1
としたのでは、
下手すると
$hoge
という文字列そのものが表示されてしまう恐れがあるってことかな。
0162名無しさん@お腹いっぱい。
2006/10/18(水) 10:36:34シェルはパラメータ展開・コマンド置換・算術式展開 (ダブルクォートの内部ではこれらの展開は行われません) の結果をスキャンし、
単語分割 を行います。シェルは IFS のそれぞれの文字を区切り文字として扱い、他の展開の結果をこれらの文字によって単語に
分割します。 IFS が設定されていないか、その値が正確にデフォルト値の <スペース><タブ><改行> ならば、 IFS 文字の任意の列
で単語が区切られます。 IFS がデフォルト以外の値を持っていれば、空白文字 (スペース および タブ) の列は単語の先頭と末尾
では無視されます。これは空白文字が IFS の値 ( IFS 空白文字) に含まれる限り成り立ちます。 IFS に含まれ、 IFS 空白文字で
はない文字は全て、隣接する任意の IFS 空白文字と一緒になってフィールドの区切りとなります。 IFS 空白文字の列も区切り文字
として扱われます。 IFS の値が空文字列であれば、単語分割は全く行われません。
明示的に指定した空の引き数("" または '')は削除されずに残ります。クォートされていない暗黙的な空の引き数が、値を持たない
パラメータを展開した結果として得られますが、これらは削除されます。値を持たないパラメータがダブルクォート内部で展開される
と、これは空である引き数となり、消されずに残ります。
展開が行われなければ単語分割も行われない点に注意してください。
0163名無しさん@お腹いっぱい。
2006/10/18(水) 10:42:40これでもいいんだよね
0164名無しさん@お腹いっぱい。
2006/10/18(水) 11:20:16だめ。
echo ${hoge1} と echo $hoge1 は全く同じ。
echo "$hoge1" と同じなのは、echo "${hoge1}"
0165名無しさん@お腹いっぱい。
2006/10/18(水) 11:24:00zsh 使ってるんじゃない?
zsh だと、$hoge2 と書いても "$hoge2" と同じに解釈される糞仕様なので、、、
shかbashでやってみろ。
0166名無しさん@お腹いっぱい。
2006/10/18(水) 11:41:140167名無しさん@お腹いっぱい。
2006/10/18(水) 11:44:17どうしたの?
0168名無しさん@お腹いっぱい。
2006/10/18(水) 13:51:26ファイルに ID,ファイル名,1,sed7s/(正規表現)正規表現/正規表現/',と並べてます
for LINE in ${LINE} ; do
IFS=','
FILE="$1"
SW="$2"
CMD="$3"
case $SW in
"0" )
コピーするだけ。;;
"1" )
cat $FILE | $CMD" > hogehoge ;;
esac
done <ファイル
echo "$hoge1" | grep "$keyword"
done <FILE
どやってみたのですがうまくいきません。
設定ファイル上にかかれた正規表現や変数を含むコマンドを実行するには
どうしたらよいのでしょうか?
0169名無しさん@お腹いっぱい。
2006/10/18(水) 13:52:49>echo "$hoge1" | grep "$keyword"
>done <FILE
0170名無しさん@お腹いっぱい。
2006/10/18(水) 14:30:50EAST,01,blue,192.168.1.1,3:1
EAST,03,blue,192.168.1.1,3:2
EAST,05,green,192.168.1.2,3:3
EAST,03,green,192.168.1.2,3:8
EAST,05,red,192.168.1.3,3:12
syslog02# cat 2ch_sh
#!/usr/local/bin/bash
IFS=$'';SORT=(`cat $1 | sort -t, -k3`)
IFS=$'';UNIQ=(`cat $1 | sort -t, -k3 | awk -F , '{print $3 }' | uniq`)
for keyword in "$UNIQ"
do
echo "$SORT" | grep "$keyword"
echo test (本当はここでファイルを作成したい)
done
------------
0171名無しさん@お腹いっぱい。
2006/10/18(水) 14:33:46syslog02# ./2ch_sh list.txt
EAST,01,blue,192.168.1.1,3:1
EAST,03,blue,192.168.1.1,3:2
test
EAST,05,green,192.168.1.2,3:3
EAST,03,green,192.168.1.2,3:8
test
EAST,05,red,192.168.1.3,3:12
test
【現実】
syslog02# ./2ch_sh list.txt
EAST,01,blue,192.168.1.1,3:1
EAST,03,blue,192.168.1.1,3:2
EAST,05,green,192.168.1.2,3:3
EAST,03,green,192.168.1.2,3:8
EAST,05,red,192.168.1.3,3:12
test
0172名無しさん@お腹いっぱい。
2006/10/18(水) 19:00:48全然駄目。shの文法を読み直す。set -xで動作を追跡することを憶える。
その上で判らない場合に出直しなさい。
条件もダメダメだし。(sed7sってなんだよ。'が閉じてねーぞ)
> ファイルに ID,ファイル名,1,sed7s/(正規表現)正規表現/正規表現/',と並べてます
0173名無しさん@お腹いっぱい。
2006/10/18(水) 20:25:31/backup/apl -mtime +6 -exec rm {} \;
上記のようい週次バックアップしています。
これを、直近のデータのみリストアする場合、
(最新のデータのみで、あとはいらない)
どのような表現を使えばいいのでしょうか?
0174名無しさん@お腹いっぱい。
2006/10/18(水) 21:20:47それでできるはず。ちゃんとbash使ってる?
0175名無しさん@お腹いっぱい。
2006/10/18(水) 22:02:08for keyword in "$UNIQ"
でそもそも複数行一括で処理するような気がする
0176名無しさん@お腹いっぱい。
2006/10/18(水) 22:04:510177名無しさん@お腹いっぱい。
2006/10/19(木) 03:50:14file
--------------------------------------------------
hoge:0:
hoge:1:sed "s/a\\(b\\)c\\(de\\)f/x\\1y\\2z/":
hoge:1:sed 's/a\(b\)c\(de\)f/x\1y\2z/':
-------------------------------------------------
hoge
------------------------------------------------
abcdef
------------------------------------------------
#!/bin/sh
while read LINE ;do
IFS=':'
set -- ${LINE}
FILE=$1
SW=$2
CMD=$3
case $SW in
"0" )
echo HOGE ;;
"1" )
cat $FILE | $CMD >hogehogehoge;;
esac
done <file
0178名無しさん@お腹いっぱい。
2006/10/19(木) 03:51:43+ read LINE
+ IFS=:
+ set -- hoge 0
+ FILE=hoge
+ SW=0
+ CMD=
+ case $SW in
+ echo HOGE
HOGE
+ read LINE
+ IFS=:
+ set -- hoge 1 'sed "s/a\(b\)c\(de\)f/x\1y\2z/"' ' '
+ FILE=hoge
+ SW=1
+ CMD='sed "s/a\(b\)c\(de\)f/x\1y\2z/"'
+ case $SW in
+ cat hoge
+ 'sed "s/a\(b\)c\(de\)f/x\1y\2z/"'
./hogehoge: line 13: sed "s/a\(b\)c\(de\)f/x\1y\2z/": No such file or directory
0179名無しさん@お腹いっぱい。
2006/10/19(木) 03:52:19+ IFS=:
+ set -- hoge 1 'sed '\''s/a(b)c(de)f/x1y2z/'\''' ' '
+ FILE=hoge
+ SW=1
+ CMD='sed '\''s/a(b)c(de)f/x1y2z/'\'''
+ case $SW in
+ cat hoge
+ 'sed '\''s/a(b)c(de)f/x1y2z/'\'''
./hogehoge: line 13: sed 's/a(b)c(de)f/x1y2z/': No such file or directory
+ read LINE
+ IFS=:
+ set --
+ FILE=
+ SW=
+ CMD=
+ case $SW in
+ read LINE
0180名無しさん@お腹いっぱい。
2006/10/19(木) 03:53:51どう改善すればよいのでしょうか
./hogehoge: line 13: sed "s/a\(b\)c\(de\)f/x\1y\2z/": No such file or directory
0181名無しさん@お腹いっぱい。
2006/10/19(木) 11:10:31そのエラーメッセージの意味がわかるように中学からやり直す。
0182名無しさん@お腹いっぱい。
2006/10/19(木) 11:22:15訳してみましたが、意味がわかりません。
0183名無しさん@お腹いっぱい。
2006/10/19(木) 12:18:27cat $FILE | $CMD >hogehogehoge;;
$CMDの部分に実行できるコマンドを代入するほうほうはないでしょうか?
0184名無しさん@お腹いっぱい。
2006/10/19(木) 12:38:08お約束の、catが無駄です。
0185名無しさん@お腹いっぱい。
2006/10/19(木) 12:41:53ないと言っているのがそのエラーメッセージ。
「sed」コマンドに引数「"s/a\(b\)c\(de\)f/x\1y\2z/"」を与えるのがやりたい
ことだろうがそうはなっていないわけだ。
で、どうしてそういうことになってるかは >>162 で引用されているシェルの
マニュアルの単語分割のところをよく読め。特にお前さんの場合はIFSを
いじっているのでそこらへんも効いている。
0186名無しさん@お腹いっぱい。
2006/10/19(木) 14:15:13eval はどうよ
0187名無しさん@お腹いっぱい。
2006/10/19(木) 14:32:12よくわからずに eval 使うより
>>185 あたりを理解するのが先だな。
0188名無しさん@お腹いっぱい。
2006/10/19(木) 23:37:29↓ 日本語訳
貝???
0189名無しさん@お腹いっぱい。
2006/10/20(金) 02:09:28ありがとう。 Cygwinでは改行コードで怒られます。
#!/bin/sh
IFS=','
while read FILE SW CMD
do
case $SW in
"0" )
echo HOGE ;;
"1" )
cat $FILE | eval $CMD >hogehogehoge;;
esac
done <file
file
-------------------
hoge,0,
hoge,1,sed 's/a\\(b\\)c\\(de\\)f/x\\1y\\2z/',
-------------------
hoge
--------------------
abcdef
------------------
hogehogehoge
------------------
xbydez
-------------------
0190名無しさん@お腹いっぱい。
2006/10/20(金) 02:12:15という事でしょうか。
0191名無しさん@お腹いっぱい。
2006/10/20(金) 08:31:26ちょっと違います。
0192名無しさん@お腹いっぱい。
2006/10/20(金) 09:37:21かなり違います。
0193名無しさん@お腹いっぱい。
2006/10/20(金) 11:11:24つ <
0194名無しさん@お腹いっぱい。
2006/10/20(金) 15:21:56無駄ではないかもしれない。
0195名無しさん@お腹いっぱい。
2006/10/20(金) 16:21:00その可能性はあり得ない。
>>189 で
while read FILE SW CMD
↑
って書いてるから。よってやはり「catが無駄です」
0196名無しさん@お腹いっぱい。
2006/10/21(土) 18:07:530197名無しさん@お腹いっぱい。
2006/10/21(土) 19:36:020198名無しさん@お腹いっぱい。
2006/10/23(月) 04:40:19シェルスクリプトならでは、という美しいサンプルはどの辺に行けば見れますか?
0199名無しさん@お腹いっぱい。
2006/10/23(月) 06:36:280200名無しさん@お腹いっぱい。
2006/10/23(月) 08:28:020201名無しさん@お腹いっぱい。
2006/10/23(月) 11:14:520202名無しさん@お腹いっぱい。
2006/10/23(月) 13:45:430203名無しさん@お腹いっぱい。
2006/10/23(月) 16:20:35unalias vi
という行を追加しました。というのは、ディフォルトのviだと、文字が緑ではなく、いろんな色でカラフルに
表示されるので、unaliasしてみたら、緑一色で表示できたので。
これでviは快適に使えるようになったのですが、別の問題が起こりました。
それは、bashを起動して別のシェルを動かした場合に.bashrcがもう一度実行されるので、
既にviはunaliasされているにもかかわらず、再度unaliasしようとして以下の警告が表示されます。
bash: line 49: unalias: vi: not found
警告が出ても、処理は問題なくできるので、気にしなければ、いいのですが、
でも気になるので、何か良い解決方法を教えてください
よろしく。
0204名無しさん@お腹いっぱい。
2006/10/23(月) 16:42:00単に
alias vi=
の行を.bashrcから削除すりゃいいのでは、と思ったが、
/etc/のどこかで定義されてるのかねぇ。
alias | grep '^alias vi=' >/dev/null && unalias vi
0205名無しさん@お腹いっぱい。
2006/10/23(月) 16:44:520206名無しさん@お腹いっぱい。
2006/10/23(月) 16:46:31~/.bash_profile に書けば?
0207名無しさん@お腹いっぱい。
2006/10/23(月) 16:48:110208名無しさん@お腹いっぱい。
2006/10/23(月) 16:49:48続きはこっちで。
くだらねえ質問はここに書き込め! Part 133
http://pc8.2ch.net/test/read.cgi/linux/1160894184/
0209名無しさん@お腹いっぱい。
2006/10/23(月) 16:53:27お前頭いいな
0210名無しさん@お腹いっぱい。
2006/10/23(月) 18:12:39それするくらいなら、
unalias vi 2> /dev/null
でいいじゃん。メッセージを捨てるだけ。
0211名無しさん@お腹いっぱい。
2006/10/23(月) 18:44:40この方法で解決しました。
ありがとございます。
0212名無しさん@お腹いっぱい。
2006/10/24(火) 10:14:07>>165
> zsh だと、$hoge2 と書いても "$hoge2" と同じに解釈される糞仕様なので、、、
setopt SH_WORD_SPLIT あるいは明示的に${=hoge2}とする。
0213名無しさん@お腹いっぱい。
2006/10/25(水) 16:35:32第二フィールドがhh:mm:ss
第三フィールドが""で囲まれたアカウント名
となっている。
「アカウント名が重複しているものは、その最新日付のみを残して、
他の重複行はすべて削除」
という具合にしたい。
uniqを使えばいいのかもわからないが、やっぱりわからない。
どうすればいいだろう。
08/11/2006 14:29:50 "yamamoto"
03/03/2006 06:40:53 "yamada"
05/17/2005 07:45:07 "yamada"
07/13/2005 04:18:04 "yamada"
07/13/2005 13:17:56 "yamada"
08/04/2005 11:03:05 "yamada"
08/11/2005 05:54:56 "yamada"
08/11/2004 07:58:53 "yamada"
12/07/2005 13:54:19 "yamada"
12/22/2005 00:26:49 "yamada"
08/05/2005 02:48:41 "kinosita"
08/05/2005 11:49:58 "kinosita"
08/05/2004 11:51:45 "kinosita"
08/06/2005 04:55:50 "kinosita"
02/21/2005 16:34:40 "akie"
02/21/2006 17:20:21 "akie"
02/21/2006 17:22:56 "akie"
02/21/2005 17:41:45 "akie"
02/21/2005 17:47:14 "akie"
0214名無しさん@お腹いっぱい。
2006/10/25(水) 16:40:07こんなんシェルスクリプトでやりたくないな。
perl かなんかで。
0215名無しさん@お腹いっぱい。
2006/10/25(水) 16:43:130216名無しさん@お腹いっぱい。
2006/10/25(水) 16:54:59シェルで簡単にできるよ。
ちょっとパイプが多段だけど。
↓
while read dt tm user
do
echo $dt $tm `date +%s -d "$dt $tm"` $user
done | sort -nr | uniq -3 | while read dt tm sec user
do
echo $dt $tm $user
done
ポイントは、dateで単純な秒数に変換する前処理をしてから
フィールドスキップして uniq すること。
その後で秒数フィールドを削除して元に戻してる。
GNU dateが必要かも知れない。
perl とか 連想配列とか言ってる香具師は弱もの。
0217名無しさん@お腹いっぱい。
2006/10/25(水) 16:59:540218名無しさん@お腹いっぱい。
2006/10/25(水) 17:04:25perlなどでやったほうがお手軽なんですね。
覚えがあるのがshellだけなので、やむをえず・・・。
Cygwinじゃdate -dでエラーになるので、FreeBSDで試してみます。
0219名無しさん@お腹いっぱい。
2006/10/25(水) 17:08:53こんな俗物に頼る方が、頭がヨワイ。
0220名無しさん@お腹いっぱい。
2006/10/25(水) 17:13:4208/11/2006 14:29:50
を、
2006/08/11 14:29:50
に変換する前処理を入れれば、
date使わなくても >>216 の方法で行けるよ。
>>216 って短時間に良くこんなシェルスクリプト組めますね。
さてはかなりのプロと見た。
0221名無しさん@お腹いっぱい。
2006/10/25(水) 17:33:44>done | sort -nr | uniq -3 | while read dt tm sec user
sort -k 3 -nrだろう
0222名無しさん@お腹いっぱい。
2006/10/25(水) 17:36:56まちがえた
0223名無しさん@お腹いっぱい。
2006/10/25(水) 17:37:14それだと名前の順序が変わるから
> その最新日付のみを残して、他の重複行はすべて削除
を満たさない。
それと、uniq ではスキップするフィールドを指定するんだから uniq -2 だし、
uniq が削除するのは連続した場合だから名前フィールドでの sort も必要。
0224名無しさん@お腹いっぱい。
2006/10/25(水) 17:38:32いや、uniq -3 は合ってるよ。1フィールドを追加してるから。
0225名無しさん@お腹いっぱい。
2006/10/25(水) 17:41:18あ、そうか。ゴメン。
0226名無しさん@お腹いっぱい。
2006/10/25(水) 17:44:00sort -nr | uniq -3 で最新日付だけ残して
最後に頭のフィールドを削除するのが奇麗だな。
0227名無しさん@お腹いっぱい。
2006/10/25(水) 17:46:13頭のフィールドはuserだろう
0228名無しさん@お腹いっぱい。
2006/10/25(水) 17:54:12確かに。時間毎にユーザーがバラバラな場合も考慮するとそうだな。
0229名無しさん@お腹いっぱい。
2006/10/25(水) 18:24:51sed 's,^[[:space:]]*\([0-9][0-9]*\)[[:space:]]*\([0-9][0-9]*\)/\([0-9][0-9]*\)/\([0-9][0-9]*\)[[:space:]]*\([^[:space:]][^[:space:]]*\)[[:space:]]*\(.*\),\6 \4/\2/\3 \5 \1 \6,' | \
sort -r | uniq -4 | sort +3n | \
sed 's,^\([^[:space:]]*\)[[:space:]]*\([0-9][0-9]*\)/\([0-9][0-9]*\)/\([0-9][0-9]*\)[[:space:]]*\([^[:space:]][^[:space:]]*\).*,\4/\2/\3 \5 \1,'
0230名無しさん@お腹いっぱい。
2006/10/25(水) 19:17:160231名無しさん@お腹いっぱい。
2006/10/25(水) 19:25:04シェルスクリプトでの回答例が出ている後でそんなこと言っても,みっともないだけw
0232名無しさん@お腹いっぱい。
2006/10/25(水) 19:28:24while read dt tm user; do
echo $dt $tm $user `date +%s -d "$dt $tm"` $user
done |sort -k 3 -r |uniq -4 |cut -d" " -f 1-3
0233名無しさん@お腹いっぱい。
2006/10/25(水) 19:38:07date の -d オプションは標準ではない
入力ファイルの順序が保存されてない
0234名無しさん@お腹いっぱい。
2006/10/25(水) 20:08:50dateを使わない方法は >>220 が示している。
入力ファイルの順序は、もともとの質問では問うていない。
0235名無しさん@お腹いっぱい。
2006/10/25(水) 20:30:23> dateを使わない方法は >>220 が示している。
>>219-220 抜かしたらまとめにならんだろ。
> 入力ファイルの順序は、もともとの質問では問うていない。
元の質問は「他の重複行はすべて削除」ね。入力ファイルから重複行を削除した
ものは当然に入力ファイルの順序が保存されてる。
順序を変えていいのは順序は問わないと明記されてる場合だけ。
0236名無しさん@お腹いっぱい。
2006/10/25(水) 20:44:28各ユーザ毎に最新時刻の行だけを抜き出したら、
それらの行全体が時刻順にソートされていた方が都合がいいだろう。
そういう意味でも、たまたま入力された順序にユーザーが並ぶ必要は全くない。
0237名無しさん@お腹いっぱい。
2006/10/25(水) 21:17:5009/09/2001 00:00:00 "name"
09/10/2001 00:00:00 "name"
0238名無しさん@お腹いっぱい。
2006/10/26(木) 00:59:01抽出させたい文字列が二つあります。
一回の sed で二つの出力を二つの変数に入れるのにはどうしたらいいですか?
なんか read を使えばできそうな感じなのですが、
なかなか難しくてできていません。
0239名無しさん@お腹いっぱい。
2006/10/26(木) 01:48:30sed でどう出力するのか分からんけど
パイプを使って代入しても意味が無いから気をつけろ。
sed '処理' | read a b
とかやっても a や b の中身はパイプの中でしか
参照できない。
0240名無しさん@お腹いっぱい。
2006/10/26(木) 01:53:16とかかね?
0241名無しさん@お腹いっぱい。
2006/10/26(木) 02:09:020242238
2006/10/26(木) 03:53:46サブプロセスの中の変数にしか影響を与えない場合が
あるとかなんとかで(>>239 さんの言ってることですね)、
exec 使ってリダイレクションをかえるとかそういうのに挑戦しましたが
生半可な知識ではたちうちできず、
結局別の方法で逃げました。
>>240 さんの方法は今回は使えませんでしたが勉強になりました。
いやー難しい。
0243名無しさん@お腹いっぱい。
2006/10/26(木) 08:14:10不思議だ
0244名無しさん@お腹いっぱい。
2006/10/26(木) 09:40:15改良してまとめた
while read dt tm user; do
printf "%s %015d %s\n" $user `date +%s -d "$dt $tm"` $user;
done |sort -nr |uniq -2 |while read user sec user1; do
echo `date "+%m/%d/%Y %T" -d "1970-01-01 00:00:00 UTC $sec sec"` $user;
done;
0245名無しさん@お腹いっぱい。
2006/10/26(木) 10:32:492 回目の read はいらんだろ。変換前の値もつけとけばいい。
しかし、なんで標準外の date の -d オプションにこだわるんだ?
while read dt tm user; do
tmp=${dt%/*}; x=${tmp#*/}
echo $user ${dt##*/}/${dt%%/*}/$x $tm $dt $tm $user
done | sort -r | uniq -f 5 | cut -d ' ' -f 4-
入力順も保存したいなら
cat -n |
while read num dt tm user; do
tmp=${dt%/*}; x=${tmp#*/}
echo $user ${dt##*/}/${dt%%/*}/$x $tm $num $dt $tm $user
done | sort -r | uniq -f 6 | sort -nk 4 | cut -d ' ' -f 5-
0246名無しさん@お腹いっぱい。
2006/10/27(金) 22:48:53一方にしか存在しないフィールドはそのまま出力し、
それ以外は第二フィールドを B に変更したいのです。
例えば次のようなファイルを:
foo 0
bar 0
--
foo 1
qux 1
次のように:
foo 1
bar 0
qux 1
順序は不同なのでソートしちゃっても構いません。
どのような方法があるでしょうか?
0247名無しさん@お腹いっぱい。
2006/10/27(金) 23:33:05uniq
uniq -d
を使って適当に。
0248名無しさん@お腹いっぱい。
2006/10/28(土) 17:24:58join(1) あたりで出来るかと思ったんですが、いまいち上手くいかないorz
もう少し頑張ってみます。
0249名無しさん@お腹いっぱい。
2006/10/28(土) 20:20:34sed -e "s/\([^ ]*\).*/& \1/;" |sort -r |uniq -3 |cut -d" " -f 1,3
0250名無しさん@お腹いっぱい。
2006/10/29(日) 08:35:390251名無しさん@お腹いっぱい。
2006/10/29(日) 09:16:24美容版の糞コテ「たお」は自慢大好き
その自慢もたいしたこと無いのに得意気で
見ててとても痛い糞コテ
批判に対しては必ず長レスで的外れに噛み付いてくる
とっても哀れなやつ
http://life7.2ch.net/test/read.cgi/diet/1158326490
0252名無しさん@お腹いっぱい。
2006/10/30(月) 16:26:50mm=80; nn=3;
pp=`printf "%0${nn}d" 0`;
for ((aa=0; aa<$mm; aa++)); do
bb[$aa]=$pp$aa;
done;
for ((aa=-$nn; aa<0; aa++)); do
for ((aa1=0; aa1<$mm; aa1++)); do
echo -n ${bb[$aa1]:$aa:1};
done;
echo;
done;
0253名無しさん@お腹いっぱい。
2006/10/30(月) 18:29:51脈絡なく何を言いたいかわからんが、
zsh依存乙。
bashですら動かない依存スクリプトは、Bourne-sh互換に書き直して出直すこと。
0255名無しさん@お腹いっぱい。
2006/10/31(火) 01:16:24俺の環境ではこうなったが、これでいいのか?
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000001111111111222222222233333333334444444444555555555566666666667777777777
01234567890123456789012345678901234567890123456789012345678901234567890123456789
$ bash --version
GNU bash, version 3.1.17(9)-release (i686-pc-cygwin)
0256名無しさん@お腹いっぱい。
2006/11/01(水) 17:56:320257名無しさん@お腹いっぱい。
2006/11/01(水) 18:10:02文字列でパイプライン組み立ててevalしる
0258名無しさん@お腹いっぱい。
2006/11/02(木) 09:32:240259名無しさん@お腹いっぱい。
2006/11/05(日) 01:14:11たとえば
% hoge /usr/local/bin
bin
% hoge ~/etc
etc
% pwd
/usr/local/bin
% hoge ..
local
みたいな。
0260名無しさん@お腹いっぱい。
2006/11/05(日) 01:18:310261名無しさん@お腹いっぱい。
2006/11/05(日) 01:23:010262名無しさん@お腹いっぱい。
2006/11/05(日) 01:37:000263名無しさん@お腹いっぱい。
2006/11/05(日) 13:35:39% echo $hoge:r
/usr/local/bin/allneeded
% echo $hoge:t
allneeded
csh/tcsh/zsh だがね。sh だったら basename だろ?
0264名無しさん@お腹いっぱい。
2006/11/05(日) 13:42:200265名無しさん@お腹いっぱい。
2006/11/05(日) 14:39:540266名無しさん@お腹いっぱい。
2006/11/05(日) 18:18:110267名無しさん@お腹いっぱい。
2006/11/05(日) 18:44:460268名無しさん@お腹いっぱい。
2006/11/05(日) 18:49:290269名無しさん@お腹いっぱい。
2006/11/05(日) 22:37:29↓
arg=/usr/local/bin
(IFS=/; set $arg; shift `expr $# - 1`; echo "$1")
0270名無しさん@お腹いっぱい。
2006/11/06(月) 00:12:33たとえ意味がなくてもcdが外部コマンドとして存在「しなければならない」のと同じ。
だから、>>266-267,269の言ってることは意味がない。考えるだけ無駄。
0271名無しさん@お腹いっぱい。
2006/11/06(月) 00:28:55どこの世界の話だ?
SUSv3:
> Since cd affects the current shell execution environment, it is always
> provided as a shell regular built-in.
0272名無しさん@お腹いっぱい。
2006/11/06(月) 00:51:531.13 Built-In Utilities
However, all of the standard utilities, including the regular
built-ins in the table (中略) shall be implemented in a manner so that
they can be accessed via the exec family of functions as defined in
the System Interfaces volume of IEEE Std 1003.1-2001 and can be
invoked directly by those standard utilities that require it (後略)
0273名無しさん@お腹いっぱい。
2006/11/06(月) 01:36:29そこで要求されてるのは
they can be accessed via the exec family of functions
つまり execve 等から呼出せれば外部コマンドである必要なんてない。
0274名無しさん@お腹いっぱい。
2006/11/06(月) 01:39:020275名無しさん@お腹いっぱい。
2006/11/06(月) 01:49:28というほどでもないのでは?外野ですが。
0276名無しさん@お腹いっぱい。
2006/11/06(月) 02:03:21むしろ"shall be"という強い書き方に注目しないといけない。
んで、exec系の関数の説明には
The exec family of functions shall replace the current process image
with a new process image. The new image shall be constructed from a
regular, executable file called the new process image file.
と書いてあるわけだ。ちゃんと規格書をあたる点は誉めてやってもいいが、
かなり調べ方が足りないゾwwww
0277名無しさん@お腹いっぱい。
2006/11/06(月) 02:29:570278名無しさん@お腹いっぱい。
2006/11/06(月) 02:34:32cd が実行ファイルとして存在することを仮定してるんじゃないかな。
0279名無しさん@お腹いっぱい。
2006/11/06(月) 02:45:36ていうか、それはもう>>272ですんだ話。
0280名無しさん@お腹いっぱい。
2006/11/06(月) 03:25:250281名無しさん@お腹いっぱい。
2006/11/06(月) 06:42:170282名無しさん@お腹いっぱい。
2006/11/06(月) 08:51:00POSIXで決まってるからというのはなしね。なぜそう決めたかの背景を知りたい。
0283名無しさん@お腹いっぱい。
2006/11/06(月) 09:49:49POSIXで誤ってそう決めてしまった、という説が有力。
後付けの言い訳としては、対象ディレクトリに実際に cdできるかどうかを
テストする目的で使える(返り値で結果判定)、と説明されているが、そんな例あまりないし、
内部コマンドの cdで、
(cd hoge) とやれば済む話。
0284名無しさん@お腹いっぱい。
2006/11/06(月) 17:49:06#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.1 2002/07/16 22:16:03 wollman Exp $
# This file is in the public domain.
${0##*/} ${1+"$@"}
0285名無しさん@お腹いっぱい。
2006/11/06(月) 18:31:56${1+"$@"} って、 "$@" だけでよくねぇ?
0286名無しさん@お腹いっぱい。
2006/11/06(月) 23:17:07cdだけならそれでも説明はつくんだけど、外部コマンドとしても存在する
ビルトインコマンド(regular built-in utility)は、cdだけじゃないのがややこしいところ。
alias, bg, cd, command, false, fc, fg, getopts, jobs, kill, newgrp,
pwd, read, true, umask, unalias, wait
謎だよなあ… fcやcommandに至っては、何のために存在するのかすらわからない。
0287名無しさん@お腹いっぱい。
2006/11/06(月) 23:33:120288名無しさん@お腹いっぱい。
2006/11/06(月) 23:40:49もうちょっとやさしくして
0289名無しさん@お腹いっぱい。
2006/11/06(月) 23:42:48(cronとか、inetdとかから直接起動されるとか、
env/nice/time/nohupとかの引数として起動するために外部である必要があるもの)
command, false, kill, newgrp, pwd, true
意味のない外部コマンド:
alias, bg, cd, fc, fg, getopts, jobs, read, umask, unalias, wait
0290名無しさん@お腹いっぱい。
2006/11/06(月) 23:46:26配置するべきだ。/bin/[ はあるのだから。
0291名無しさん@お腹いっぱい。
2006/11/06(月) 23:48:12教育上って、どういうこと?
0292名無しさん@お腹いっぱい。
2006/11/06(月) 23:50:180293名無しさん@お腹いっぱい。
2006/11/07(火) 01:39:010294名無しさん@お腹いっぱい。
2006/11/07(火) 08:57:140295名無しさん@お腹いっぱい。
2006/11/07(火) 18:29:53シェルの格納場所を取得できるような変数とかコマンドとか
誰か知りませんか?
0296名無しさん@お腹いっぱい。
2006/11/07(火) 19:25:20cat /etc/shells
0297名無しさん@お腹いっぱい。
2006/11/07(火) 20:11:550298名無しさん@お腹いっぱい。
2006/11/07(火) 20:19:08whichは cshのコマンド。それを言うなら type。
typeでは、type shとかやって、/bin/sh とかの PATHは得られるけど、
「この OSにインストールされていて使えるシェルを調べたい」
という質問の回答としては不適当。
0299名無しさん@お腹いっぱい。
2006/11/07(火) 20:26:51外部コマンドとして起動したwaitだと、どんな pidに対しても、
wait: pid 1234 is not a child of this shell
と言われるが、それに意味あるのか??
0300名無しさん@お腹いっぱい。
2006/11/07(火) 22:14:520301名無しさん@お腹いっぱい。
2006/11/07(火) 22:38:30つ言いだしっぺの法則。
0302名無しさん@お腹いっぱい。
2006/11/08(水) 01:03:490303名無しさん@お腹いっぱい。
2006/11/08(水) 01:13:19講師探してます
0304名無しさん@お腹いっぱい。
2006/11/08(水) 01:13:34表示しない方法ってありますか?
/dev/null
は試してみましたが、無理でした。
0305304
2006/11/08(水) 01:14:060306名無しさん@お腹いっぱい。
2006/11/08(水) 06:46:122>/dev/nullでどう
0307名無しさん@お腹いっぱい。
2006/11/08(水) 08:01:42無理だろ
0308名無しさん@お腹いっぱい。
2006/11/08(水) 08:39:00だから、 2> /dev/null でエラー表示消せるんだってすでに >>306 が言ってるだろ。
0309名無しさん@お腹いっぱい。
2006/11/08(水) 09:15:34は実行しようとしているコマンドではなくシェルが出してるので、
/dev/null にリダイレクトしても消せない。
つーわけで、シェルの出力をリダイレクトしてやればいい。
sh -c 'hoge fuga' 2>/dev/null
0310名無しさん@お腹いっぱい。
2006/11/08(水) 09:24:40欲嫁。
>>305 で bashだと言ってる。bashなら消せる。
bash$ hoge
hoge: command not found
bash$ hoge 2> /dev/null
bash$
0311名無しさん@お腹いっぱい。
2006/11/08(水) 09:30:42execすれば同じプロセスだろ。どの程度意味があるかは俺にもよくわからんが(笑)
0312名無しさん@お腹いっぱい。
2006/11/08(水) 09:39:50execしても、PIDが変わらないだけで別プロセス扱いになるので、
exec前にバックグラウンドで起動したプロセスを wait で待つことはできないよ。
0313名無しさん@お腹いっぱい。
2006/11/08(水) 10:14:53ありゃーwaitpidはできたよなと思ってよく調べたらshellのwaitコマンドはシステムコール
呼ぶ前にチェックしてるのか(bash調べ)。知らんかった...
0314名無しさん@お腹いっぱい。
2006/11/08(水) 17:15:17もっとシンプルor可搬性のある方法はあるでしょうか?
hoge=`stat -c %y FILENAME|sed -e 's/..\..*//' -e 's/-//g' -e 's/://g
' -e 's/ //g'`
touch -t "$hoge" FILENAME2
0315名無しさん@お腹いっぱい。
2006/11/08(水) 17:20:32-r, --reference=FILE
use this file's times instead of current time
0316314
2006/11/08(水) 18:05:29というのが動機なので、それだとだめなのです。
0317名無しさん@お腹いっぱい。
2006/11/08(水) 18:31:03編集してから更新時刻をコピーし戻せば?
0318名無しさん@お腹いっぱい。
2006/11/09(木) 00:01:360319名無しさん@お腹いっぱい。
2006/11/09(木) 00:06:46それだって touch -r で行けるじゃん。
$ touch -r hoge temp
$ vi hoge
$ touch -r temp hoge
$ rm temp
↑で、hogeを編集したあと、もとのタイムスタンプに戻せる。
0320名無しさん@お腹いっぱい。
2006/11/09(木) 03:18:350321名無しさん@お腹いっぱい。
2006/11/09(木) 09:36:02使えるはずなので、
hoge=`stat -c %Y FILENAME`
でとりだして
touch -d @$hoge FILENAME
とするのがシンプルじゃないか。
0322名無しさん@お腹いっぱい。
2006/11/09(木) 09:42:34強いて言えば read が近いと思うが、シェルスクリプトとCじゃ考え方が違う。
scanfと同じものを探すより頭を切り替えたほうがいいと思われる。
0323名無しさん@お腹いっぱい。
2006/11/09(木) 14:31:53変数や構文の取り扱いがperlとかruby程度に洗練された
スクリプト言語って何かない?
zshとかbashの専用機能使えばそこそこましなのかな?
0324名無しさん@お腹いっぱい。
2006/11/09(木) 16:17:52scsh
0325名無しさん@お腹いっぱい。
2006/11/09(木) 16:28:29python
0326名無しさん@お腹いっぱい。
2006/11/09(木) 16:39:160327名無しさん@お腹いっぱい。
2006/11/09(木) 18:10:24使えないんだったら実装するなと小一時…
0328名無しさん@お腹いっぱい。
2006/11/09(木) 18:12:560329名無しさん@お腹いっぱい。
2006/11/10(金) 02:15:32以下のように値が格納された3つの変数があるとします。
hoge1=10
hoge2=20
hoge3=30
これを、
for i in `jot 3`
do
echo $hoge$i
done
のようなイメージで、変数名を展開し、
それから変数の値を展開したい場合の方法は
シェルスクリプトではどのように行うでしょうか?
0330名無しさん@お腹いっぱい。
2006/11/10(金) 02:40:09あなたのしたいことを実現するためには、
echo $hoge1
のような文字列をevalさせればいい。ということは、evalに与えるための
echo $hoge1 のような文字列が作れればいい。
そのまま$hogeとなる文字列に、1を作る変数展開をくっつけて
echo '$hoge'$i
と書くとそれは作れる。
ということは、答えは
eval echo '$hoge'$i
例
$ hoge1=foo
$ hoge2=bar
$ hoge3=baz
$ for i in `jot 3`; do eval echo '$hoge'$i; done
foo
bar
baz
0331名無しさん@お腹いっぱい。
2006/11/10(金) 06:12:56配列にした方がいい。
0332名無しさん@お腹いっぱい。
2006/11/10(金) 07:05:170333名無しさん@お腹いっぱい。
2006/11/10(金) 08:19:360334名無しさん@お腹いっぱい。
2006/11/10(金) 18:53:54でも、>>329の場合は使ってよいケース。
set使ってもいいけど。
0335名無しさん@お腹いっぱい。
2006/11/10(金) 21:52:15eval使えるの
0336名無しさん@お腹いっぱい。
2006/11/10(金) 22:23:34釣りにも最低限の知識が必要。
0337>>329
2006/11/11(土) 02:47:00evalは初めて知りました。
早速試してみますー
0338名無しさん@お腹いっぱい。
2006/11/11(土) 09:35:47lisp1.5でも使えるぞ。
0339名無しさん@お腹いっぱい。
2006/11/11(土) 11:27:450340名無しさん@お腹いっぱい。
2006/11/11(土) 12:21:48全米が失笑した
0341名無しさん@お腹いっぱい。
2006/11/11(土) 14:26:06echo ls |bash
0342名無しさん@お腹いっぱい。
2006/11/12(日) 02:57:550343名無しさん@お腹いっぱい。
2006/11/13(月) 21:35:17そのスクリプトの標準出力をリダイレクトしてしまうと
nvi の場合は
ex/vi: Vi's standard input and output must be a terminal
と出て終了し、vim の場合は
Vim: Warning: Output is not to a terminal
と出て画面が表示されなくなってしまいます。
リダイレクトしてても普通に vi を操作できるようにする
ことはできないのでしょうか?
0344名無しさん@お腹いっぱい。
2006/11/13(月) 21:42:52できない。そういう場合は ed とか sed とかを使う。
0345名無しさん@お腹いっぱい。
2006/11/13(月) 23:03:31無理ですか。ありがとうございます。
0346名無しさん@お腹いっぱい。
2006/11/13(月) 23:13:50そのスクリプトの目的が中でviに適当なコマンドを与えて自動的に編集させたいということなら
expectでも使わないとだめだろうが、スクリプトで前処理や後処理はするけどそこから起動した
viは普通にインタラクティブに操作したいというのであれば、vi > /dev/tty とかすればいいと
思われる。どっちを意図してるのかはわからんわけだが。
0347名無しさん@お腹いっぱい。
2006/11/14(火) 05:11:39ed
0348名無しさん@お腹いっぱい。
2006/11/14(火) 20:11:42前者です。>/dev/tty でできました。
ありがとうございます。
0349名無しさん@お腹いっぱい。
2006/11/14(火) 20:13:270350名無しさん@お腹いっぱい。
2006/11/16(木) 22:18:34ではまってしまった。
rm -i `ls|grep -v`
でごまかした。
0351名無しさん@お腹いっぱい。
2006/11/17(金) 10:38:58rm *
を実行したら、すべてのファイルが消えてしまいました。(rm *.*じゃないのに)
これって、シェルのバグじゃないでしょうか?
あと、消してしまったファイルを復活する方法を教えてください。
0352名無しさん@お腹いっぱい。
2006/11/17(金) 10:46:01>> あと、消してしまったファイルを復活する方法を教えてください。
バックアップから戻せばOK
0353名無しさん@お腹いっぱい。
2006/11/17(金) 11:51:49普通は「拡張子」なんて言わず単に「suffix」って言うし。
0354名無しさん@お腹いっぱい。
2006/11/17(金) 11:53:130355名無しさん@お腹いっぱい。
2006/11/17(金) 12:06:03突っ込み処が不明なんだが…
0356名無しさん@お腹いっぱい。
2006/11/17(金) 19:37:09拡張子の無いファイル名に一致するシェル表現かー
.loginのようにドットで始まるファイルは対象なのか対象外なのかむずかしい
0357名無しさん@お腹いっぱい。
2006/11/17(金) 19:43:00.loginとかは対象外だろ(つーか、cshの例出すなよ)
hoge.c hoge hage.c hage
↑がある時、hogeとhageだけ消したいということだろ。
そう言えば、拡張子なしのファイルに一致するワイルドカードって
シェルにはないんだな。DOSだと「*」で桶なんだけど。
0358名無しさん@お腹いっぱい。
2006/11/17(金) 21:19:060359名無しさん@お腹いっぱい。
2006/11/17(金) 21:22:54find . -maxdepth 1 \! -name \*.\* -delete
0360名無しさん@お腹いっぱい。
2006/11/17(金) 23:21:23シェルの中で、あるシェルを呼び出すことを考えています。
2つのシェルはカレントであれば、実行可能なんですが、
パスを変えて実行するにはどうすればよいでしょうか?
例:
# pwd
/home/hoge1
# ls ../hoge2
A.sh Z.sh
# cat ../hoge2/A.sh
#! /bin/sh
date
./Z.sh
# cat ../hoge2/Z.sh
#! /bin/sh
echo "Call OK!"
# ../A.sh
2006年 11月 17日 金曜日 23:15:46 JST
../A.sh: line 4: ./Z.sh: そのようなファイルやディレクトリはありません
0361名無しさん@お腹いっぱい。
2006/11/18(土) 00:21:05#!/bin/sh
pwd
0362名無しさん@お腹いっぱい。
2006/11/18(土) 00:44:52死ねよ
0363名無しさん@お腹いっぱい。
2006/11/18(土) 01:50:24rm `ls * | fgrep -v .`
ファイル名にスペースがあると不十分かもしれん。
0364名無しさん@お腹いっぱい。
2006/11/18(土) 05:10:01ありがたいのですが、意味がわからないです。
0365名無しさん@お腹いっぱい。
2006/11/18(土) 07:22:59実在する余計なファイルを削除するにはどうしたらいいでしょうか?
#必要なファイル100個とか
files="a.txt 1.html hoge.jpg"
#実在するファイル100+1個以上
e_files="1.html a.txt fuga.gif hoge.jpg"
0366名無しさん@お腹いっぱい。
2006/11/18(土) 09:42:33ディレクトリというのがUNIXにはあるんだけども。
>>365
試してないけどこんな感じで
contains () {
local x="$1"; shift
for i; do
[ "x$i" = "x$x" ] && return 0
done
return 1
}
for f in $e_files; do
contains "$f" $files || echo "rm $f"
done
0367名無しさん@お腹いっぱい。
2006/11/18(土) 11:00:01シェルってゆうな。クズ
0368名無しさん@お腹いっぱい。
2006/11/18(土) 12:01:09なんと呼ぶの?
0369名無しさん@お腹いっぱい。
2006/11/18(土) 12:07:06>>1嫁。クズ。
0370名無しさん@お腹いっぱい。
2006/11/18(土) 12:17:17ls ではディレクトリは出力されませんがな。
alias 付けてなければ。
0371名無しさん@お腹いっぱい。
2006/11/18(土) 12:26:34こんなんなるんだけど。
$ touch fff
$ mkdir ddd
$ touch ddd/fff
$ /bin/ls *
fff
ddd:
fff
$ rm `/bin/ls * | fgrep -v .`
rm: cannot remove `ddd:': No such file or directory
rm: cannot remove `fff': No such file or directory
$
0372名無しさん@お腹いっぱい。
2006/11/18(土) 12:42:51どうすればよいのでしょうか。
0373名無しさん@お腹いっぱい。
2006/11/18(土) 12:54:17ちょっとメッセージが違うけど、これでいけることがわかった。
ls|grep -v hoge|xargs -p -n 1 rm
0374370
2006/11/18(土) 12:58:27ああ、そういうことか。
>>370は変なツッコミだった。スマソ。
ls * だとディレクトリの下のファイルがでちゃうから ls -d * だな。
さらに、はじめからディレクトリを除外するとしたら
for x in `ls -d * | fgrep -v .`; do
if [ ! -d $x ]; then
echo $f
fi
done
かな
ls -d * | fgrep -v . | xargs file | fgrep -v 'directory' | awk -F: '{print $1}' | xargs rm
ってのもあるけど
0375名無しさん@お腹いっぱい。
2006/11/18(土) 13:19:33安直なやり方として、
rm `fgrep -v -f files e_files` # 最初は rm じゃなくechoで試す
ってのがある。
ただし、files と e_files は 1行1ファイルでリストされたものとして。
さらに、files の中に "hoge.jpg" があると、e_files に中にある "hogehoge.jpg" は
削除されないけど。
0376名無しさん@お腹いっぱい。
2006/11/18(土) 15:54:42よろしくお願いします。
http://www.forest.impress.co.jp/article/2006/11/15/windowspowershell.html
http://support.microsoft.com/kb/926140
0377名無しさん@お腹いっぱい。
2006/11/18(土) 17:30:16シェルとシェルスクリプトは別物だぞw
Z.shのところ絶対パスでやれ。
それだけだ。
0378名無しさん@お腹いっぱい。
2006/11/18(土) 17:32:260379名無しさん@お腹いっぱい。
2006/11/18(土) 17:33:39内容はfor文のループ変数に配列を代入することは可能なのか?ということです。
for STARTEND in "(1 100)" "(101 200)";do
START=${STARTEND[0]}
END=${STARTEND[1]}
echo -e "&Avestart\nAve_start=${START}/\n&Aveend\nAve_end=${END}/" > namelist/namelist${START}to${END}
done
なるスクリプトを書いてみたのですが、
./speccalc.sh: line 15:(1 100): missing `)' (error token is "100)")
なるエラーが出ます。
もしbashで配列を配列のまま代入するということが不可能であるとして、それ以外のシェルで配列のまま代入することが可能なものはあるのでしょうか?
あるいはもっと他のツールを使った方がよいのでしょうか?
教えていただけないでしょうか?
0380名無しさん@お腹いっぱい。
2006/11/18(土) 17:35:51hairetu=(a b c d e f d)
for i in ${hairetu[@]}
do
echo $i
done
exit 0
こんな感じか?
0381名無しさん@お腹いっぱい。
2006/11/18(土) 17:39:21違うだろ。複数の配列を for 文の要素として使いたいらしいが。
0382名無しさん@お腹いっぱい。
2006/11/18(土) 17:40:460383名無しさん@お腹いっぱい。
2006/11/18(土) 17:42:03配列をFor文のループ変数に使えるかってことじゃないのか?
0384名無しさん@お腹いっぱい。
2006/11/18(土) 17:46:260385名無しさん@お腹いっぱい。
2006/11/18(土) 18:01:27borne shellには配列などというデータタイプは無い。
0386名無しさん@お腹いっぱい。
2006/11/18(土) 18:02:55"borne shell"って何ですかww
0387名無しさん@お腹いっぱい。
2006/11/18(土) 18:13:33eval STARTEND=$i
START=${STARTEND[0]}
END=${STARTEND[1]}
echo $START, $END
done
キモい。ただでさえキモい bash でさらにこんなキモいことするのか。
0388名無しさん@お腹いっぱい。
2006/11/18(土) 18:22:48いんじゃないか。
こんなインチキしか思い付かなかった
perl -e 'foreach $a ([1, 100], [101, 200]) {
print "$a->[0] $a->[1]¥n";
}'
0389名無しさん@お腹いっぱい。
2006/11/18(土) 19:47:14evalを使えば何でも出来る。
0390名無しさん@お腹いっぱい。
2006/11/18(土) 19:51:450391名無しさん@お腹いっぱい。
2006/11/18(土) 20:13:24>>339
>>340
0392名無しさん@お腹いっぱい。
2006/11/19(日) 01:55:30みなさん早速にレスいただき恐縮です。外出しておりました。申し訳ありません。
質問したかったのは>>383さんが書かれたとおりです。
>>387さんが書かれたスクリプトでうまくいきました。ありがとうございました。
ところで、配列がサポートされているCシェル、Kシェル、Zシェルでは「for文(に相当する構文)のループ変数に配列を用いること」は可能でしょうか?
0393名無しさん@お腹いっぱい。
2006/11/19(日) 07:47:13ありがとうございます。
とりあえず片付いたらそれをテストしてみます。
0394名無しさん@お腹いっぱい。
2006/11/19(日) 09:28:12関数を作らず、変数を1個使ってうまくいきました。
0395名無しさん@お腹いっぱい。
2006/11/19(日) 15:33:55項目が1万越していたら終らない
0396名無しさん@お腹いっぱい。
2006/11/19(日) 20:32:30そういう状況で適用したい人は自分で考えるってことで。
0397名無しさん@お腹いっぱい。
2006/11/20(月) 17:41:38: ${VAR:="exit script because VAR is not set."}
と記述すると、VARに値が設定されていない場合に実行中のスクリプトを
終了させることが出来る、と書かれているのですがうまくいきません。
これはなぜなんでしょうか?わかる方教えてください。お願いします。
0398名無しさん@お腹いっぱい。
2006/11/20(月) 18:01:09なんていう本? そんな間違った本捨てて、別の買え。
正しくは、
: ${VAR:?"exit script because VAR is not set."}
0399397
2006/11/20(月) 18:43:53早速のレスありがとうございました。うまくいきました。
けっこう長い時間これで悩んでたので本当に助かりました。ありがとうございました。
ちなみに参考書は
「入門UNIXシェルプログラミング シェルの基礎から学ぶUNIXの世界」
です。他のところで聞いたらこれを勧められたのですがダメな本なのでしょうか…。
0400名無しさん@お腹いっぱい。
2006/11/20(月) 19:22:210401名無しさん@お腹いっぱい。
2006/11/20(月) 19:44:220402名無しさん@お腹いっぱい。
2006/11/20(月) 19:46:36のフォームで報告しときゃいいんじゃね。
0403名無しさん@お腹いっぱい。
2006/11/20(月) 21:19:03読んで調べるぐらいした方がいいぞ。
0404名無しさん@お腹いっぱい。
2006/11/21(火) 00:06:55最近シェルスクリプト始めたのですがわからないことが
あって困っています。
小数の比較ってどうすればできるんですか?
---------------------------------------
#!/bin/bash
if [ 0.0001 -ge 0.00001 ]
then
echo "success"
fi
---------------------------------------
という風に書いて実行するとinteger expression expectedが出てしまうんで
すけど、どうしたらいいのでしょうか?
0405名無しさん@お腹いっぱい。
2006/11/21(火) 00:21:31整数で比較する
0406名無しさん@お腹いっぱい。
2006/11/21(火) 00:26:08あきらめろ。
awkやperlなど使うしかないだろ。
0407名無しさん@お腹いっぱい。
2006/11/21(火) 00:39:35evalつかえばなんでもできるって…
0408名無しさん@お腹いっぱい。
2006/11/21(火) 00:42:06-.*)
echo fail
;;
*)
echo success
;;
esac
0409名無しさん@お腹いっぱい。
2006/11/21(火) 02:31:42元ファイルを加工して1レコードが2フィールドで
接続開始時刻:接続終了時刻
の形式のファイルをawkを使って抽出してあります。
時刻は数値化(Excelの日付表示を数値表示に変換したもの)
されているので直接比較可能です。
スクリプトで処理したい作業は
あるレコードの接続開始時刻から接続終了時刻の間に
A 全レコード中、接続開始時刻が何件含まれているか
B 全レコード中、接続終了時刻が何件含まれているか
を各レコードの情報とともに表示させることです。
接続開始時刻:接続終了時刻:A件数:B件数
みたいに。
実際には同時接続数がどれぐらいあるかチェックしたいので
おおざっぱに掴めればなあと。
awkでレコードを1行読むごとに、全行比較という形で
スクリプトを書きかけたのですが、そもそも全行と
比較できず終わってしまっているようです。
{x=0;y=$1;z=$2;if ($1<=y && z<=$2) x=x+1;print x}
readlineが必要そうであれこれ試しているのですが、
こちらは全く使ったことがないので苦戦しています。
どなたかお知恵拝借させてください。
0410名無しさん@お腹いっぱい。
2006/11/21(火) 06:04:41まず
> A 全レコード中、接続開始時刻が何件含まれているか
> B 全レコード中、接続終了時刻が何件含まれているか
を実現する関数かスクリプトを作って
レコードを1行読むごとにそれを実行する、という方法はどう?
awk で関数なんて作ったことないから外しているかも。
0411名無しさん@お腹いっぱい。
2006/11/21(火) 09:49:42時刻 接続開始or終了
という形式のレコードを時刻でソートしてから頭からなめて
開始が来たら同時接続数++,
終了が来たら同時接続数--
としたほうが簡単じゃないか。
0412名無しさん@お腹いっぱい。
2006/11/21(火) 13:12:300413名無しさん@お腹いっぱい。
2006/11/21(火) 22:33:38どうすればいいんでしょうか?
0414名無しさん@お腹いっぱい。
2006/11/21(火) 22:49:550415名無しさん@お腹いっぱい。
2006/11/21(火) 22:52:060416名無しさん@お腹いっぱい。
2006/11/21(火) 22:57:010417名無しさん@お腹いっぱい。
2006/11/21(火) 22:59:240418名無しさん@お腹いっぱい。
2006/11/21(火) 23:05:44ファイル名に -> が入っている場合はアウトかと思っていましたが
やってみたらOKでした。ありがとうございます。
0419名無しさん@お腹いっぱい。
2006/11/23(木) 00:32:530420名無しさん@お腹いっぱい。
2006/11/23(木) 00:48:18全ての環境で共通に動かせるようにする道は死屍累々ですから。
0421名無しさん@お腹いっぱい。
2006/11/23(木) 02:53:37笑止。
真にマルチプラットフォームな言語なぞ無い。
0422名無しさん@お腹いっぱい。
2006/11/23(木) 09:16:15動かなかったら直せばいいだけ。
0423名無しさん@お腹いっぱい。
2006/11/23(木) 11:42:56所詮テキストファイルだし。
0424名無しさん@お腹いっぱい。
2006/11/23(木) 13:32:35異なる環境で動かすことを考えて作成されたシェルスクリプトに限定すれば真。
0425名無しさん@お腹いっぱい。
2006/11/23(木) 13:58:380426名無しさん@お腹いっぱい。
2006/11/23(木) 14:04:16いまでもアセンブリ書くよりはるかにポータブルだが…
0427名無しさん@お腹いっぱい。
2006/11/23(木) 14:07:320428名無しさん@お腹いっぱい。
2006/11/23(木) 14:15:22Cコンパイラ自身がポータブル。
0429名無しさん@お腹いっぱい。
2006/11/23(木) 14:16:43C言語のソースはポータブルだが、バイナリはポータブルじゃない。
だから、実行形式そのままをポータブルにしたい場合は
Cを使わずにシェルスクリプトで書くというのが常識。
0430名無しさん@お腹いっぱい。
2006/11/23(木) 14:21:50そういう時は C で極力ポータブルに書く。
0431名無しさん@お腹いっぱい。
2006/11/23(木) 14:22:06シェルスクリプトにヒアドキュメントでCのソース埋め込めばポータブル。
0432名無しさん@お腹いっぱい。
2006/11/23(木) 14:24:090433名無しさん@お腹いっぱい。
2006/11/23(木) 14:24:46「バイナリが」と言ってるだろ。
どこの世界に、バイナリレベルでポータブルなCがあるんだよ???
0434名無しさん@お腹いっぱい。
2006/11/23(木) 14:27:19シェルスクリプトで書くのはシェルスクリプトで良いやと判断した時だけ。
0435名無しさん@お腹いっぱい。
2006/11/23(木) 14:37:160436名無しさん@お腹いっぱい。
2006/11/23(木) 14:47:110437名無しさん@お腹いっぱい。
2006/11/23(木) 14:50:41という意味ではポータブルではない。
同様のことがperlとかにも言える。
シェルがインストールされていない環境はあり得ないので、
そういう意味でシェルスクリプトが最もポータブル。
0438名無しさん@お腹いっぱい。
2006/11/23(木) 15:01:39bash に link されてる奴は論外として…
0439名無しさん@お腹いっぱい。
2006/11/23(木) 15:39:46シェルだけで完結することはほとんどない。
さまざまな外部コマンドを使うことによって機能を実現できる。
つまり外部コマンドの仕様や配置などによって修正を余儀なくされるから、
ポータビリティはかなり低い。
また、それとは別にシェルそのものの実装違いもあるし。
0440名無しさん@お腹いっぱい。
2006/11/23(木) 15:51:36それは人のレベルによる問題。
普段からポータビリティを気にしてシェルスクリプトを書いていれば、
たとえ外部コマンドを使うにしても、どのOSでも使えるコマンドとオプションの
範囲だけで書く癖が付いているから、ポータビリティの高いスクリプトを
書くことは簡単にできる。逆に、別のOSで動かす予定がなかったのに、
たまたま別のOSでも動かす機会があった時に、そのまま動いてしまうことがほとんど。
一方、Java/perlとかだと、インストールされていなければそこで終り。
0441名無しさん@お腹いっぱい。
2006/11/23(木) 16:02:23シェルスクリプトがポータブルな範囲でのみ仕事を受け付けます。
0442名無しさん@お腹いっぱい。
2006/11/23(木) 17:01:590443名無しさん@お腹いっぱい。
2006/11/23(木) 17:41:210444名無しさん@お腹いっぱい。
2006/11/23(木) 18:41:14ガンガレ
0445名無しさん@お腹いっぱい。
2006/11/23(木) 19:48:590446名無しさん@お腹いっぱい。
2006/11/23(木) 19:51:570447名無しさん@お腹いっぱい。
2006/11/23(木) 20:02:230448名無しさん@お腹いっぱい。
2006/11/23(木) 20:09:25シリアライズして渡すのかな。ネットワーク越しにも渡せるの?
0449名無しさん@お腹いっぱい。
2006/11/23(木) 20:24:33詳しくはしらんけど
http://www.atmarkit.co.jp/fdotnet/special/powershell02/powershell02_01.html
cmd.exeより100倍ほどつかいやすそうだ。
0450名無しさん@お腹いっぱい。
2006/11/23(木) 20:26:480451名無しさん@お腹いっぱい。
2006/11/23(木) 20:37:550452名無しさん@お腹いっぱい。
2006/11/23(木) 21:59:17判定するにはどうすればいいのでしょうか?
0453名無しさん@お腹いっぱい。
2006/11/23(木) 22:14:56標準出力が、端末か、それ以外(ファイル)かの判定なら、
[ -t 1 ]
でできる。
0455名無しさん@お腹いっぱい。
2006/11/24(金) 10:34:20ちょっとわからないことがあるので質問します。
$ ABC=100
$ VAR=`echo "'\$ABC'"`
$ echo $VAR
$ '100'
(\はバックスラッシュです)
このようになるのですが、実行結果が'$ABC'ではなくて'100'になるのが理解できません。
展開するときに\によって$の効果が打ち消されると思うのですが…。
なぜこうなるかどなたかお教え下さい。お願いします。
0456名無しさん@お腹いっぱい。
2006/11/24(金) 10:38:18VAR=`echo "'\\$ABC'"`
↑
にする必要がある。バッククォートの中の \ は \\ にする。
あと、ここでは結果的に関係ないけど、
最後の echo $VAR は echo "$VAR" にした方がいいな。
0457455
2006/11/24(金) 12:20:02なるほど。$を一つ加えると結果はうまいこといきました。
でもなぜこうなるのかが納得できません。
\\$ABCの部分で一つ目の\が二つ目の\の効果を打ち消して、
$ABCは普通に変数として解釈されechoに渡されると思うのですが…。
それともバッククオートの中では何か特別なルールがあるのでしょうか?
0458名無しさん@お腹いっぱい。
2006/11/24(金) 12:26:12($を加えるんじゃなくて \ を加えるんだけどね)
>バッククオートの中では何か特別なルールがある
と言ってるとおり。
\\$ABC は、バッククォートで1回解釈される時に
\$ABC となってから、その中身が解釈される。
`echo "\\$ABC"`
の中身が解釈される時に
echo "\$ABC"
に変わってから実行されるので。
ちなみに、推奨しないが、バッククォートの代わりに $( )を使うと、
VAR=$(echo "\$ABC")
みたいに、\はひとつで良い。
0459名無しさん@お腹いっぱい。
2006/11/24(金) 12:49:19使える環境では使っとけ。
0460455
2006/11/24(金) 13:15:21ありがとうございました。やっと理解できました。
>>459
$()についても少し調べてみます。使える場合はこっちの方がすっきりしますね。
ご回答いただいた皆様本当にありがとうございました。
0461名無しさん@お腹いっぱい。
2006/11/24(金) 13:16:280462名無しさん@お腹いっぱい。
2006/11/24(金) 13:17:14ってどういう風に解釈されるんですか?
0463名無しさん@お腹いっぱい。
2006/11/24(金) 13:28:13ifconfig_args=AAA
ifn=hoge0
だとすると、
1回目の解釈で、
AAA=$ifconfig_hoge0
になるわな。
で、2回目にifconfig_hoge0の中身がAAAに代入される。
0464名無しさん@お腹いっぱい。
2006/11/24(金) 13:42:06> シェルはポータビリティ大切。
場合によるでしょ。
0465名無しさん@お腹いっぱい。
2006/11/24(金) 14:23:220466名無しさん@お腹いっぱい。
2006/11/24(金) 14:40:40という文字列から 192.168.0.1 の部分を抜き出したいのですが
どのようにすればよいのでしょうか?
0467名無しさん@お腹いっぱい。
2006/11/24(金) 14:46:23スクリプトが読みやすくなるから。
0468名無しさん@お腹いっぱい。
2006/11/24(金) 15:02:08↓を実行。標準入力から hoge.192.168.0.1 の文字列を読ませる。
IFS=. read hoge a b c d
echo $a.$b.$c.$d
>>467
そういう理由は軟弱。却下。
0469名無しさん@お腹いっぱい。
2006/11/24(金) 15:16:230470名無しさん@お腹いっぱい。
2006/11/24(金) 15:20:32???? 「読み易い」って、書き直すってこと?
そもそもポータビリティの意味を誤解してます。
0471名無しさん@お腹いっぱい。
2006/11/24(金) 18:28:430472名無しさん@お腹いっぱい。
2006/11/24(金) 18:37:28伝統的なBourne shellが/bin/shであるような環境では使えない。
Solarisとか。
0473名無しさん@お腹いっぱい。
2006/11/24(金) 20:07:45そのうちSolaris側が /bin/sh -> bash にリンクしてくる可能性すら考えられる。
0474名無しさん@お腹いっぱい。
2006/11/24(金) 21:54:310475名無しさん@お腹いっぱい。
2006/11/24(金) 22:29:240476名無しさん@お腹いっぱい。
2006/11/25(土) 02:19:05------------------------
#!/bin/csh
set i=`ps axwww|grep -i aaaa | grep -v grep | wc -l`
echo $j
------------------------
aaaaは存在しないプロセス。
この実行結果、
「0」でなくて「1」になるのはなぜですか?
0477476
2006/11/25(土) 02:23:46------------------------
#!/bin/csh
set i=`ps axwww|grep -i aaaa | grep -v grep | wc -l`
echo $i
------------------------
0478名無しさん@お腹いっぱい。
2006/11/25(土) 02:41:37パイプで一気に処理している中身を細切れにして中身を確認してみろ。
あと、pgrep があるならそっちを使った方がいい。
0480名無しさん@お腹いっぱい。
2006/11/25(土) 03:22:500481名無しさん@お腹いっぱい。
2006/11/25(土) 19:03:08取得するにはどう記述すればよいのでしょうか?
0482名無しさん@お腹いっぱい。
2006/11/25(土) 19:33:35OSによってifconfigの出力書式が違うかも知れんが、
↓みたいな感じで行ける。
ifconfig -a | sed -n 's/^\([^ ][^ ]*\).*/\1/p'
0483名無しさん@お腹いっぱい。
2006/11/25(土) 19:37:28lanscanだな。
0484名無しさん@お腹いっぱい。
2006/11/25(土) 20:30:330485名無しさん@お腹いっぱい。
2006/11/25(土) 21:05:380486名無しさん@お腹いっぱい。
2006/11/26(日) 14:56:47ミスプリ程度の間違いじゃない、ダメ本みたいだ。
こっちの書き込みによると。
↓
http://pc8.2ch.net/test/read.cgi/linux/1065059126/794
0487名無しさん@お腹いっぱい。
2006/11/27(月) 02:12:37クォートされずに*が展開されて位置パラメタに入っちゃうんだけどなんでなんでだろ。
echoとかの組み込みコマンドだと上手くクォートされるんだけどなぁ。
0488名無しさん@お腹いっぱい。
2006/11/27(月) 07:20:57どこかでクォートし忘れているって事なんだろうな。
そのスクリプトを晒してみな
0489名無しさん@お腹いっぱい。
2006/11/29(水) 21:31:140490名無しさん@お腹いっぱい。
2006/11/29(水) 21:52:550491名無しさん@お腹いっぱい。
2006/11/29(水) 22:31:42それは csh。cshは帰れ。
/bin/shでは set -f
ただし、ちゃんとクォートすれば set -f は必要ない。
0492名無しさん@お腹いっぱい。
2006/11/30(木) 21:22:530493名無しさん@お腹いっぱい。
2006/11/30(木) 21:28:40Bourne Shellでは $10以降は使えない。
bashとかkshとかでは使えるが、${10} とする必要あり。
zshでは $10 でも使える。
0494名無しさん@お腹いっぱい。
2006/11/30(木) 21:31:31${1}0と解釈されるから、${10}としないとだめ。
0495名無しさん@お腹いっぱい。
2006/11/30(木) 21:33:030496名無しさん@お腹いっぱい。
2006/11/30(木) 21:33:29Bourne Shell では ${10} でもダメ。逆に zsh では $10 でも桶。
0497492
2006/12/01(金) 00:40:19shで最後の引数を取得したかったのですが、無理なのですね。
0498名無しさん@お腹いっぱい。
2006/12/01(金) 00:48:110499名無しさん@お腹いっぱい。
2006/12/01(金) 02:24:15"Portable Shell:: Shell script portability pitfalls"
が非常に詳しくて面白い。よくこれだけまとめあげたものだ
0500名無しさん@お腹いっぱい。
2006/12/02(土) 01:04:32人間レベルポータビリティが高いということだと思う。
狭い範囲でのポータビリティを満たすためにトリックを駆使するより、
移植性のない明快な方法複数のほうが意図が読めるから未知プラット
フォームに持って行きやすい(ことがある)。
0501名無しさん@お腹いっぱい。
2006/12/02(土) 01:16:48そういう概念を表すためにわざわざ、可読性(readability)とか
保守性(maintainability)とかいう用語が存在してるでしょうに。
0502名無しさん@お腹いっぱい。
2006/12/02(土) 01:23:51移植性は似てる(生体計算機上で移植性がある=可読性)と
元レスはいいたかったんでないの?
0503名無しさん@お腹いっぱい。
2006/12/02(土) 20:53:48DEF
GHI
JKL
MNO
という文字列を
DEF
GHI
JKL
という部分をごっそり抜いて、
ABC
hogehoge1
hogehoge2
hogehoge3
JKL
としたいのですが、
何か良い案はないでしょうか?
0504名無しさん@お腹いっぱい。
2006/12/02(土) 21:06:340505名無しさん@お腹いっぱい。
2006/12/02(土) 21:08:49それくらい察してやれ。
それより、DEFやGHIなどの文字列があるものとして置換していいのか、
それとも2行目から4行目までを置換するという意味なのか、
質問の意味が複数解釈できるね。
0506名無しさん@お腹いっぱい。
2006/12/02(土) 21:11:49全くそのとおり。
0507名無しさん@お腹いっぱい。
2006/12/02(土) 22:17:15なぜ残っているのか?
0508名無しさん@お腹いっぱい。
2006/12/02(土) 22:24:14だからぁ、察してやれよ、MNOの書き間違いだろ。
0509名無しさん@お腹いっぱい。
2006/12/02(土) 22:27:07$ cat minus.awk
#!/usr/bin/gawk -f
ARGIND == 1 {
minus[ $0 ] = sprintf("hogehoge%d",FNR)
next
}
$0 in minus {
print minus[ $0 ]
next
}
{
}
$ gawk -f minus.awk (抜くキーワードを書いたファイル) (抜かれる方のファイル)
0510名無しさん@お腹いっぱい。
2006/12/02(土) 22:37:23シェルスクリプトでやりたいです。
ABC
DEF
GHI
JKL
MNO
という文字列を
DEF
GHI
JKL
という部分をごっそり抜いて、
ABC
と
MNO
の間に特定の文字列を挿入して、
ABC
hogehoge1
hogehogeXX
hogeYY
MNO
としたいのですが、
何か良い案はないでしょうか?
よろしくお願いします。
0511名無しさん@お腹いっぱい。
2006/12/02(土) 22:43:52↓ほれ、これでいいかい? シェルだけでやったよ。外部コマンドは使ってない。
while read line
do
case $line in
ABC|MNO) echo "$line";;
DEF) echo hogehoge1;;
GHI) echo hogehogeXX;;
JKL) echo hogeYY;;
esac
done < input_file
0512名無しさん@お腹いっぱい。
2006/12/02(土) 22:55:31cat aa |sed -e '/DEF/,/JKL/c\
hogehoge1\
hogehogeXX\
hogeYY'
0513名無しさん@お腹いっぱい。
2006/12/02(土) 22:56:21>>505は読んだのかw?
0514名無しさん@お腹いっぱい。
2006/12/02(土) 22:56:33お約束のcatが無駄です。あと、シェルだけでやりたいと申されております。
0515名無しさん@お腹いっぱい。
2006/12/02(土) 23:02:26> DEF
> GHI
> JKL
> という部分をごっそり抜いて、
これで人に通じると思ってるの? ゆとり世代?
1 ABCの次の行からMNOの前の行まで。
2 2行目から4行目まで
3 2行目から最終行-1まで
4 DEFまたはGHIまたはJKL
5 1文字目がAかM以外
6 1文字目がDまたはGまたはJ
...
0516名無しさん@お腹いっぱい。
2006/12/02(土) 23:06:31お客様、仕様書が曖昧で作業に入れませんのでご確認をお願いいたします。
こいういうことでしょうか?
START-STRING
AAAA
BBB
CC
END-STRING
を
START-STRING
REPLACED-1
REPLACED-2
REPLACED-3
END-STRING
とする。
START-STRINGとEND-STRINGに囲まれた複数行を置換するんでしょ?
読み取れないのは、AAAA,BBB,CCの部分は何でも良いのか、
hogehoge1,hogehogeXX,hogeYYの部分は固定なのか、AAAA,BBB,CCそれぞれに
対応させて置換するのか。
0517510
2006/12/02(土) 23:06:52ですので、
512
でほぼ解決です。
ありがとうございました。
説明がわかりにくくてご迷惑をお掛けしました。
また出直します。
0518名無しさん@お腹いっぱい。
2006/12/02(土) 23:09:28>>512は
DEFとJKLではさまれている行だろうが、どこが
> ABCの次の行からMNOの前の行まで。
なんだよ。
0519名無しさん@お腹いっぱい。
2006/12/02(土) 23:23:28「ほぼ」って言ってるから良いんじゃない?
sed -e '/ABC/,/MNO/c¥
ABC¥
hogehoge1¥
hogehogeXX¥
hogeYY¥
MNO'
程度の修正は誤差であるというくらい理解したんじゃないかna
0520名無しさん@お腹いっぱい。
2006/12/02(土) 23:32:03echo "$i"
done
Bourne Shellでも動きますか?
0521名無しさん@お腹いっぱい。
2006/12/02(土) 23:32:350522520
2006/12/02(土) 23:32:52for ((i=0; i<10; i++)) ; do
echo "$i"
done
Bourne Shellでも動きますか?
0523名無しさん@お腹いっぱい。
2006/12/02(土) 23:38:40for i in 1 2 3 4 5 6 7 8 9; do
echo "$i"
done
が最もポータブル。
seqやjotはあえて使わない。
0524名無しさん@お腹いっぱい。
2006/12/02(土) 23:52:400525名無しさん@お腹いっぱい。
2006/12/02(土) 23:57:42exprくらいは使ってもいいじゃね?
0526名無しさん@お腹いっぱい。
2006/12/05(火) 17:00:20for n in $aaa; do
echo "$n"
done
だと
"AAA
AAA"
BBB
となるのですが、これを
"AAA AAA"
BBB
とするにはどうすればいいのでしょうか?
0527名無しさん@お腹いっぱい。
2006/12/05(火) 17:12:42for n in "$aaa"
常に "$hoge" みたいに " " を付ける癖を付けろ。
0528名無しさん@お腹いっぱい。
2006/12/05(火) 17:13:44欲嫁。それだと逆に全部つながっちゃうが、、
0529名無しさん@お腹いっぱい。
2006/12/05(火) 22:58:15ゴリ押し
aaa='"AAA AAA" BBB'
while test "x$aaa" != x
do
case $aaa in
\"*\"\ *)
echo "$aaa" | sed 's,^\("[^"]*"\).*,\1,'
aaa=`echo "$aaa" | sed 's,^"[^"]*" *,,'` ;;
*\ *)
echo "$aaa" | sed 's, .*,,'
aaa=`echo "$aaa" | sed 's,[^ ]* *,,'` ;;
*)
echo "$aaa"; break ;;
esac
done
0530名無しさん@お腹いっぱい。
2006/12/05(火) 23:20:230531526
2006/12/06(水) 13:55:07精進します
0532名無しさん@お腹いっぱい。
2006/12/06(水) 16:54:030533名無しさん@お腹いっぱい。
2006/12/06(水) 17:48:45foo=$(echo $bar | sed -e 's!\(^.\).*!\1!')
0534名無しさん@お腹いっぱい。
2006/12/06(水) 18:48:23${var%%${var#?}}
0535532
2006/12/06(水) 20:52:29ありがとうございます。
自分なりに無い知恵を絞って出した答えは
foo=`perl -e "print substr('$var', 0, 1)"`
だったんですが、>>534には感動しました。
0536名無しさん@お腹いっぱい。
2006/12/06(水) 21:02:54↓がお勧め。
printf '%c\n' "$var"
0537名無しさん@お腹いっぱい。
2006/12/06(水) 21:42:29echo ${var:0:1}
0538名無しさん@お腹いっぱい。
2006/12/06(水) 21:48:39bash/ksh依存乙。
0539名無しさん@お腹いっぱい。
2006/12/06(水) 21:54:07foo=`expr "$bar" : '^\(.\)'`
0540名無しさん@お腹いっぱい。
2006/12/06(水) 22:49:45みなさん、ありがとうございます。
printfが存在を知ったり、exprの使い方がわかったりと、かなり勉強になりました。
ただ、>>539の正規表現は'\(.\)'`でいいみたいです。
^は正規表現の意味を持っていないので無視される。みたいなワーニングがでました。
0541名無しさん@お腹いっぱい。
2006/12/06(水) 23:48:500542名無しさん@お腹いっぱい。
2006/12/07(木) 00:01:29xargs を使った形に書き換えたいんですが、どう書けばいいんでしょうか?
0543名無しさん@お腹いっぱい。
2006/12/07(木) 00:25:47ていうか grep とか grep -r で済むなら xargs の出番なさそう。
0544542
2006/12/07(木) 01:04:05ファイルの文字コードがそれぞれ違う可能性があるから、
for i in *; do grep hoge $i |nkf -e >> out; done
と同じことをしたいのでした。
この場合も for の行で外部コマンドを呼んでいないから
ARG_MAX の制限はないようですね。
xargs で起動するコマンドの中にパイプやリダイレクトを
入れることはできるか、と聞きたかったのでした。
0545名無しさん@お腹いっぱい。
2006/12/07(木) 02:08:55find * ... -print | xargs -n 1 sh -c 'grep hoge $0 | nkf -e' > out
とかでもできるけど、
find * ... -print | xargs nkf -e | grep hoge > out
の方がエレガントなような。でも、 file: line 形式で grep 結果を
出したいなら、ついでに * 展開で溢れるケースも考慮して
find . ... -print | while read i; do grep hoge $i | nkf -e; done > out
しかし ARG_MAX の心配をするほどファイルがあるなら
find . ... -print | xargs perl -MJcode -lne 'print jcode("$ARGV: $_")->euc if /hoge/' > out
がちょっと長いけど速そう。
0546名無しさん@お腹いっぱい。
2006/12/07(木) 09:27:20find -print0
xargs -0
にしる、と突っ込んでおくべきなのだろうか
0547名無しさん@お腹いっぱい。
2006/12/07(木) 13:53:37仕様バグがどうこうとか。
0548名無しさん@お腹いっぱい。
2006/12/12(火) 15:03:35不安定な回線なのにどの程度不安定なのか把握できず困ってます
切断されてもすぐ再接続されるわけですが、これを記録しておきたいと思います
ping 撃ちまくるのはわかりますが、切断された時と再接続された時を記録するには
どんなスクリプト書けばいいですか?
0549名無しさん@お腹いっぱい。
2006/12/12(火) 19:53:11↓内容
1
11
111
cat 1.txt | grep 11
とやると
11と111の2つがヒットしてしまいます(^_^;)
11の行だけを抜き出す方法はないですかね?
0550名無しさん@お腹いっぱい。
2006/12/12(火) 20:14:17grep -w 11
0551名無しさん@お腹いっぱい。
2006/12/12(火) 20:47:34catが無駄です、のお約束。
0552名無しさん@お腹いっぱい。
2006/12/12(火) 21:11:23あんたマイナーになってるよ。
0553名無しさん@お腹いっぱい。
2006/12/12(火) 22:06:51grep -x 11 1.txt
0554名無しさん@お腹いっぱい。
2006/12/13(水) 10:08:050555名無しさん@お腹いっぱい。
2006/12/13(水) 10:26:21修正する文字数が少なくなるという、多大なメリットがある。
0556名無しさん@お腹いっぱい。
2006/12/13(水) 10:30:43別に咎めるほどのことではないと思う。
0557名無しさん@お腹いっぱい。
2006/12/13(水) 11:39:14本気で言ってんのか?
>>549のような使い捨てのワンライナーなら「修正の手間」も糞もねぇだろ。
元スクリプトが
script
なら、
zcat foo.gz | script
とすりゃいいだけだ。一行の修正も要らないし、zcat決めうちにするより
scriptの汎用性が維持される。
こっちのがツールボックスアプローチとして正しいわな。
必要も無いcatを使ってるスクリプトを見ると、俺は不安になるね。
書き手に変な癖がついてるのか、リダイレクションすら理解して無いのか、
品質上に問題があるんじゃないのかとか。
0558名無しさん@お腹いっぱい。
2006/12/13(水) 11:53:26使い捨てならわざわざリダイレクトなり引き数なりに
直す必要もないじゃん。
script の汎用性の話は意味がわからん。
0559名無しさん@お腹いっぱい。
2006/12/13(水) 12:05:560560名無しさん@お腹いっぱい。
2006/12/13(水) 12:11:06使い捨てと言いつつ、
grep -w 11 1.txt
ですむものを、
cat 1.txt | grep -w 11
と書きたがる意図が分からんのだが。
そんなにcatとタイプして無駄にプロセスを一個増やすのが好きか?
変な癖を正当化してるだけじゃないか?
0561名無しさん@お腹いっぱい。
2006/12/13(水) 12:18:25おれが書いたわけじゃないから
おれも意図はわからんな。
プロセスの減らし方あれこれ考えるより
さっさとスクリプト書きあげて
仕事終わらせちゃった方がいいじゃん。
0562名無しさん@お腹いっぱい。
2006/12/13(水) 12:22:26こんなことで「あれこれ考え」なきゃいけない時点でバカ。
判って無い証拠。
cat file cmd
が動作するなら
cmd <file
が確実に動作するんだから。
後者は無駄なプロセスが不要でタイプ量も少ない。
大体、タイプ量増えるのに、「さっさと仕事終わらせる」も糞もないだろ。
0563562
2006/12/13(水) 12:23:13cat file | cmd
な。
0564名無しさん@お腹いっぱい。
2006/12/13(水) 21:39:540565チラシの裏すまそ
2006/12/13(水) 22:01:56cat file | grep KEYWORD1
↓
カーソルキーの↑を押して前回のコマンドを表示し、
Deleteキー連打して、新しいキーワードを打ち込んで
↓
cat file | grep KEYWORD2
↓
以下、繰り返し
こんな感じだけどね。
シェルスクリプトの中では使わんけど。
0566名無しさん@お腹いっぱい。
2006/12/13(水) 22:06:27単にコマンドラインの右端の文字を変更しやすいという意味なら、
$ < file grep KEYWORD1
$ < file grep KEYWORD2
↑みたいにやれば良い。< fileの部分が左に来てもいいんだよ。パイプは使わない。
0568名無しさん@お腹いっぱい。
2006/12/13(水) 22:29:23とかしないの?
0569名無しさん@お腹いっぱい。
2006/12/13(水) 22:42:360570名無しさん@お腹いっぱい。
2006/12/13(水) 23:42:18bashでもzshでも、もちろんcshでも、^1^2とかできるはずだけど。
kshは知らんが。
0571名無しさん@お腹いっぱい。
2006/12/14(木) 01:39:01ヒットした最初の部分しか置き換わらんのが意外に使いにくいしくつう。
0572名無しさん@お腹いっぱい。
2006/12/14(木) 02:16:191 2 3....でなく
001 002 003...としたいのですが
d=0
mkdir 0$d
で$dに1つづ加算すると
1 2 3…となってしまいます orz
ヒントなんぞありましたら
おにぃちゃんおしえて! まぅまぅ
0573名無しさん@お腹いっぱい。
2006/12/14(木) 02:20:03d=0
mkdir 00$d
で$dに1つづ加算すると
001 002…009 になるものの 10を超えると
0010になってしまうので
010…099 100 となれば幸いです
0574名無しさん@お腹いっぱい。
2006/12/14(木) 02:31:550575名無しさん@お腹いっぱい。
2006/12/14(木) 02:37:100576名無しさん@お腹いっぱい。
2006/12/14(木) 07:34:49mkdir `seq -w 1 100`
0577名無しさん@お腹いっぱい。
2006/12/14(木) 11:29:48おにいちゃん!ありがと!まぅまぅ
perl,zshも勉強しますorz
winamp のストリームで
bpsやってるよ! まぅまぅ
0578名無しさん@お腹いっぱい。
2006/12/14(木) 14:03:120579名無しさん@お腹いっぱい。
2006/12/14(木) 15:23:17ps ax|grep XXX|wc -l
で確認すると、grep自身が入ったり入らなかったりします。
0580名無しさん@お腹いっぱい。
2006/12/14(木) 15:27:43pgrep XXX
0581名無しさん@お腹いっぱい。
2006/12/14(木) 15:45:13ありがとうございます
0582名無しさん@お腹いっぱい。
2006/12/14(木) 16:10:56grep -v grepしとけ
0583名無しさん@お腹いっぱい。
2006/12/14(木) 16:22:18プロセス名が logreport だったりするとだめ。
0584名無しさん@お腹いっぱい。
2006/12/14(木) 17:02:27やるな。
grep [X]XX
なら?
0585名無しさん@お腹いっぱい。
2006/12/14(木) 17:54:13いいのでしょうか?
シゥル関数使えないボーンシェルもありますか?
0586名無しさん@お腹いっぱい。
2006/12/14(木) 18:02:020587名無しさん@お腹いっぱい。
2006/12/14(木) 18:07:39Bourne shellなら知ってますが、
それとは違うシェルのことですよね?
0588名無しさん@お腹いっぱい。
2006/12/14(木) 18:19:270589名無しさん@お腹いっぱい。
2006/12/14(木) 19:04:190590名無しさん@お腹いっぱい。
2006/12/14(木) 23:41:000591名無しさん@お腹いっぱい。
2006/12/15(金) 00:34:460592名無しさん@お腹いっぱい。
2006/12/15(金) 00:36:26おどろーよシゥルダンス
0593名無しさん@お腹いっぱい。
2006/12/15(金) 01:07:42どう見ても米米クラブです。
本当にありがとうございました。
0594名無しさん@お腹いっぱい。
2006/12/15(金) 12:41:17LogFile名
Script名_$(date +"%Y%m%d-%H%M%S")_プロセスID
助言よろしくお願いします。
0595名無しさん@お腹いっぱい。
2006/12/15(金) 12:50:00プールン使うって理解でおk?
0596名無しさん@お腹いっぱい。
2006/12/15(金) 14:07:220597名無しさん@お腹いっぱい。
2006/12/15(金) 14:15:370598名無しさん@お腹いっぱい。
2006/12/15(金) 14:31:11素直にlogrotateでも使え
0599名無しさん@お腹いっぱい。
2006/12/15(金) 14:52:54どこかでそんなScriptを見た気がする。
0600名無しさん@お腹いっぱい。
2006/12/15(金) 16:29:30`expr \`date "+%Y%m%d"\` - 10`と比較して、これより小さければ、そのファイルを削除する。
あとはこれを、for f in `ls Script名_*` みたいな感じでループさせればいいだろう。
0601名無しさん@お腹いっぱい。
2006/12/15(金) 18:05:57多分そんなプロセス名自分は使わないだろうけど勉強になるな
0602名無しさん@お腹いっぱい。
2006/12/16(土) 00:44:15findで作成日が10日以前のログファイルを見つけて消すようにしては?
0603名無しさん@お腹いっぱい。
2006/12/16(土) 10:07:15この前その方法でやったけど何故か処理重かった・・・
なのでオレは>>600に近い方法でやったよ。
>600のそのままだとうまく動かないと思われ
0604名無しさん@お腹いっぱい。
2006/12/16(土) 10:26:00どの部分が重いのか、今後の為にも確認した方が良いと思うぞ。
0605名無しさん@お腹いっぱい。
2006/12/16(土) 10:33:12ほとんどの場合はそれでいいんだろうけどな、特に削除の場合は。
0606名無しさん@お腹いっぱい。
2006/12/16(土) 15:11:30今回は 10 だけど、7 の場合は date +%w でできてもっと単純。
0607名無しさん@お腹いっぱい。
2006/12/16(土) 18:26:39バックアップを1日3回取りたいのですが
日付毎のディレクトリを作って
mkdir /bak/`date +%d%m`
と、ここまではいいのですが2回目に、このスクリプトが動くと
もうディレクトリあるぞ( ゚Д゚)ゴルァ!!とエラーがでます(たいしたことはないのですが)
ディレクトリー作成とバックアップ用のスクリプトは別けたほうが良いでしょうか
if で あるからもう作らない 次進めとやると
速度落ちますよね?
なんかいい知恵ないでしょうか?
0608名無しさん@お腹いっぱい。
2006/12/16(土) 18:30:13これでいいじゃんw
0609名無しさん@お腹いっぱい。
2006/12/16(土) 18:38:48cronで夜中ディレクトリ作ればいいのですね
>>608 if で毎回やるのがなんかイヤな感じがしたので
識者の方々に伺おうと思ったww
今は反省している
それと%m%d だよな
逝って来ます
0610名無しさん@お腹いっぱい。
2006/12/16(土) 18:41:480611名無しさん@お腹いっぱい。
2006/12/16(土) 18:56:56別に中身は消えないんでしょうけどww
なんか気持ち悪いorz
すんませんありがとでございます
0612名無しさん@お腹いっぱい。
2006/12/16(土) 23:09:40「ディレクトリがなかったら作る」でいいんじゃないの?
こんな感じ↓でやれば、1行で済むじゃん。
[ ! -d ディレクトリ ] && mkdir ディレクトリ
0613名無しさん@お腹いっぱい。
2006/12/16(土) 23:57:530614名無しさん@お腹いっぱい。
2006/12/17(日) 01:06:26mkdir dir 2> /dev/null
でおけ。
0615名無しさん@お腹いっぱい。
2006/12/17(日) 14:11:54基本を身に付けたいorz
0616名無しさん@お腹いっぱい。
2006/12/17(日) 18:50:14set -e
で不都合が生じるから減点。
0617名無しさん@お腹いっぱい。
2006/12/17(日) 19:54:25mkdir -p dir 2>/dev/null || :
0618名無しさん@お腹いっぱい。
2006/12/17(日) 20:25:490619名無しさん@お腹いっぱい。
2006/12/19(火) 18:01:03標準入出力を意識(理解?)していない人は多いね。
たとえば、tar cf - . | ( cd /xxx && tar xpvf - ) とかすると
"-" について9割くらいは見ていた人に聞かれるし簡単には
何をやっているか理解してもらえない。
後は、3>&1 とか使えば多少は幅広がるのにね。
0620名無しさん@お腹いっぱい。
2006/12/19(火) 18:04:17またちょっと別の話かと。
0621名無しさん@お腹いっぱい。
2006/12/20(水) 06:17:18それぞれのオプションの意味を覚えていないやつってのはいるよね
結局伸びない
0622名無しさん@お腹いっぱい。
2006/12/20(水) 06:25:30そんな奴おらんやろ〜
0623名無しさん@お腹いっぱい。
2006/12/20(水) 07:40:370624名無しさん@お腹いっぱい。
2006/12/20(水) 07:45:47いるよ〜
>>623
paxもおすすめ
0625名無しさん@お腹いっぱい。
2006/12/20(水) 09:08:53zはgzだろ
xは解凍
cは圧縮
vは状況表示
fはファイル指定
じゃ無かったかな。
man tar してません。
0626名無しさん@お腹いっぱい。
2006/12/20(水) 09:22:560627名無しさん@お腹いっぱい。
2006/12/20(水) 09:26:12普段はファイラから解凍や圧縮してたんでじぇんじぇん覚えてにゃ
0628名無しさん@お腹いっぱい。
2006/12/20(水) 09:32:170629名無しさん@お腹いっぱい。
2006/12/20(水) 09:48:150630名無しさん@お腹いっぱい。
2006/12/20(水) 10:18:46その知識自体の価値ではなく、その人の性質というかそういうものについてだよね
0631名無しさん@お腹いっぱい。
2006/12/20(水) 11:27:320632名無しさん@お腹いっぱい。
2006/12/20(水) 13:42:15あと正規表現モナーですか?
0633名無しさん@お腹いっぱい。
2006/12/20(水) 19:39:44月が替わったりすると無理じゃね?w
20061125
20061201
20061231
20070101
よく月の1日にはリセットだなw
0634名無しさん@お腹いっぱい。
2006/12/20(水) 21:25:320635名無しさん@お腹いっぱい。
2006/12/20(水) 23:33:000636名無しさん@お腹いっぱい。
2006/12/21(木) 00:16:42BSD系なら
T=$(($(date +"%s") - 86400*10))
DATE=$(date -r $T +"%Y%m%d")
Linux (というかGNU coreutils) なら
DATE=$(date -d '10 days ago' +"%Y%m%d")
0637名無しさん@お腹いっぱい。
2006/12/21(木) 00:27:270638名無しさん@お腹いっぱい。
2006/12/21(木) 00:37:34-vはFreeBSD限定のような気がする
0639名無しさん@お腹いっぱい。
2006/12/21(木) 02:39:21rm `ls -t /directory/*.log | tail -n +11`
なんて方法もあるかなと。
0640名無しさん@お腹いっぱい。
2006/12/21(木) 08:04:44それいけるのか?
1日に複数個ログはいても
0641名無しさん@お腹いっぱい。
2006/12/21(木) 16:23:03ago だかなんかの引数で
0642名無しさん@お腹いっぱい。
2006/12/21(木) 16:29:37FreeBSDのdateは無理です
0643名無しさん@お腹いっぱい。
2006/12/21(木) 16:36:300644名無しさん@お腹いっぱい。
2006/12/21(木) 18:41:380645名無しさん@お腹いっぱい。
2006/12/23(土) 04:10:11foo *
というようなことをやりたいのですが、arg list too longというような
メッセージが出ます。
で、有名な
echo * | xargs foo
で解決と思いきや、xargsってARG_MAXを超えた引数については、fooを呼びなおすみたいですね。
fooは全てのファイルに対して1回だけ実行されないと困るんですが、何かいい方法はあるでしょうか?
0646名無しさん@お腹いっぱい。
2006/12/23(土) 09:36:470647名無しさん@お腹いっぱい。
2006/12/23(土) 09:45:32xargs でいいじゃん
0648名無しさん@お腹いっぱい。
2006/12/23(土) 10:11:400649名無しさん@お腹いっぱい。
2006/12/23(土) 10:27:411 fooをshell functionで書き直す。
2 arglist広げてシステム再構築。
3 fooを複数回実行されても困らないよう作り直す。
0650名無しさん@お腹いっぱい。
2006/12/23(土) 10:31:370651名無しさん@お腹いっぱい。
2006/12/23(土) 11:34:05find ... | xargs tar cvf hoge.tar
で ARG_MAX にあふれたファイルだけ入ったアーカイブ作ったことある。
たぶん受け側のプログラムを標準入力からファイル一覧読むように
改造するしかない。
0652名無しさん@お腹いっぱい。
2006/12/23(土) 12:20:28欲嫁。
>xargsってARG_MAXを超えた引数については、fooを呼びなおす
0653名無しさん@お腹いっぱい。
2006/12/23(土) 12:25:480654名無しさん@お腹いっぱい。
2006/12/23(土) 12:37:58xargsでいいじゃん
0655名無しさん@お腹いっぱい。
2006/12/23(土) 12:54:36欲嫁。
>xargsってARG_MAXを超えた引数については、fooを呼びなおす
0656名無しさん@お腹いっぱい。
2006/12/23(土) 13:05:47fooで同じファイルを二度処理するのはまずいってだけの話なら
xargsでいいんでないの?
一度のfooの実行で全ファイルを処理したいっつーんなら、
引数渡しでやるのは無理だわなそりゃ
0657645
2006/12/23(土) 13:58:06書き方が悪かったですが、fooは複数回実行されると困るというよりも、
全ファイルのデータを読み込んだ上でまあ数値計算みたいなものなんですが、
計算を行いたいわけです。
一度に処理されないと意味がない、ということです。
>>653
これ試してみましたけど、-n 100000とかやってもARG_MAXの壁は越えられないんで駄目でした。
どうもfoo内でフャ@イル一覧を読b゙ように書き換bヲるか、再構築bチてことみたいbナすね。
0658名無しさん@お腹いっぱい。
2006/12/23(土) 14:02:43ガベージアウト
0659名無しさん@お腹いっぱい。
2006/12/23(土) 15:50:070660名無しさん@お腹いっぱい。
2006/12/23(土) 15:58:380661名無しさん@お腹いっぱい。
2006/12/23(土) 16:19:21受け側のプログラムが引数使わないように修正する以外に方法はないって。
0662名無しさん@お腹いっぱい。
2006/12/23(土) 22:29:440663名無しさん@お腹いっぱい。
2006/12/23(土) 22:44:110664名無しさん@お腹いっぱい。
2006/12/23(土) 22:50:02kwsk
0665名無しさん@お腹いっぱい。
2006/12/25(月) 11:59:270666名無しさん@お腹いっぱい。
2006/12/25(月) 12:02:430点
0667名無しさん@お腹いっぱい。
2006/12/25(月) 12:06:06100点
0668名無しさん@お腹いっぱい。
2006/12/25(月) 12:16:32foo file1 file2 .... (すべてのファイル)
みたいに、1回だけで実行したいという質問なので、
>>665 は 0点。
0669名無しさん@お腹いっぱい。
2006/12/25(月) 12:26:590670名無しさん@お腹いっぱい。
2006/12/25(月) 13:13:180671名無しさん@お腹いっぱい。
2006/12/25(月) 17:00:20普通はプログラムを書き直すよな...
0672名無しさん@お腹いっぱい。
2006/12/27(水) 19:02:580673名無しさん@お腹いっぱい。
2006/12/28(木) 02:21:04上限なんだね。標準入力からN行読み込んでexecvpで直接渡すようなの
書いてみたら32768でアウト。
任意のコマンドのmainをフックして、単なる関数として渡すような形で
汎化しないと駄目だな。もっとも問題のプログラムが処理対象のリストを
標準入力から読んだほうがよほどいいと思うけど。
0674名無しさん@お腹いっぱい。
2006/12/28(木) 08:02:050675名無しさん@お腹いっぱい。
2006/12/28(木) 17:30:54バカか?
0676名無しさん@お腹いっぱい。
2006/12/28(木) 19:40:53レジスタ渡し、あるいはスタック渡しの部分で、malloc()で上書き。
.gdbinit で、がんがん代入。
実行開始。
ってのは、どう?
0677名無しさん@お腹いっぱい。
2006/12/28(木) 21:21:09-Dmain=xmain して、別途 dlsym(h, "xmain"); で呼び出すとか。
mainをそのまま直接呼ぶ方法あるのかな?ptraceとか使える?
0678名無しさん@お腹いっぱい。
2006/12/28(木) 21:27:020679名無しさん@お腹いっぱい。
2006/12/28(木) 22:49:41( cat <<EOFEOF
extern int printf(const char *,...);
main(int ac,char *argv[])
{
int i;
for(i=0;i<ac;i++)
printf("%d %s¥n",i,argv[i]);
}
EOFEOF
) | gcc -x c -
(
echo "b *main"
echo "run"
echo 'set $r3=3'
echo 'set *((char **)$r4) = "test1"'
echo 'set *((char **)$r4+1) = "test2"'
echo 'set *((char **)$r4+2) = "test3"'
echo 'set *((char **)$r4+3) = "test4"'
echo " c" ) | gdb ./a.out
(Mac OS X 限定...)
ってな感じで、symbol table がある場合は可能らしい。strip されている場合は、
entry point を根性で探してくれ。
0680名無しさん@お腹いっぱい。
2006/12/28(木) 22:52:07set $r4=(void *)malloc(1000)
とかで malloc() するのを忘れずに。
0681名無しさん@お腹いっぱい。
2006/12/29(金) 11:23:430682名無しさん@お腹いっぱい。
2006/12/29(金) 12:24:23環境なら)だから、そちらで調べた値をreadelfで得たエントリポイント
アドレスに足せばgdbのブレークポイント設定位置が判るよ。
後は$espから引数にアクセスして書きかえればいい。
この一連の操作はシェルスクリプトにできるから、xargsで扱えない
例外状況の処理用ツールになる(かもしれない)。
0683名無しさん@お腹いっぱい。
2006/12/29(金) 19:38:07例えば ./foo/bar/mbox を ./foo_bar_mbox にコピーしたい。
find . -type f -name mbox -exec cp {} `echo {}|tr '\/' '_'` \;
とかしても
cp: ./foo/bar/mbox and ./foo/bar/mbox are identical (not copied).とエラーになっちゃう。
スレ違いだったら誘導して
0684名無しさん@お腹いっぱい。
2006/12/29(金) 19:46:12シェルが先に ` ` を評価するから
実際に実行されるのは
find . -type f -name mbox -exec cp {} {} \;
になるな。
0685名無しさん@お腹いっぱい。
2006/12/29(金) 20:11:470686名無しさん@お腹いっぱい。
2006/12/29(金) 20:27:540687名無しさん@お腹いっぱい。
2006/12/29(金) 20:30:280688名無しさん@お腹いっぱい。
2006/12/29(金) 21:24:58>>685の方法で出来た。
0689名無しさん@お腹いっぱい。
2006/12/29(金) 21:30:16このスレのまとめって無いのかなぁ
ここしばらくの話、めっちゃ勉強になるんですけど
0690名無しさん@お腹いっぱい。
2006/12/29(金) 21:32:30それ以前の問題で外してしまった >>686 はもっと不憫。
0691名無しさん@お腹いっぱい。
2006/12/29(金) 21:36:010692名無しさん@お腹いっぱい。
2006/12/29(金) 22:02:53>>687はエラー出ちゃうんだよ。
どうも最初の/しか置換されなくて._foo/bar/mboxにコピーしようするの。
で原因なんだろうと調べてみてるんだけどわけわからん。
0693名無しさん@お腹いっぱい。
2006/12/29(金) 22:13:46まとめてクレクレ
0694名無しさん@お腹いっぱい。
2006/12/29(金) 22:48:30多分 sed の部分が間違っているんじゃないかな
検証してないけど
0695名無しさん@お腹いっぱい。
2006/12/29(金) 22:49:130696名無しさん@お腹いっぱい。
2006/12/29(金) 23:55:59echo "$(echo " $(echo "`echo "$(ps)"`")")"
ちょい大げさに書きすぎたけど、こんな感じのを見かけた
これはどんな決まりでトークンに切り分けてるのさ!!
0697名無しさん@お腹いっぱい。
2007/01/01(月) 00:02:28今年もよろ69
0698名無しさん@お腹いっぱい。
2007/01/01(月) 01:30:450699名無しさん@お腹いっぱい。
2007/01/01(月) 02:23:40Yellow Mookだろ。
それくらい察してやってくれ。
0700名無しさん@お腹いっぱい。
2007/01/02(火) 11:18:36素で分からんかったorz
0701名無しさん@お腹いっぱい。
2007/01/03(水) 19:21:380702名無しさん@お腹いっぱい。
2007/01/03(水) 19:36:330703名無しさん@お腹いっぱい。
2007/01/09(火) 22:08:180704名無しさん@お腹いっぱい。
2007/01/10(水) 15:53:220705名無しさん@お腹いっぱい。
2007/01/10(水) 15:59:180706名無しさん@お腹いっぱい。
2007/01/11(木) 20:32:03失礼しました
0707名無しさん@お腹いっぱい。
2007/01/11(木) 22:03:310708名無しさん@お腹いっぱい。
2007/01/12(金) 00:58:20sed 's/aaa/bbb/' hoge.dat > tmp.dat
mv tmp.dat hoge.dat
のようにして、一時的なファイルとしてtmp.datというファイルを用意するのが無駄だと
思うのですが、このような一時的なファイルを使わないで
直接、hoge.datをsedで編集する方法はありませんでしょうか?
m(_ _)m
0709名無しさん@お腹いっぱい。
2007/01/12(金) 01:08:30・-i オプションをつかう
・-i オプションがないsedをつかっているなら in-place editing 対応の sed の導入を検討する
・ed をつかう
・perl を使う
・一時ファイルを必要としないファイル命名法を検討する
お好みで
0710名無しさん@お腹いっぱい。
2007/01/12(金) 01:10:26あとinplaceというあらゆるフィルタをin-place editに使うコマンド
もある。(これはぐぐって)
0711名無しさん@お腹いっぱい。
2007/01/12(金) 01:20:43NetBSD の標準 sed には -i オプションは無い。
OpenBSDの(ry
以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 )
0712名無しさん@お腹いっぱい。
2007/01/12(金) 01:29:180713名無しさん@お腹いっぱい。
2007/01/12(金) 01:33:43http://www.idaemons.org/projects/inplace/
へー、これか。
これは知らなかった。
0714名無しさん@お腹いっぱい。
2007/01/12(金) 01:35:17MacOSXのFreeBSDなユーザーランドは 最初は FreeBSD 3.xR由来で
そのうちに 5.x由来とかのになってそれから先はシラネ。
でも5.x以降だろうなと推測。
0715名無しさん@お腹いっぱい。
2007/01/12(金) 01:45:52/usr/share/misc/bsd-family-tree あたりにちゃっかり書いてあったりする。
0716名無しさん@お腹いっぱい。
2007/01/12(金) 01:52:33flowers(花言葉)とかbirthtoken(誕生石)とか、妙なファイルもあるんだな。
0717名無しさん@お腹いっぱい。
2007/01/12(金) 01:55:54お、ほんとだ
なんでもあるな
0718名無しさん@お腹いっぱい。
2007/01/12(金) 01:57:43なるほど
でもそのファイルにNeXTの話がないのが微妙
0719名無しさん@お腹いっぱい。
2007/01/12(金) 17:59:42UNIXのファイルシステム上だと
(rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat
でOK
0720名無しさん@お腹いっぱい。
2007/01/12(金) 18:11:02なるほど
0721名無しさん@お腹いっぱい。
2007/01/12(金) 18:31:570722名無しさん@お腹いっぱい。
2007/01/12(金) 19:50:060723名無しさん@お腹いっぱい。
2007/01/12(金) 20:44:541. < hoge.dat
ファイルディスクリプタを確保する。(&標準入力にする)
このディスクリプタが開いている限り、ファイル名がなくなっても
ファイルの実体は消えない。
2. (...)
サブシェルを起動する。ファイルディスクリプタは継承される。
3. rm hoge.dat
hoge.datというディレクトリエントリ(ファイル名)を消す。
しかし、それが指していた実体は1.のディスクリプタからまだ参照
されているため、消えない。
4. >hoge.dat
別途hoge.dat という名前でファイルを開く。(&標準出力にする)
これは、もとのhoge.datが指していた実体とは別のディスク領域に書かれる。
5. 全体が終了すると、ファイルディスクリプタが閉じ、もとのファイル実体
が使っていたディスク領域が未使用状態とみなされる。
0724名無しさん@お腹いっぱい。
2007/01/13(土) 01:27:34(...)じゃなくて{...;}じゃダメ?
0725名無しさん@お腹いっぱい。
2007/01/13(土) 02:33:57自分でまずやってみろよ
0726名無しさん@お腹いっぱい。
2007/01/14(日) 01:54:35確かにpowerpc-apple-darwin8.0のbash 2.05b.0(1)-releaseでは`builtin`で呼び出せることも確認しました
一方で/bin/[や/bin/testも存在し、当然実行可能でした
また、若干の差異はありますが、複合コマンド(compound command)の`[[ expression ]]`もほぼ同じ用途に利用できます
そこで質問なんですが、少し上で話されていたような処理の重さ(無駄なプロセスの生成等)を考えた場合、
どれを使うのがベストなんでしょう?
0727名無しさん@お腹いっぱい。
2007/01/14(日) 02:03:12つーか、パフォーマンス重視な場合は
シェルスクリプトなんか使うな。
0728名無しさん@お腹いっぱい。
2007/01/15(月) 02:32:27という感じで、アクセスログから、特定のURLを探して数を数えて、その数をファイルに書き込んでいるのですが、これを毎日やると、
10
20
10
15
といった感じで、改行されてしまいます。
これを
10,20,10,15
という風に、,区切りにするにはどうすればよいでしょうか?
0729名無しさん@お腹いっぱい。
2007/01/15(月) 03:50:32tr -d '\n' < filea | sed -e 's/[ ]\{1,\}/,/g'
的な
0730名無しさん@お腹いっぱい。
2007/01/15(月) 03:56:110731名無しさん@お腹いっぱい。
2007/01/15(月) 03:56:540732名無しさん@お腹いっぱい。
2007/01/15(月) 06:03:29hoge.datというファイルがあるとして、
その中身が以下のようであったとします。
aaa
これを、
aaa
bbb
ccc
のように変更したいのです。
で、sedでこれを実現しようとする場合、
#!/bin/sh
sed 's/aaa/aaa \
bbb \
ccc/' hoge.dat
exit 0
こんな感じになると思います。
シングルコーテーションのとこがダブルコーテーションの場合は、
#!/bin/sh
sed "s/aaa/aaa \\
bbb \\
ccc/2 hoge.dat
exit 0
のように、\マークがふたつになると思います。
どうして、シングルコーテーションの場合は、\マークがひとつで、
ダブルコーテーションの場合は、\マークがふたついるのでしょうか?
よろしく呉教授お願いします。
0733名無しさん@お腹いっぱい。
2007/01/15(月) 06:36:10呉智英?なんてね
0734sage
2007/01/15(月) 09:21:26リアルで引いた。
0735名無しさん@お腹いっぱい。
2007/01/16(火) 23:37:40シングルクオートの場合はシェルに持ってかれないので\一つでOK。
こんな感じでシェルを介さなければ\一つでいける。
> cat replace.sed
s/aaa/aaa \
bbb \
ccc/
> sed -f replace.sed hoge.dat
aaa
bbb
ccc
>
SH(1)
> Double Quotes
> Enclosing characters within double quotes preserves the literal
> meaning of all characters except dollarsign (`$'), backquote
> (``'), and backslash (`\'). The backslash inside double quotes
> is historically weird. It remains literal unless it precedes the
> following characters, which it serves to quote:
> $ ` " \ \n
0737名無しさん@お腹いっぱい。
2007/01/18(木) 05:23:42以下のHTMLファイルがあるとします。
------------------------
<html>
<body>
<!--
memo
-->
hoge
</body>
<html>
------------------------
これを、以下のように<!--から-->の部分を削除したいのです。
------------------------
<html>
<body>
hoge
</body>
<html>
------------------------
このようなことをしたい場合、シェルスクリプトではどのようにすればよいでしょうか?
ちなみに、うちの会社の吉田さん曰く「そんなのawk使えば一発だよ!」といってました。。
0738名無しさん@お腹いっぱい。
2007/01/18(木) 07:34:59awkでもできるがsedを使うのが普通の感覚じゃね?
もちろん、後出しで仕様が複雑にならなければの話だけどな。
ちなみにsed的には/^<--/,/^-->/dとかだけど。
0739名無しさん@お腹いっぱい。
2007/01/18(木) 07:59:25違うよ。
0740名無しさん@お腹いっぱい。
2007/01/18(木) 09:02:41仕様はHTMLの文法通りと考えるべきだろ。後出しでも何でもない。
よって >>738 はその意味でも間違い。
0741名無しさん@お腹いっぱい。
2007/01/18(木) 09:15:58シェルスクリプトでやろうというのが間違いだな。
0742名無しさん@お腹いっぱい。
2007/01/18(木) 10:12:38つ「最長一致」
0743名無しさん@お腹いっぱい。
2007/01/18(木) 10:39:360744名無しさん@お腹いっぱい。
2007/01/18(木) 17:58:56bashでやってみました
#!/bin/bash
OLDHTML=$1
NEWHTML=$2
COMMENT=0
while read LINE
do
while echo $LINE | grep -q '<!--.*-->'
do
PARTLINE=${LINE%%<!--*}
LINE=$PARTLINE${LINE#*-->}
[ ! $LINE ] && continue 2
COMMENT=0
done
if echo $LINE | grep -q '<!--'; then
LINE=${LINE%<!--*}
[ $LINE ] && echo $LINE >> $NEWHTML
COMMENT=1
elif echo $LINE | grep -q '¥-->'; then
LINE=${LINE#*-->}
[ $LINE ] && echo $LINE >> $NEWHTML
COMMENT=0
elif [ $COMMENT -eq 0 ]; then
echo $LINE >> $NEWHTML
fi
done < $OLDHTML
0745名無しさん@お腹いっぱい。
2007/01/18(木) 18:18:42真面目にやるなら、htmlパーサ使っとけってこった。
0746名無しさん@お腹いっぱい。
2007/01/18(木) 18:27:230747名無しさん@お腹いっぱい。
2007/01/18(木) 19:02:080748名無しさん@お腹いっぱい。
2007/01/18(木) 19:07:10たぶんみんな別人だと思うぞ
0749名無しさん@お腹いっぱい。
2007/01/18(木) 21:30:050750吉田
2007/01/18(木) 23:57:28とくに>>744は茶ふいたわ。
>>737のいっているHTMLファイルを仮に、index.htmlというファイルとすると、
cat index.html | awk '/^<!--/,/^-->/ {next} {print}'
こうやればOK。
ばーか!
0751名無しさん@お腹いっぱい。
2007/01/19(金) 00:04:340752名無しさん@お腹いっぱい。
2007/01/19(金) 00:06:250754吉宗
2007/01/19(金) 00:09:270756徳田
2007/01/19(金) 00:14:200757名無しさん@お腹いっぱい。
2007/01/19(金) 00:15:09とりあえずばけらさんとこでも読んどけ
で>>737は本気で回答がほしければ
全ての形式のHTMLコメントを除去したいのか
>>737の形式のコメントを除去したいのか補足しろ
ってことでしょ
前者ならシェルスクリプト向きじゃないけど
0760名無しさん@お腹いっぱい。
2007/01/19(金) 00:27:54で、>>757はどっちなんだ?
0761名無しさん@お腹いっぱい。
2007/01/19(金) 17:31:080762名無しさん@お腹いっぱい。
2007/01/19(金) 19:32:180763名無しさん@お腹いっぱい。
2007/01/25(木) 13:51:51起動する前に好きなウィンドウマネージャを選べるようにコードを追加したいのですが、
どのようにすればいいのでしょうか?
0764名無しさん@お腹いっぱい。
2007/01/25(木) 13:56:32gdm でも使ったら?
0765名無しさん@お腹いっぱい。
2007/01/25(木) 14:01:490766名無しさん@お腹いっぱい。
2007/01/25(木) 14:05:12何がおすすめ?
0767名無しさん@お腹いっぱい。
2007/01/25(木) 14:07:200768名無しさん@お腹いっぱい。
2007/01/25(木) 14:12:47その理由は?
0769名無しさん@お腹いっぱい。
2007/01/25(木) 14:14:240770名無しさん@お腹いっぱい。
2007/01/25(木) 14:15:47wm 選べたっけ。
0771名無しさん@お腹いっぱい。
2007/01/25(木) 14:22:09xmessage のような物でも使って問い合わせるとかかな
0772名無しさん@お腹いっぱい。
2007/01/25(木) 14:26:51xdialog
0773名無しさん@お腹いっぱい。
2007/01/26(金) 01:27:22俺は$WMで分岐してる
case ${WM:-wmaker} in
wmaker) ... ;;
gnome) ... ;;
kde) ... ;;
*) ... ;;
esac
0774名無しさん@お腹いっぱい。
2007/01/26(金) 09:03:200775名無しさん@お腹いっぱい。
2007/01/26(金) 13:49:370776名無しさん@お腹いっぱい。
2007/01/26(金) 13:59:340777名無しさん@お腹いっぱい。
2007/01/26(金) 14:00:160778名無しさん@お腹いっぱい。
2007/01/26(金) 14:06:56その理由は?
0779名無しさん@お腹いっぱい。
2007/01/26(金) 14:11:340780名無しさん@お腹いっぱい。
2007/01/26(金) 17:33:130781名無しさん@お腹いっぱい。
2007/01/26(金) 17:38:480782名無しさん@お腹いっぱい。
2007/01/28(日) 05:14:10の中で、「20以上である」という条件を満たしたものが
いくつあるのかを数えたいです。
例えば、変数$listの中身が
10.4
30.2
15.4
5.2
20.2
だった場合には、答えは2と出るようにしたいのです。
n=1
sum=0
while [ $n -le 5 ]
do
s=`echo "$list" | sed -n "$n p"`
y=`trunc("$s")`
if test "$y" -ge 20
then sum=`echo "scale=0; $sum + 1" | bc`
else
exit 1
fi
n=`expr $n + 1`
done
echo $sum
0783782
2007/01/28(日) 05:15:34エラーになります。
変数$sに数値がひとつひとつ代入されて行くのは確認できたのですが、
小数点を切り捨てるためのtruncコマンドのところでエラーになります。
command substitution: line 1: syntax error near unexpected token `"$s"'
command substitution: line 1: `trunc("$s")'
どこがおかしいのか教えていただけませんか?
0784名無しさん@お腹いっぱい。
2007/01/28(日) 06:18:110785名無しさん@お腹いっぱい。
2007/01/28(日) 06:47:50というか、小数扱うなら awk 使っとけ
0786名無しさん@お腹いっぱい。
2007/01/28(日) 09:00:04nn=0; for aa in $list; do if [ ${aa%.*} -ge 20 ]; then nn=$((nn + 1)); fi; done; echo $nn;
0787名無しさん@お腹いっぱい。
2007/01/28(日) 09:14:300788782
2007/01/28(日) 09:15:01>>785
man truncしたらこんなのが出てきましたが。
つまり、truncはたぶんtrunc(数字)とかいう形で使うのかな、
と思ったのです。実際trunc "数字"ではうまくいきませんでした。
しかし、trunc()の形にしたところで
$ trunc(23.4)
-bash: syntax error near unexpected token `23.4'
こんな感じでエラーになり、たぶん正しい文法になっていないのが
ネックになっているような雰囲気です。
NAME
trunc -- truncate to integer value
SYNOPSIS
#include <math.h>
double
trunc(double x);
long double
truncl(long double x);
float
truncf(float x);
DESCRIPTION
The trunc() functions return the integral value nearest to but no larger
in magnitude than x.
SPECIAL VALUES
trunc(+-0) returns +-0.
trunc(+-infinity) returns +-infinity.
SEE ALSO
ceil(3), rint(3), math(3)
STANDARDS
The trunc() functions conform to ISO/IEC 9899:1999(E).
BSD January 29, 2003 BSD
0789782
2007/01/28(日) 09:19:35ありがとうございます。
これはなんの言語でしょうか。これがawk?
実際にこれでやってみましたがうまくいきません。
そもそも
${aa%.*}
この意味がわかりません。
けど、これを使うとtruncを使わずに済むので
便利そうですね。
いろいろと勉強してみます。
>>787
今はたまたまbashの勉強をしているので、
別にbashに依存しているわけではありません。
excelとか使った方が速いのはわかってますが、
無理やりbashでやろうとすることで
「 ( ・∀・)つ〃∩ ヘェーヘェーヘェー truncなんて関数があるんだ!」
という発見があるので、おもしろいのですよw
0790名無しさん@お腹いっぱい。
2007/01/28(日) 09:30:330791名無しさん@お腹いっぱい。
2007/01/28(日) 10:23:58それ、マニュアルページの一番上に trunc(3) て書いてるんじゃない?
マニュアルのセクション3は、Cのライブラリ関数。
0792782
2007/01/28(日) 17:54:08!!!!
全くその通りです!
bashでは使えないのですね・・・orz
bashの中でCのライブラリ関数を使う方法か、
他に小数点切り捨てによい方法はありませんか?
0793名無しさん@お腹いっぱい。
2007/01/28(日) 22:07:050794名無しさん@お腹いっぱい。
2007/01/28(日) 22:17:42[ は切り捨てないと使えないyo
0795名無しさん@お腹いっぱい。
2007/01/28(日) 22:32:23本当にbash使ってるなら、>>786 で合ってるよ。awkは関係ない。
これ自体がbashのスクリプト。
bashじゃない普通の shでも動くように >>786 を書き直してみた。
↓ (ちなみに俺は >>786 とは別人)
nn=0
for aa in $list
do
if [ `expr $aa : '\(.*\)\..*'` -ge 20 ]; then
nn=`expr $nn + 1`
fi
done
echo $nn
0796名無しさん@お腹いっぱい。
2007/01/28(日) 22:34:340797名無しさん@お腹いっぱい。
2007/01/29(月) 14:38:20ttp://x68000.q-e-d.net/~68user/unix/pickup?iconv
> 入力ファイルに無効な文字 (-f で指定した文字コードと矛盾するようなデータ) が
> 含まれていた場合、iconv はエラーとして終了する。FreeBSD の iconv では
> -c オプションを指定することで、無効な文字を無視して無視して続行することができる。
> 他の iconv では必ずエラーで終了してしまうようだ。
Linux で、変な文字を無視しつつ文字コードの変換をしたいときにはどうするのがベストでしょうか。
(個人的に馴染のある言語の) php で iconv//IGNORE をする、という手は思いついたのですが。
0798名無しさん@お腹いっぱい。
2007/01/29(月) 14:50:35Linuxでどうするのかを聞くなら
Linux板がいいでしょう。
0799782
2007/01/29(月) 21:06:29か、神!!!!
おかげさまでついにできました!
実はやりたかったことは、
「猛暑日(最高気温が35度以上の日)が2006年8月に何日あったか」
を各都市ごとに数えてみたかったのです。
そうすれば、熊本、佐賀、京都がいかに暑いところか
理解してもらえるかなと思って。
こんな感じでできました!!
ttp://sheel.mydns.jp/~sheel/moushobilastaugust.shtml
bashスクリプトファイルはここに置いておきますのね。
ttp://sheel.mydns.jp/~sheel/moushobilastaugust.sh
またいろいろと教えてください。by 皮先くん
0800782
2007/01/29(月) 21:09:19ちなみにshtmlの方は、12個の都市について
その場で気象庁からデータをとりにいって解析するので
クリックしてから表示されるまで1分弱ほど時間がかかりますので
辛抱強くお待ちくださいね。
0801名無しさん@お腹いっぱい。
2007/01/30(火) 09:09:26なかなかおもしろいね。
色々応用が利きそう。
0802名無しさん@お腹いっぱい。
2007/01/31(水) 09:39:22まだやってたんだね。
Mac板でのやりとりがなつかしいぜ…
0803782
2007/01/31(水) 16:57:2413の都市について気象庁から一気にデータを取得して
自動計算するシェルスクリプトもつくってみました。
<13の都市とは>
東京、大阪、京都、静岡、浜松、
熊本、鹿児島、枕崎、福岡、佐賀、大分、宮崎、長崎
「冬日が何日あったかを計算して表示する」
(13の都市のデータを取得するため1分弱ほど時間がかかります)
ttp://sheel.mydns.jp/~sheel/fuyubi200701.shtml
ソースはこちらです。
ttp://sheel.mydns.jp/~sheel/fuyubi200701.sh
0804名無しさん@お腹いっぱい。
2007/02/01(木) 12:23:44オレも気付いた
のでスルーしといた
0805名無しさん@お腹いっぱい。
2007/02/01(木) 14:41:450806名無しさん@お腹いっぱい。
2007/02/01(木) 21:39:01俺も気がついた
ので教えてやった。
皮先のスクリプトはよく利用させてもらってて重宝してるし。
0807名無しさん@お腹いっぱい。
2007/02/02(金) 20:25:38remsh $リモホ名 -n "find $ディレクトリ名 -type d -name $ディレクトリ名 -print"
で値が取得できるかどうかでディレクトリがあるかチェックしようと思っているのですが
もうちょっとスマートなやりかたがありますでしょうか?・・
0808名無しさん@お腹いっぱい。
2007/02/02(金) 20:30:160809名無しさん@お腹いっぱい。
2007/02/03(土) 16:34:40花子 83
裕子 98
尚美 91
という生徒のテストの点数を記載したデータがあったとき、
これを点数の高い順番でソートしたいのですが、
いろいろ調べるとawkがこういうのを得意にしているような気がしました。
この処理を簡単に行うにはawkが最も適していますか?
他に適している言語はありますか?
といいますのも、awkについて調べてみたのですが、
点数を加算する、とかはわかったのですが
点数の高い順番でソート、は無理なような気がしましたので・・・。
awkが最も適している、ということであればもうちょっとがんばってみたいと思いますが。
0810名無しさん@お腹いっぱい。
2007/02/03(土) 16:53:29ソートはsortでいいじゃん。
キーとするフィールド位置の指定だとか、アルファベット順じゃなく数の大小でのソートだとか、
そういうオプションもあるので、後はsortのmanみてみるとよいです。
0811名無しさん@お腹いっぱい。
2007/02/03(土) 16:54:590812809
2007/02/03(土) 18:17:50>>811
sort!!!!!
そ、そんな普段から自分でもよく使ってるやつで可能だったんですね!
さっそく>>811さんのようにやってみたらうまくいきました!
ありがとうございました。
0813名無しさん@お腹いっぱい。
2007/02/03(土) 18:31:44>>out.txt
を使ってどんどんファイルに書き加えていくのはわかりました。
では、ファイルに出力するのではなく、
(変数として?)メモリ上に出力していく方法はありますか?
例えば、
1回目の繰り返し文によって、変数$ssの値が5になりました。
変数$yyの中身は
5
となりました。
2回目の繰り返し文によって、変数$ssの値が2になったので、
変数$yyの中身は
5
2
となりました。
3回目の繰り返し文によって、変数$ssの値が7になったので
変数$yyの中身は
5
2
7
となりました。
こんな$ssに対して$yyのように出力が可能な方法はありますか?
0814名無しさん@お腹いっぱい。
2007/02/03(土) 18:39:33# ...
yy="$yy
$sss"
# ...
done
echo "$yy"
単純にこうやるとyyの中身の1行目に空の行が出来ちゃうから、
yyが空かどうかチェックしたほうがいいか。
0815名無しさん@お腹いっぱい。
2007/02/03(土) 18:48:28while ...; do
set "$@" "$yy"
done
for a in "$@";do
echo "$a"
done
0816しまった
2007/02/03(土) 18:50:23while ...; do
set "$@" "$yy"
done
for a in "$@";do
echo "$a"
done
0817名無しさん@お腹いっぱい。
2007/02/03(土) 19:04:22なるほど。言われてみると簡単ですね・・・。
実際に自分でやってみたら、確かにできました。
最初の空白行は
yyが殻かどうかチェックするより
最後にsedとかで削除した方が簡単なのでそうしようと思います。
sed '/^$/d'
これをパイプしようと思います。
ありがとうございました。
>>815
よく意味がわからないのですが、
とりあえず814さんの方法でできましたので
お気持ちだけいただいておきます。
ありがとうございました。
0818名無しさん@お腹いっぱい。
2007/02/03(土) 19:21:52それら全体である$@をループで回すことで取り出してる。
0819名無しさん@お腹いっぱい。
2007/02/03(土) 19:35:54なるほど、意味がわかりました!
ありがとうございます。
0820名無しさん@お腹いっぱい。
2007/02/03(土) 19:49:44太郎 84 25
花子 83 21
裕子 98 24
尚美 91 23
冬美 84 21
このように名前 点数 出席日数があったとき、
第一ソートは点数で、第二ソートは出席日数でソートし、
裕子 98 24
尚美 91 23
太郎 84 25
冬美 84 21
花子 83 21
こういうふうに出力したいのですが、
$echo test.txt | sort +2 -nr | sort +1 -nr
こうして二段階のsortでいいのかな?と思ったけど、
むしろ必ず
冬美 84 21
太郎 84 25
と、逆になってしまいます。そこで、
$echo test.txt | sort +2 -n | sort +1 -nr
-rオプションを外してやってみても同じ結果でした・・・orz
なにか別のコツなどがあるのでしょうか?
0821名無しさん@お腹いっぱい。
2007/02/03(土) 19:51:090822820
2007/02/03(土) 20:08:12sortは一度に複数のオプションを指定可能なので
第1フィールドを昇順でソートし、
第2フィールドは降順でソート、
ということが可能のようです。
この場合、具体的には以下のようにします。
$echo "text.txt" | sort +1nr +2n
ちなみに>>819のようなことがやりたい場合は
$echo "text.txt" | sort +1nr +2nr
ですね。
参考
ttp://biking.taiiku.tsukuba.ac.jp/~takai/Unix/Unix-text.html
0823名無しさん@お腹いっぱい。
2007/02/03(土) 20:12:13というか、cat使うと「catイラナイ」と言われるけどさ。
0824名無しさん@お腹いっぱい。
2007/02/03(土) 20:13:370825名無しさん@お腹いっぱい。
2007/02/03(土) 20:17:100826820
2007/02/03(土) 20:19:07あ・・・、マジでごめソ・・・orz
cat text.txt
が正解。
というか初心者がパイプを覚えるには最も分かりやすい例だと思うけどね。
cat hoge.txt | sort
0827名無しさん@お腹いっぱい。
2007/02/03(土) 20:23:030828名無しさん@お腹いっぱい。
2007/02/03(土) 20:25:490829名無しさん@お腹いっぱい。
2007/02/03(土) 20:27:31べつにそういう使いかた教えたせいじゃないだろう
0830820
2007/02/03(土) 21:14:27「全国の都道府県庁所在地の中で
2007年1月に冬日が多かった順に並び替えます」
その結果です。
http://sheel.mydns.jp/~sheel/fuyubikencho0701.txt
スクリプトはこちらです。
http://sheel.mydns.jp/~sheel/fuyubikencho0701.sh
「全国の都道府県庁所在地の中で
2006年8月に猛暑日が多かった順に並び替えます」
その結果です。
http://sheel.mydns.jp/~sheel/moushobikencho0608.txt
スクリプトはこちらです。
http://sheel.mydns.jp/~sheel/moushobikencho0608.sh
これを見ると、
佐賀、熊本、京都、名古屋は
夏場は日本一暑い割に冬場も不相応に寒いことがわかりますね。
0831名無しさん@お腹いっぱい。
2007/02/04(日) 01:24:10変数$hogeaと変数$hogebを連結しようと思います。
$hogeaの中身は
1
3
5
4
8
7
3
$hogebの中身は
1023
1032
1001
1002
1003
1009
1018
これをこんなふうにしたいのですが、
1 1023
3 1032
5 1001
4 1002
8 1003
7 1009
3 1018
ちょっと勉強して感じではよくわかりませんでした。
もうちょっと勉強してみます。
0832名無しさん@お腹いっぱい。
2007/02/04(日) 03:20:350833831
2007/02/04(日) 04:33:44できました!!!
変数が20個くらいあったのですが、
echo "$hogehoge1" | paste file1.txt - >file2.txt
echo "$hogehoge2" | paste file2.txt - >file3.txt
・・・・・
echo "$hogehoge20" | paste file20.txt - >out.txt
とやることでなんとかなりました。
これが47x12x47=26,508回繰り返さないと行けない処理で、
ハードディスクは痛めつけるますがこれ一回だけやればいいので
これでがまんすることにします。
もっとメモリ内のみで済む方法ってないんでしょうね・・・。
0834名無しさん@お腹いっぱい。
2007/02/04(日) 07:57:230835名無しさん@お腹いっぱい。
2007/02/04(日) 07:58:300836名無しさん@お腹いっぱい。
2007/02/04(日) 16:11:520837831
2007/02/04(日) 19:45:16例えばどういう方法がありますか?
わたしがやりたいのは、
気象庁のWebサイトから各都道府県庁所在地の
1961年以降の毎日のデータを2007年1月まで
一気に取得し、
例えば2007年1月の熊本(47814)のデータを
あとでとりだしやすいように加工した後に
「20070147814」
というファイル名で保存していく、ということです。
今朝から一括ダウンロードを始めましたがまだまだ終わりそうにありません。
24時間くらいかかりそうです・・・orz
こういう一回だけやれば済む使い捨てスクリプトをかくのに
シェルスクリプト以外になにかいい方法がありますか?
0838831
2007/02/04(日) 19:59:03シェルスクリプトはこんな感じ。
ttp://sheel.mydns.jp/~sheel/alldataget.sh.txt
使い捨てだね。
そのダウンロードの結果が例えばこれ。
ttp://sheel.mydns.jp/~sheel/19920147819.txt
2年ほど前もこのスレで言われてたんだけど、
毎回毎回気象庁にデータを取りに行くより
一回だけ一括ダウンロードしておいて
ローカルで参照した方がスクリプト自体も高速化する、ってことと
自分自身が一括ダウンロードをするだけのスキルが可能になったので
ついに念願の一括ダウンロードをやっています。
試しにダウンロードが終わった部分だけで
ある連続した5年間の1月の47都市の冬日の日数の平均値を計算し
その平均値の大きい順に並べ替えてみました。
こういうのをダウンロードでやろうとすると小一時間以上?かかるのだけど
ローカルに保存しておくと1〜2分くらいで終わりますね。
0839名無しさん@お腹いっぱい。
2007/02/04(日) 20:17:39PerlやRubyは考慮しないのかな、ということではないかと。
シェルスクリプトにはパズル的なおもしろさはあるけど、
若干の無理矢理感はあるし、外部コマンド使いまくりでモタモタするし。
0840831
2007/02/04(日) 20:36:39なるほど。
モタモタして時間がかかるのは確かだしね。
つか、俺的にはPerlもRubyもシェルスクリプトの1コマンド、という認識。
Rubyはよく知らんけど
Perlはシェルスクリプトと比べて意味がわかりづらいので
なかなか重い腰が上がらないんだよね。
あと、こういうデータを元にして動的なWebコンテンツをつくるには
やっぱphpでつか?
0841名無しさん@お腹いっぱい。
2007/02/04(日) 20:52:56なんでもええよ。
シェルスクリプトでもいいし。
ある程度アクセス数が多くなるなら、シェルスクリプトではきついけどね。
0842名無しさん@お腹いっぱい。
2007/02/04(日) 23:39:23そんなあなたにはRubyお薦め。
Perl挫折した俺が言うんだからまちがいない。
0843名無しさん@お腹いっぱい。
2007/02/05(月) 00:30:47その一方でウェブサービスをC++で書いたCGIで実現している奴もいる。
言語自体の得意分野や不得意分野があるのはその通りかも知れんが、
慣れた言語で適当にやるのも重要であるのだと思うぜ。所詮スクリプト。
そんな俺はPHPをおすすめしておこうかな
0844名無しさん@お腹いっぱい。
2007/02/05(月) 00:40:440845名無しさん@お腹いっぱい。
2007/02/05(月) 01:23:19動的なWebコンテンツというなら、テキスト処理に長けていることが条件かな。
PHPでもPerlでもRubyでも、あるいは他のものでもいいと思う。
慣れているものを選べばいいのでは。
どれも初めてトライというなら、適当に情報を拾って見比べてみて、
自分に合いそうだと思ったものにすればいんじゃね?
シェルスクリプトは、テキスト処理能力に関しては
長けた言語と比べるとかなり見劣りする。
ちょっと凝ったものになると素のシェルスクリプトではとても苦しい。
>>837ぐらいの処理なら、シェルスクリプト(+awkやsed)でもどうにかなるだろうけど。
0846名無しさん@お腹いっぱい。
2007/02/05(月) 16:28:420847名無しさん@お腹いっぱい。
2007/02/05(月) 16:37:56sort < hoge.txt
で済むから。
0848831
2007/02/05(月) 16:59:15そうですか。ありがとう。
>>843
phpも挑戦したことはあるけど
なんかやっぱPerlほどではないけど小難しい感じがしました・・。
>>842
Rubyですか。
使ったことないけど今確認したら
ちゃんとMacOSXにもプリインストールされてるみたいなので、
Perlに挫折した俺としてもRubyに挑戦してみようかな。
日本人が作ったみたいだしね。
0849名無しさん@お腹いっぱい。
2007/02/05(月) 17:08:42非常に解りやすい説明をありがとう。
0850名無しさん@お腹いっぱい。
2007/02/06(火) 22:48:39sort hoge.txt
の方が1文字少ない
0851名無しさん@お腹いっぱい。
2007/02/06(火) 22:53:30sort hoge.txt だと、もしhoge.txtが存在しないか、またはpermission deniedの場合
にも、一旦sortコマンドが起動された後でエラーになるため、ちょっと無駄になる。
sort < hoge.txtだと、hoge.txtが読めない場合はシェルのレベルでエラーになり、
sortコマンド自体起動されないので無駄がない。
0852名無しさん@お腹いっぱい。
2007/02/06(火) 23:27:58trみたいなファイルを引数に取らないのもあるわけで。
cat hoge.txt | tr a-z A-Z → tr a-z A-Z < hoge.txt
0853名無しさん@お腹いっぱい。
2007/02/06(火) 23:30:260854名無しさん@お腹いっぱい。
2007/02/06(火) 23:46:29確かに、こっちの方がcat以外でも同じ書き方になるから、ぱっと見わかりやすいか。
0855名無しさん@お腹いっぱい。
2007/02/06(火) 23:56:45< hoge.txt tr a-z A-Z
0856名無しさん@お腹いっぱい。
2007/02/07(水) 00:08:15知らなかった
0857名無しさん@お腹いっぱい。
2007/02/07(水) 00:36:54なんてのも可だったり。
0858831
2007/02/07(水) 03:53:44理由
・初心者がパイプの意味を理解するのに適している
・ < を使う方法と大差ない
・後ろから < で入力とか気持ち悪い
0859名無しさん@お腹いっぱい。
2007/02/07(水) 04:18:00理由の一つ目は、リダイレクトなら
「初心者がリダイレクトの意味を理解するのに適している」
と言い換えられるな。
理由の二つ目は、全然「catの方がいい」理由にはなってないな。
あんたにとって「大差ない」かもしれないが、少なくとも
タイプ量が多いし、無駄なプロセスも増える。
理由の三つ目は、もはや意味不明だな。何だそりゃ。
シェルのシンタクスが非常に美的であるとは俺も言わないが、
リダイレクトはシェルの基本だろ。
0860名無しさん@お腹いっぱい。
2007/02/07(水) 09:15:440861名無しさん@お腹いっぱい。
2007/02/07(水) 09:44:290862名無しさん@お腹いっぱい。
2007/02/07(水) 11:15:52アンカ間違ってるぞ。 正しくは >>859 だろう。
0863名無しさん@お腹いっぱい。
2007/02/07(水) 11:22:45自演乙。
ダメ人間は >>858
0864名無しさん@お腹いっぱい。
2007/02/07(水) 11:22:46sort<hoge.txt
で文字数いっしょだ。
0865名無しさん@お腹いっぱい。
2007/02/07(水) 11:29:170866名無しさん@お腹いっぱい。
2007/02/07(水) 11:38:540867名無しさん@お腹いっぱい。
2007/02/07(水) 11:39:580868名無しさん@お腹いっぱい。
2007/02/07(水) 12:56:56cat hoge して中身を見て,その結果を | で別のコマンドに流し込んで...
という部分を省略できるようになると冗長と感じるわけで
オレはコマンドライン編集を使いながら書いていく方が多いから
いまだに cat hoge | から始まるよ
% cat hoge
...出力...
% cat hoge | awk -F: '{print $1, $8}'
...出力...
% ...
そりゃ後から見ながら最適化すれば < hoge とか
コマンドの引数に hoge 指定とかになるんだが
0869名無しさん@お腹いっぱい。
2007/02/07(水) 12:59:13初心者ですが、catの左側にある % というのは何のコマンドですか?
うちでは % を付けるとエラーになるのですが・・
0870名無しさん@お腹いっぱい。
2007/02/07(水) 13:08:30英語のテキストならless、日本語ならlv、構文のあるテキストファイルならvim、バイナリならbvi。
よってcatは本当に結合したい時にしか使わんが、人それぞれか。
0871名無しさん@お腹いっぱい。
2007/02/07(水) 13:09:09Bourneシェルのデフォルトが$、Cシェル系は%なので両方が見られる。
0872名無しさん@お腹いっぱい。
2007/02/07(水) 13:13:100873名無しさん@お腹いっぱい。
2007/02/07(水) 13:13:55ゴマエー
0874名無しさん@お腹いっぱい。
2007/02/07(水) 13:22:21という命題はは排他ではない。
0875名無しさん@お腹いっぱい。
2007/02/07(水) 13:27:510876831
2007/02/07(水) 15:31:42そうそう、まさにそのとおり。
俺もそんなやり方でやっている。
viとかpicoとかでは>>868のような処理はできんだろ。
意味分かる?w
0877名無しさん@お腹いっぱい。
2007/02/07(水) 15:55:26...出力...
$ < hoge cat ← ここで Ctrl-Wを押す
$ < hoge ← catが消える
$ < hoge awk -F: '{print $1, $8}'
...出力...
↑こうすれば無問題。無駄なcatやパイプは要らない。
0878名無しさん@お腹いっぱい。
2007/02/07(水) 15:57:20なんでそんなにこだわるのかわからん。
0879名無しさん@お腹いっぱい。
2007/02/07(水) 15:58:360880名無しさん@お腹いっぱい。
2007/02/07(水) 16:33:11$ cat hoge
しまった長い... ^C
$ head hoge
考える...
$ tail hoge
考える...
$ sed -e '..' hoge |head
更に考える...
$ sed -e '..' -e '..' hoge |head
更に考える...
$ sed -e '..' -e '..' -e '..' hoge |head
やっぱ、catを使いたがるのは、ダメ人間だな。
0881名無しさん@お腹いっぱい。
2007/02/07(水) 16:42:250882名無しさん@お腹いっぱい。
2007/02/07(水) 16:56:480883名無しさん@お腹いっぱい。
2007/02/07(水) 18:05:59sed -n か awk を使えばできると思うのですが難しいです。
<span>
数行
</span>
数行
<span>
数行
</span>
0884名無しさん@お腹いっぱい。
2007/02/07(水) 18:19:17>>743
0885831
2007/02/07(水) 18:50:30今日、仕事をサボって(w)
本屋に行ってきて物色してみました。
Rubyがよさげだったので
さっそく「たのしいRuby」という本を
買ってきました。
ttp://sheel.mydns.jp/~sheel/ruby.jpg
ワクワクしますよ。
0886名無しさん@お腹いっぱい。
2007/02/07(水) 20:54:51xmlstarlet とかのツールを補助に使えばいいと思うよ。
XSLT でも Xpath でも好きにコマンドラインから使える。
0887名無しさん@お腹いっぱい。
2007/02/07(水) 22:52:08<span> と </span> のが完全に1行ずつなら簡単だね
0888名無しさん@お腹いっぱい。
2007/02/07(水) 22:55:59そのように整形する前処理をするとかね
0889831
2007/02/08(木) 09:49:41おれなら
cat -nとかでhtml書類を出力し
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、
その結果をまた
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、
という繰り返しでやるかな。
0890831
2007/02/08(木) 10:05:40>>883
おれなら
cat -nとかでhtml書類を出力し
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、
cat -nする前のhtmlに対してその数値の間をsedのdオプションで削除し、
その結果をまた
cat -nとかで出力し、
それをパイプしてgrepなどで一番最初に遭遇する
<span>と</span>をみつけ、
cut -d¥: -f1を使ってその行頭の数値(=行番号)をよみとり、
cat -nする前のhtmlに対してその数値の間をsedのdオプションで削除し、
という繰り返しでやるかな。
0891名無しさん@お腹いっぱい。
2007/02/08(木) 10:37:59なんてケースは考えるだけ無駄だったりするよな。
0892名無しさん@お腹いっぱい。
2007/02/08(木) 11:26:21RSSとか扱ってると、結構あるけど
0893名無しさん@お腹いっぱい。
2007/02/08(木) 11:30:47たいていこういう質問投げるやつって投げっぱなしだよね。
0894名無しさん@お腹いっぱい。
2007/02/08(木) 12:14:030895883
2007/02/08(木) 14:59:160896名無しさん@お腹いっぱい。
2007/02/08(木) 16:26:18知っているかた教えてください。
if [ -e /work/IBMIHS/logs/access_log ];
then
mv /work/IBMIHS/logs/access_log /logs/auditlog/access_log.$(date "+%Y%m%d") >> ${LOG_FILE}
echo "IHSログローテーション(アクセスログ)は成功しました。"
else
echo "IHSログローテーションは失敗しました。"
exit 1
fi
if [ -e /work/IBMIHS/logs/error_log ];
then
mv /work/IBMIHS/logs/error_log /logs/auditlog/error_log.$(date "+%Y%m%d") >> ${LOG_FILE}
echo "IHSログローテーション(エラーログ)は成功しました。"
else
echo "IHSログローテーションは失敗しました。"
exit 1
fi
0897名無しさん@お腹いっぱい。
2007/02/08(木) 16:45:32↑じゃダメな理由あるの?
0898名無しさん@お腹いっぱい。
2007/02/08(木) 17:12:50if [ -e /work/IBMIHS/logs/$log ];
then
else
fi
done
0899名無しさん@お腹いっぱい。
2007/02/08(木) 17:13:19for f in access_log error_log; do ....
ってことをしたいのか?
0900名無しさん@お腹いっぱい。
2007/02/08(木) 17:17:12ま、それはおいといて、単純に繰り返し部分をまとめるだけなら、
SRCDIR="/work/IBMIHS/logs"
DESTDIR="/logs/auditlog"
for FN in "access_log error_log"
do
if [ -e "${SRCDIR}/${FN}" ]
then
mv "${SRCDIR}/${FN}" "${DESTDIR}/${FN}.$(date "+%Y%m%d")" >> ${LOG_FILE}
echo "IHSログローテーション(${FN})は成功しました。"
else
echo "IHSログローテーションは失敗しました。"
exit 1
fi
done
とか。
0901名無しさん@お腹いっぱい。
2007/02/08(木) 17:32:12for FN in "access_log" "error_log"
0902名無しさん@お腹いっぱい。
2007/02/08(木) 19:58:24sudo -u hoge echo "hoge" > test.txt
とすると
test.txt の所有権は hoge ではなく、
sudo の実行者になります。
test.txt を hogeの所有権のファイルとして作成したいのですが、
どこに間違いがあるかご教授お願いします。
0903名無しさん@お腹いっぱい。
2007/02/08(木) 20:05:21sudo -u hoge sh -c 'echo "hoge" > test.txt'
0904名無しさん@お腹いっぱい。
2007/02/08(木) 20:07:161. > test.txt
2. sudo -u hoge echo "hoge"
の順で処理されるからね。
sudo -u hoge sh -c 'echo "hoge" > test.txt'
0905902
2007/02/08(木) 20:09:21レスありがとうございます、
上の内容をためしたところ、存在しない、といったエラーが出てしまいました。
お助けを〜〜
sh: test.txt: No such file or directory
0906902
2007/02/09(金) 01:44:34再度試してみたらいけました。
ありがとうございました。
教えていただいた内容も納得です!
ちょっと関連した内容になるのですが、
"hoge"の部分に改行などを含んだ変数を入れたいのですが、
うまくいきません。
どうやら改行ごとに、シェルが実行されてしまっている?ようです。
複数行にわたった変数を使用したい場合、
どのように記述すればよいでしょうか?
何度もすいません orz
0907名無しさん@お腹いっぱい。
2007/02/09(金) 06:43:270908名無しさん@お腹いっぱい。
2007/02/09(金) 10:17:57継続行を入力させてくれるかも。
0909名無しさん@お腹いっぱい。
2007/02/09(金) 11:38:06何もする必要ない。"hoge" の途中に改行があっても改行はそのまま保存される。
もし、そうならないなら、sudoを実行しているコマンドラインのシェルが、
普通のB-sh系のシェルじゃないんだろう。
(あるいは、sudo先のユーザーのログインシェルが B-sh系じゃないとか)
sh bash zsh ksh 等の B-sh系を使うこと。
0910902
2007/02/09(金) 15:59:08レスありがとうございます。
ある変数の内容をファイルに書き込みたい、
という場合、echo とリダイレクトを使う以外にありますでしょうか?
0911名無しさん@お腹いっぱい。
2007/02/09(金) 16:04:07echo "$変数" | sudo -u hoge sh -c 'cat > test.txt'
sudo先のshでechoすると、クォートが2重になってややこしいから、
sudo前にechoしておいてパイプでつなぐ。
0912902
2007/02/09(金) 16:30:53orz ありがとうございます、うまくいきました。
クオートが入れ子になってて鬱入ってました。
発想の転換ですね、さすがみなさん視点がすごいです!!
本当にありがとうございました!!!
0913名無しさん@お腹いっぱい。
2007/02/11(日) 17:22:09「ls -l」形式のファイル一覧が入っているテキストファイル(引数)
を1行ずつ読み込み、ファイル名に「.bak」が含まれるファイルを
消去するシェルスクリプトを作成したいのですが、頭の「#!/bin/sh」
を書いた時点で力尽きました。
「while read」を使う、というところまでは理解出来たのですが、
文法等がさっぱりで…どなたかご教授願えないでしょうか?
0914名無しさん@お腹いっぱい。
2007/02/11(日) 17:33:05read 使うと逆に難しそう。
grep .bak したのを sed か awk かなんかで加工して rm、がいいと思う。
> 「ls -l」形式のファイル一覧が入っているテキストファイル(引数)
この前提は変えられない?
ls -l 形式は扱いづらそうだから
find とか使った方がいいと思うんだが。
0915名無しさん@お腹いっぱい。
2007/02/11(日) 17:37:27超簡単。1行で書ける。
while read line; do case $line in *.bak);; *) echo "$line";; esac; done < file
>>914
おまえには難しかったようだね。
0916名無しさん@お腹いっぱい。
2007/02/11(日) 17:48:12それって >>913 の要求満たしてるの?
0917名無しさん@お腹いっぱい。
2007/02/11(日) 17:50:39「ls -l出力が書かれたファイルの中から、ファイル名 *.bakのファイルを消去する」 のか?
0918名無しさん@お腹いっぱい。
2007/02/11(日) 17:53:13わかりにくい質問でどうも済みませんでした。
前者の意味です。>>915 でできました。Thanksです。
0919名無しさん@お腹いっぱい。
2007/02/11(日) 17:54:48なら grep -v '\.bak$' でいいじゃん。
シンボリックリンクに対応してないけど。
0920913
2007/02/11(日) 18:02:01申し訳ありません。説明不足でした。
「ls -l出力が書かれたファイルの中から、ファイル名 *.bakのファイルを消去する」
が目的です。
ファイルリストをgrepして*.bakを含む行だけ取り出した後、awkを使用してls -lの
リストからファイル名を抜き出して…とか色々と考えていたのですが、それらを
シェルスクリプトで作成するだけの知識とか度胸とかが足りなくて困っております。
>915
回答ありがとうございます。「esacって何?」とか調べていたら返事が遅れて
しまいました。
0921名無しさん@お腹いっぱい。
2007/02/11(日) 18:03:460922名無しさん@お腹いっぱい。
2007/02/11(日) 18:04:520923名無しさん@お腹いっぱい。
2007/02/11(日) 18:06:10だったら、↓で行ける。(ls -l であって、ls -lR ではないんだから)
while read perm link usr grp size mon day year file other
do
case $file in
*.bak) rm "$file";;
esac
done < ls-l-file.txt
0924名無しさん@お腹いっぱい。
2007/02/11(日) 19:34:210925名無しさん@お腹いっぱい。
2007/02/11(日) 19:50:26cat file |sed -e
0926913
2007/02/11(日) 19:56:38回答ありがとうございます。色々いじくり回して実験してみます。
0927名無しさん@お腹いっぱい。
2007/02/11(日) 23:23:51アバウトに日付情報だけで判断できれば十分なので
find file -printf "%Ad" でやろうと思ったのですが
月をまたぐとどうにもこうにもいきません。
0928名無しさん@お腹いっぱい。
2007/02/11(日) 23:39:08OSによってはdateとかを駆使してもできるとは思うが、perlが適材適所
0929名無しさん@お腹いっぱい。
2007/02/11(日) 23:41:54とやって、
ファイルXXX をディレクトリAAA にコピー(cp) して
なおかつ、AAA に移動(cd) する
というコマンドを作りたいんだけど、どうすればいい?
0930名無しさん@お腹いっぱい。
2007/02/11(日) 23:48:390931名無しさん@お腹いっぱい。
2007/02/12(月) 00:14:22.bashrc あたりにこんな感じの function を書くのがお手軽かな
hoge(){
cp "$1" "$2"
builtin cd "$2"
}
引数のチェックとかの拡張はお好みで。
0932名無しさん@お腹いっぱい。
2007/02/12(月) 00:27:490933名無しさん@お腹いっぱい。
2007/02/12(月) 01:36:070934名無しさん@お腹いっぱい。
2007/02/12(月) 02:10:570935名無しさん@お腹いっぱい。
2007/02/12(月) 11:09:31>>934
そうだったのかー
0936名無しさん@お腹いっぱい。
2007/02/12(月) 11:46:560937名無しさん@お腹いっぱい。
2007/02/12(月) 12:00:010938名無しさん@お腹いっぱい。
2007/02/12(月) 12:33:37bashだろ、どうせ。
0939929
2007/02/12(月) 22:02:42tcsh です
0940名無しさん@お腹いっぱい。
2007/02/13(火) 00:32:06cshスクリプトを書いておいて、
それをsourceするaliasを設定するとか。
もっとスマートな方法、教えてエロい人。
0941名無しさん@お腹いっぱい。
2007/02/13(火) 03:40:49シンボリックリンクをgawkから変更しようかしら。
最近のgawkはインターネットアクセスが出来るらしいけど使いかたが分からない。
0942名無しさん@お腹いっぱい。
2007/02/13(火) 06:38:22日本語が「通る」の意味がよくわからないが、
.がちゃんと一文字に適合したり
文字クラスとして[あ-ん]のようなものが書けたり
\u3120のようにユニコードリテラルを記述できたりするの?
0943名無しさん@お腹いっぱい。
2007/02/13(火) 07:18:58そのへんは検証してもらえないかなと思いまして。w
とりあえず.は駄目でした。w
[あ-ん]はたぶん大丈夫そうな気が。
4行目の機能ってgawkにあるんですか?
0944名無しさん@お腹いっぱい。
2007/02/13(火) 07:45:46いや別にgawkは関係ない。
せっかくUnicodeに対応しているなら、出来たほうが便利なのは
確実だが。
"Tibetan"とか"Greek"とか"CJKCompatibility"みたいに、
Unicodeのブロック/カテゴリ名が使えるとさらによい。
逆にその辺が出来ないなら、今時のUnicode対応としては
大したこと無いレベルじゃまいか?
まー今更awkにそんなに多くを求めてもしゃーない気はするが。
0945名無しさん@お腹いっぱい。
2007/02/13(火) 07:48:10単に8bitクリーンなだけじゃないの?
0946名無しさん@お腹いっぱい。
2007/02/13(火) 08:25:37...(.が3回)で一文字に適合しました。w
0947名無しさん@お腹いっぱい。
2007/02/13(火) 14:47:36for f in $dir;do
echo "$f"
done
とすると
aaa
bbb
と表示されますが、この dir に空白を含む文字列を含ませるにはどうすればいいのでしょうか?
イメージとしては
dir='aaa bbb "ccc ddd"' とすると
aaa
bbb
ccc ddd
と表示できたらいいなと
0948名無しさん@お腹いっぱい。
2007/02/13(火) 18:30:35できないはず
だからperlにしろと
0949名無しさん@お腹いっぱい。
2007/02/13(火) 19:00:25そういう場合は位置パラメータを使う。
set aaa bbb 'ccc ddd'
for f in "$@"; do
echo "$f"
done
これで、
aaa
bbb
ccc ddd
と表示される。
0950名無しさん@お腹いっぱい。
2007/02/13(火) 20:24:330951929
2007/02/13(火) 21:04:24alias 使えばいいというのはわかるんですが、
そのcsh スクリプトがかけないんです
0952名無しさん@お腹いっぱい。
2007/02/13(火) 21:06:59cshの話は厳禁。よそ行け。
b-shでの答えはすでに出てる。
0953名無しさん@お腹いっぱい。
2007/02/13(火) 21:38:370954名無しさん@お腹いっぱい。
2007/02/13(火) 21:38:560955名無しさん@お腹いっぱい。
2007/02/13(火) 21:43:140956名無しさん@お腹いっぱい。
2007/02/13(火) 22:58:21$HOME/tmp/cpcd.shとかを作って中身を
#!/bin/tcsh
cp "$1" "$2"
cd "$2"
として、
chmod +x $HOME/tmp/cpcd.sh
alias cpcd "source $HOME/tmp/cpcd.sh"
0957名無しさん@お腹いっぱい。
2007/02/13(火) 23:25:57sh-bangも+xもいらないんじゃないか?
0958名無しさん@お腹いっぱい。
2007/02/14(水) 01:24:40対処法を伝授して下さい
mv abc.txt %Y%m%dd.txt
0959名無しさん@お腹いっぱい。
2007/02/14(水) 01:44:50>4行目の機能ってgawkにあるんですか?
ない。
gawkは内部的にwchar_tを使っているだけで、スクリプトの記述は
そのときの locale設定が使われ、表にはUnicode(やwchar_t)はでてこない。
一応 [あ-お]はできるけどね。
0960名無しさん@お腹いっぱい。
2007/02/14(水) 01:48:59mv abc.txt `date +%%Y%m%d`d.txt
0961名無しさん@お腹いっぱい。
2007/02/14(水) 01:50:000963名無しさん@お腹いっぱい。
2007/02/14(水) 03:16:180965名無しさん@お腹いっぱい。
2007/02/14(水) 08:07:50の上のほうにあるスクリプトのtrapって何を拾っているんでしょうか?
0 は分かるんですが、1, 2, 3, 15が分かりません。
0966名無しさん@お腹いっぱい。
2007/02/14(水) 09:19:02man 7 signal参照。
1:SIGHUP 2:SIGINT 3:SIGQUIT 15:SIGTERM
0967名無しさん@お腹いっぱい。
2007/02/14(水) 10:12:04$ man 7 signal
No entry for signal in section 7 of the manual
ここはLinux板じゃない。
0968名無しさん@お腹いっぱい。
2007/02/14(水) 13:32:310969名無しさん@お腹いっぱい。
2007/02/14(水) 13:33:040970名無しさん@お腹いっぱい。
2007/02/14(水) 13:54:30man -a signalと言っておけばよかったね。
BSD(つーかMacだが)だとセクション3のライブラリ関数のとこに
一緒に載ってるようだな。
0971名無しさん@お腹いっぱい。
2007/02/14(水) 15:13:050972名無しさん@お腹いっぱい。
2007/02/14(水) 22:52:510973名無しさん@お腹いっぱい。
2007/02/14(水) 23:01:02ls -FA | grep /
ちょっと意味が違うか?
0974名無しさん@お腹いっぱい。
2007/02/14(水) 23:13:07俺は
ls -l | grep 4096
でなんとかなっている
0975名無しさん@お腹いっぱい。
2007/02/14(水) 23:15:18ls -l | grep ^d
どちらかといえばこれか。
0976名無しさん@お腹いっぱい。
2007/02/14(水) 23:16:200977名無しさん@お腹いっぱい。
2007/02/14(水) 23:26:49大文字も小文字も区別なく表示させたいのですが、可能ですか?
ls *.dat
に何か工夫して、aaa.dat とbbb.DAT などを表示させたいです。
0978名無しさん@お腹いっぱい。
2007/02/14(水) 23:36:164096って!
Bite じゃなくて bit 単位ですか?
家だと、 grep 512 で、例外を除き期待どおりの結果になるが・・
0979名無しさん@お腹いっぱい。
2007/02/14(水) 23:44:26ls | grep -i
0980名無しさん@お腹いっぱい。
2007/02/14(水) 23:46:190981名無しさん@お腹いっぱい。
2007/02/14(水) 23:47:390982名無しさん@お腹いっぱい。
2007/02/14(水) 23:50:41それだと、質問子の例示した拡張子にしか一致しないよ。
>>大文字も小文字も区別なく表示させたいのですが、可能ですか?
というテーゼには合致しない。
0983977
2007/02/14(水) 23:51:14ありがとうございます
そっか、grep を使うという技があったか!
0984972
2007/02/14(水) 23:56:08-l オプションを使わずにおながいします、
余計な出力が多いので・・・。orz
0985名無しさん@お腹いっぱい。
2007/02/14(水) 23:59:23find . -depth 1 -type d
ってどのぐらいの範囲でつかえるんだろう?
0986名無しさん@お腹いっぱい。
2007/02/15(木) 00:00:52ならば
>>973 で、問題無かろう?
0987名無しさん@お腹いっぱい。
2007/02/15(木) 00:02:30なるほど
0988名無しさん@お腹いっぱい。
2007/02/15(木) 00:03:540989名無しさん@お腹いっぱい。
2007/02/15(木) 00:08:32http://www.jp.freebsd.org/man-jp/search.html
ここでアレとか
0990名無しさん@お腹いっぱい。
2007/02/15(木) 00:10:06http://www.linux.or.jp/JM/html/tcsh/man1/tcsh.1.html
0992名無しさん@お腹いっぱい。
2007/02/15(木) 00:39:29早速のおひかえ、ありあとうござんす
0993名無しさん@お腹いっぱい。
2007/02/15(木) 00:44:56ここは
シェルが参照するエイリアスがいくつ
って文章で終わってるね。ちょんぎれているのではないであろうかと愚考するものでありますが…
0994名無しさん@お腹いっぱい。
2007/02/15(木) 00:55:10エイリアス置換
の章だな
しょぼいブラウザをつかっているのかな?
そこはページ全体の1/5ぐらいの場所
0995名無しさん@お腹いっぱい。
2007/02/15(木) 01:05:260996名無しさん@お腹いっぱい。
2007/02/15(木) 01:19:130997名無しさん@お腹いっぱい。
2007/02/15(木) 13:59:58りぬサイトのせいなのかブラウザのせいなのかわからんけど。
りぬ使いは無問題か?
0998名無しさん@お腹いっぱい。
2007/02/15(木) 14:24:530999名無しさん@お腹いっぱい。
2007/02/15(木) 14:30:29firefoxでも windows でも FreeBSDでも無問題
つぎ
シェルスクリプト総合 その8
http://pc10.2ch.net/test/read.cgi/unix/1171517324/
1000名無しさん@お腹いっぱい。
2007/02/15(木) 14:33:05|
|∧∧
(-_-) 1000
(∩∩)―――
/
/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。