シェルスクリプト総合 その9
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2007/08/15(水) 07:25:02スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0558名無しさん@お腹いっぱい。
2007/12/12(水) 22:55:420559名無しさん@お腹いっぱい。
2007/12/13(木) 02:40:12以下のHTMLタグがあるとします。
<option name=myname value="a1">b1</option>
<option name=myname value="a2">b2</option>
<option name=myname value="a3">b3</option>
上記の中から文字列処理を行い、以下の結果を導き出したいです。
a1,b1
a2,b2
a3,b3
このようにするにはどのように処理すればよろしいでしょうか?
よろしくお願いいたします。
0560名無しさん@お腹いっぱい。
2007/12/13(木) 03:12:040561名無しさん@お腹いっぱい。
2007/12/13(木) 08:25:29>>559
ほんとうにこの例だけなら、
sed -e 's/.*="//' -e 's/">/,/' -e 's/<.*//'
0562名無しさん@お腹いっぱい。
2007/12/14(金) 00:10:270563名無しさん@お腹いっぱい。
2007/12/14(金) 00:14:430564名無しさん@お腹いっぱい。
2007/12/14(金) 01:21:16m(__)m
全然分からなくて…
0565名無しさん@お腹いっぱい。
2007/12/14(金) 01:40:44wとかwhoとかlastとか調べてみるといいかもしれん
0566名無しさん@お腹いっぱい。
2007/12/14(金) 01:48:27そういうのは普通E4X
var x = <html>
<option name="myname" value="a1">b1</option>
<option name="myname" value="a2">b2</option>
<option name="myname" value="a3">b3</option>
</html>;
for each (var opt in x.option) {
print("" + opt.@value + "," + opt);
}
じゃなかったらXSLT
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="option">
<xsl:value-of select="@value"/>,<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
0567名無しさん@お腹いっぱい。
2007/12/14(金) 01:50:22while true; do
if [ ! -f /tmp/last.txt ] ; then
touch /tmp/last.txt
fi
mv /tmp/last.txt /tmp/last.txt.old
last > /tmp/last.txt
diff /tmp/last.txt.old /tmp/last.txt
sleep 5
done
基本はこんな感じか。これでもログイン/ログアウトの度に反応がでる。
あとは画面を生diffの結果から、も少し整形する必要があるわな。
< user pts/3 192.168.0.1 Fri Dec 14 01:43 still logged in
---
> user pts/3 192.168.0.1 Fri Dec 14 01:43 - 01:43 (00:00)
行の頭からログイン時刻までを一本の文字列にしてawkとかの連想配列のキーにして、
ログアウト時刻(またはstill logged inn)を保持しておくか...
あとlastのお尻の方はだんだん削られていくから、これも何とかする必要があるな。
0568名無しさん@お腹いっぱい。
2007/12/14(金) 02:00:24diff /tmp/last.txt.old /tmp/last.txt > /dev/null 2>&1
if [ $? -ne 0 ] ; then
clear
cat /tmp/last.txt
fi
こうやっちゃうとかな。監視コンソール風。
0569名無しさん@お腹いっぱい。
2007/12/14(金) 03:19:03また俺のIPがサンプルに使われてる(´・ω・`)
攻撃の的になるからやめてよ
0570名無しさん@お腹いっぱい。
2007/12/14(金) 03:38:510571名無しさん@お腹いっぱい。
2007/12/14(金) 04:26:20最近、インターネットにアクセスできないと思ったらお前のせいかー
0572名無しさん@お腹いっぱい。
2007/12/14(金) 09:18:48過去スレ保存している人いませんかね?
0573名無しさん@お腹いっぱい。
2007/12/14(金) 11:52:490574名無しさん@お腹いっぱい。
2007/12/15(土) 01:59:33http://www32.atwiki.jp/shellscript/
よかったらここにアップしていただけないでしょうか。
0575名無しさん@お腹いっぱい。
2007/12/16(日) 11:59:59で /home/***/text/***.txt
を探しているのですが、
どうもかなり遅めでload averageもあがりやすいようです。
ls あたりで代替策を探してるのですが、
ls /home/*/text/*.txt
あたりが良いかなと思ったのですが、*は/も含むと聞いて困ってます。
(試したところ、速度はfindと比べてかなり早かったのですが。。。)
どなたか助言お願いします。
0576名無しさん@お腹いっぱい。
2007/12/16(日) 13:07:30ヤキいれてあげるから、そういうデタラメを教えた奴を連れてきなさい。
0577名無しさん@お腹いっぱい。
2007/12/16(日) 13:13:56locate (+grep)とか。
0578名無しさん@お腹いっぱい。
2007/12/16(日) 15:13:40-regexの * は / も含むよw
ヤキいれられるのはオマエww
0579名無しさん@お腹いっぱい。
2007/12/16(日) 15:21:47日本語読めない低脳は引っ込んでいなさい。-regexの*の事ではない。
> ls /home/*/text/*.txt
> あたりが良いかなと思ったのですが、*は/も含むと聞いて困ってます。
0580名無しさん@お腹いっぱい。
2007/12/16(日) 21:15:33の場合、*は/を含む(ディレクトリ階層を縦断する)
ls */*
の場合、*は/を含まない(/で区切られたディレクトリ階層だけを探す)
0581名無しさん@お腹いっぱい。
2007/12/16(日) 23:34:21文字列「aaa」と書いた1.txtをsedで「bbb」に変えて保存したい。
どのようにしたらいいでしょうか?
0582名無しさん@お腹いっぱい。
2007/12/16(日) 23:38:270584名無しさん@お腹いっぱい。
2007/12/17(月) 01:04:43文字列「aaa\taaa」←水平タブ入りが書いてある1.txtを
文字列「bbb\tbbb」に変えて保存したい。
どうしたらいいでしょうか?
エスケープシーケンス入りの文字列の扱いがわからない。。。
0585名無しさん@お腹いっぱい。
2007/12/17(月) 03:28:20タブ・エスケープは関係ない。/gをつけるとマッチしたもの全てを置換する(globalのg)。
gなしだと最初の一個だけ
0586584
2007/12/17(月) 05:11:44じゃ、じゃあ
文字列aaaを
aaa
bbb
のように改行付きで置換したいとき
sed -i -e 's/aaa/aaa\nbbb/g' 1.txt
としても改行されません。
FreeBSDのsedはエスケープシーケンス使えない?
0587名無しさん@お腹いっぱい。
2007/12/17(月) 06:24:56aaa
% sed -e 's/aaa/aaa\nbbb/g' /tmp/1.txt
aaa
bbb
% sed --version
GNU sed 4.1.1版
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
(後略)
0589573
2007/12/17(月) 10:00:25アップロードし直した(shellscript_.tar.bz2)
0590名無しさん@お腹いっぱい。
2007/12/17(月) 10:30:05\を前置して改行をそのまま書く。
% echo aaa|sed 's/aaa/aaa\
bbb/'
0591名無しさん@お腹いっぱい。
2007/12/18(火) 03:47:42scriptコマンドでコマンドログをとりたくて、ログイン時に自動的に呼び出されるよう
profileに書きましたが、ターミナルを終了する時にexitを何回も打たなくてはならないのが
気持ち悪いです。
例えば、一回のexit入力で、scriptとログインシェルの2回分を実行するというのは可能ですか?
0592名無しさん@お腹いっぱい。
2007/12/18(火) 07:11:01exec script
0593名無しさん@お腹いっぱい。
2007/12/18(火) 07:42:32ありがとう
0594名無しさん@お腹いっぱい。
2007/12/18(火) 20:27:05どうすればよいですか?
APPLE,150円
APPLE,140円
APPLE,180円
とあったら、1フィールド目のみでuniqして先頭の行を出力したいです。
もちろん値段もほしいです。
ご教示お願いします。
0595名無しさん@お腹いっぱい。
2007/12/18(火) 20:29:22perl かなんかで書いちゃった方が早いんじゃね。
0596名無しさん@お腹いっぱい。
2007/12/18(火) 20:31:180597名無しさん@お腹いっぱい。
2007/12/18(火) 20:34:35早っ! ご教示ありがとございます
awkにします
0598名無しさん@お腹いっぱい。
2007/12/18(火) 21:00:260599名無しさん@お腹いっぱい。
2007/12/18(火) 21:04:490600名無しさん@お腹いっぱい。
2007/12/18(火) 22:02:220601名無しさん@お腹いっぱい。
2007/12/18(火) 22:25:210602名無しさん@お腹いっぱい。
2007/12/18(火) 22:26:410603名無しさん@お腹いっぱい。
2007/12/18(火) 23:53:32しね
0604名無しさん@お腹いっぱい。
2007/12/18(火) 23:57:25しね
二度と現れるなボケ
0605名無しさん@お腹いっぱい。
2007/12/19(水) 00:46:050606595
2007/12/19(水) 00:54:10よく知らないシェルスクリプトでがんばるより
便利で得意な言語で書いちゃった方が早いこともあるよ、
ってだけの話なんだけど。
0607名無しさん@お腹いっぱい。
2007/12/19(水) 00:57:45俺>>598じゃねーよw
おまえ、二度と現れるなと言っただろ?w
0608名無しさん@お腹いっぱい。
2007/12/19(水) 01:01:44おまえまだわかんねーのかよ?
おまえが言ってることは「ググレカス」と同レベル
どんな質問でも当てはまってしまうアホな回答。
0609名無しさん@お腹いっぱい。
2007/12/19(水) 01:06:000610名無しさん@お腹いっぱい。
2007/12/19(水) 01:07:070611名無しさん@お腹いっぱい。
2007/12/19(水) 01:48:57>>595は自演が下手だな
こんな時間に過疎スレで1分後にレスって明らかに自演。
0613名無しさん@お腹いっぱい。
2007/12/19(水) 02:19:310614名無しさん@お腹いっぱい。
2007/12/19(水) 02:41:340615名無しさん@お腹いっぱい。
2007/12/19(水) 02:49:04あとは応用例だが、
perlのラクダ本は電話帳みたいな本が上下2巻。クックブックは別にある。
よってawkの勝ち
0616名無しさん@お腹いっぱい。
2007/12/19(水) 02:57:180617名無しさん@お腹いっぱい。
2007/12/19(水) 03:12:02awkの原典は、初学者が手にするとちょっとな。途方にくれるというか何というか。高い本なのに。
perlのラクダ本はその点は抜かりなく、初心者もすんなりと中に入り込んでいける。
awkの入門書で良書というと、ASCIIのawk256倍本くらいしか思いつかない。俺は今でも愛用してるけど、
あんな昭和の時代の本、いまどき手に入るはずもなく
0618名無しさん@お腹いっぱい。
2007/12/19(水) 03:17:310619名無しさん@お腹いっぱい。
2007/12/19(水) 03:49:30その本初心者でもわかりやすい?
0620名無しさん@お腹いっぱい。
2007/12/19(水) 10:07:59perl -aF, -nle '$X{$F[0]} or print; $X{$F[0]} = 1'
0621名無しさん@お腹いっぱい。
2007/12/19(水) 12:19:590622名無しさん@お腹いっぱい。
2007/12/19(水) 12:39:17タブ(\t)は置換できるのですが改行(\n)が置換できません。
例えば # cat a.txt
aaa
bbb
aaa(タブ)bbb
3行目の(タブ)区切りは置換できるけど1行目と2行目にマッチした文字を置換できません。
sedじゃ無理?こういうのawkでできたりしますか?
0623名無しさん@お腹いっぱい。
2007/12/19(水) 12:47:27sedについてはこちらへ
↓
sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
0624名無しさん@お腹いっぱい。
2007/12/19(水) 12:56:240625名無しさん@お腹いっぱい。
2007/12/19(水) 13:09:34ファイル名を前にもってきたいなら、せめて、
< /tmp/a.txt awk ...
と書け。
0626名無しさん@お腹いっぱい。
2007/12/19(水) 13:21:070627名無しさん@お腹いっぱい。
2007/12/19(水) 15:50:37そうか?
0628名無しさん@お腹いっぱい。
2007/12/19(水) 21:32:17a.txtの内容
----------
aaa
bbb
ccc
bbb
----------
このa.txtを
----------
aaa
bbb
ccc
ddd
----------
↑のようにa.txtを置換して保存したい。
この文字は何行目にあるか不明だとして
一番下のbbbをdddに置換することはできますか?sedでもawkでもいいのです。
2chなのになぜかたらい回しにされてるのですがよろしくお願いします。
0629名無しさん@お腹いっぱい。
2007/12/19(水) 22:00:52ed a.txt << EOS > /dev/null
\$a
.
?bbb?c
ddd
.
\$d
wq
EOS
いったん末尾に1行挿入するのがコツ
0630628
2007/12/19(水) 22:06:310631名無しさん@お腹いっぱい。
2007/12/19(水) 22:33:42かなり、とっつきは悪い。
特にsed編は、使用目的がtroffマクロの置換とか、プリンタ整形言語の整形とか、訳分からん。
awk編はまあ、用例も身近なのが結構有るけど・・・
でも、内容は極めて濃い。
金を出して購入し、何度も読み返す価値は有ると思う。
0632名無しさん@お腹いっぱい。
2007/12/19(水) 22:37:34いっている意味が良く分からんが、
エスパーすると、それはawkよりsedの方が得意だと思う。
0633名無しさん@お腹いっぱい。
2007/12/19(水) 22:44:440636名無しさん@お腹いっぱい。
2007/12/19(水) 22:59:58おいおい、>>633 じゃ大間違いだと思うがww
0637名無しさん@お腹いっぱい。
2007/12/19(水) 23:05:57そうじゃなくて、>>628 のやりたいのは、
「ccc<改行>bbb」を「ccc<改行>ddd」に置換したいということだろ?
複数行に渡る置換をしたいということ。
sedスレの方に、すでに解答が出てるよ。1行コマンドで行ける。
0638名無しさん@お腹いっぱい。
2007/12/19(水) 23:09:21aaa
bbb
ccc
bbb
aaa
bbb
ccc
ccc
bbb
aaa
bbb
ccc
bbb
% cat /tmp/a.txt | perl -e '($_ = join("", <>)) =~ s/(aaa\nbbb\nccc\n)bbb/$1ddd/g; print '
aaa
bbb
ccc
ddd
aaa
bbb
ccc
ccc
bbb
aaa
bbb
ccc
ddd
0640名無しさん@お腹いっぱい。
2007/12/19(水) 23:31:14お前さんは自分が直面している問題を自分で把握してないのか?wwww
sedではないが別解がひとつ上にある。"aaa改行bbb改行ccc改行bbb"を
全て"〜ddd"に痴漢する
0641名無しさん@お腹いっぱい。
2007/12/21(金) 02:21:54ふつーに見かけるぞ? >awk256倍
しかしこの本が初心者向けかどうかはちと首をひねるがな。
0642名無しさん@お腹いっぱい。
2007/12/21(金) 14:28:09ファイルにひとつフィールド列(固定文字)を足したいんですが、
while read do でループより簡潔に書きたいんです。
paste file1 file2 のfile1には固有文字を入れている感じです
お願いします
0643名無しさん@お腹いっぱい。
2007/12/21(金) 14:37:23awkっての使えばいいことに気がつきましたすみません
0644名無しさん@お腹いっぱい。
2007/12/22(土) 00:04:45「気がつく」のだから、相当な洞察力だな。
0645名無しさん@お腹いっぱい。
2007/12/22(土) 00:20:23学校の宿題とか新人研修の課題を聞きに来る子供ばっかり?
0646名無しさん@お腹いっぱい。
2007/12/22(土) 01:56:01つ 鏡
0647shell
2007/12/22(土) 12:45:37変数 TODAY=20071212(任意指定)として1970-01-01 00:00:00基準からの
経過時刻を秒数で表示したいのですが、方法はありませんか?
0648名無しさん@お腹いっぱい。
2007/12/22(土) 12:46:410649shell
2007/12/22(土) 12:48:50text.txtに
11 11 11 111 222 333 E
33 44 666 6666 E
と2行記入しているのですが、これを1行ずつ変数に代入できるスクリプトはありますか?
行の空白は半角スペースで最後にEは表示されています。行中の文字は任意の文字列です。
0650shell
2007/12/22(土) 12:49:54自分で指定した日付で求めたいです。
0651名無しさん@お腹いっぱい。
2007/12/22(土) 12:59:520652名無しさん@お腹いっぱい。
2007/12/22(土) 13:08:24「dateは本日の日付を求める…」違います。
せっかく >>648 で正解を教えてもらっているのに、礼も言わずに
そういうことを言う人には質問する権利はありません。
はい、次の方どうぞ
↓
0653名無しさん@お腹いっぱい。
2007/12/22(土) 13:10:36> echo "[$str]"
> done
[11 11 11 111 222 333 E]
[33 44 666 6666 E]
$
0654名無しさん@お腹いっぱい。
2007/12/22(土) 13:12:04つ read hoge; read fuga
0655shell
2007/12/22(土) 22:55:46試してみます。
ありがとうございます。
「dateは本日の日付を求める…」違うですか...
調べます。
0656名無しさん@お腹いっぱい。
2007/12/22(土) 23:09:02何でもウィンドウの隠喩w
0657名無しさん@お腹いっぱい。
2007/12/22(土) 23:15:08DOS時代(ニフ)の頃からある表現なので、
ファイルオープンからきた「開く」だと思ってたけど?違うの?
■ このスレッドは過去ログ倉庫に格納されています