シェルスクリプト総合 その22
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。
2013/11/01(金) 07:58:50.52□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
0821名無しさん@お腹いっぱい。
2014/06/10(火) 12:15:49.480822810
2014/06/10(火) 12:29:01.86自分の発想が貧困だったことを思い知らされる
ありがとう
0823名無しさん@お腹いっぱい。
2014/06/10(火) 14:09:06.280824名無しさん@お腹いっぱい。
2014/06/10(火) 14:28:20.320825名無しさん@お腹いっぱい。
2014/06/10(火) 14:32:11.80while IFS='()' read a b; do
if [ "$b" ]; then
echo "$a(`expr $b / 5`)"
else
echo "$a"
fi
done
0826名無しさん@お腹いっぱい。
2014/06/10(火) 14:53:54.80AA(55) や AA(20) の行末に何か文字が入ってしまうとエラーになる
>>819 なら "AA(20) BB(100) CC(65)" とかになっていてもOK
0827名無しさん@お腹いっぱい。
2014/06/10(火) 14:56:24.36そんなことわかった上で、要求仕様だけ満たす最小限で書いているのだよ。
0828名無しさん@お腹いっぱい。
2014/06/10(火) 14:58:01.830829名無しさん@お腹いっぱい。
2014/06/10(火) 15:05:19.71>>819 は入力に " が1個とか(奇数個)含まれてるとエラーになるぞ。
>>825 ならOK
0830名無しさん@お腹いっぱい。
2014/06/10(火) 15:08:54.44sed -e 's/\(["$`]\)/\\\\\1/g' -e 's!\(([0-9][0-9]*)\)!(\$((\1/5)))!g' -e 's/^/"/'
-e 's/$/"/'|while read l; do eval echo "$l";done
0831名無しさん@お腹いっぱい。
2014/06/10(火) 15:12:08.71>>819 はそのまま出力される…仕様外だからしょうがないのかもしれない
0832名無しさん@お腹いっぱい。
2014/06/10(火) 15:13:25.19お見事
0833名無しさん@お腹いっぱい。
2014/06/10(火) 15:13:41.98入力行中に半角¥があると消えちゃうねw
0834名無しさん@お腹いっぱい。
2014/06/10(火) 15:15:51.89while read line; do
case "$line" in
AA\(*\)) echo AA\(`expr "$line" : 'AA(\(.*\))' / 5`\) ;;
*) echo "$line" ;;
esac
done
0835名無しさん@お腹いっぱい。
2014/06/10(火) 15:18:07.96AA() の AAは固定という解釈か? BB() とかないの?
0836名無しさん@お腹いっぱい。
2014/06/10(火) 15:20:27.44対応は簡単だけど、要求使用外だから別料金
0837名無しさん@お腹いっぱい。
2014/06/10(火) 15:25:43.37IFS=
sed -e 's/\\/!!!rougue_monster!!!/g' -e 's/\(["$`]\)/\\\\\1/g' -e 's!\(([0-9][0-9]*)\)!(\$((\1/5)))!g' -e 's/^/"/' -e 's/$/"/' |while read l; do eval echo "$l";done | sed -e 's/!!!rougue_monster!!!/\\/g'
0838名無しさん@お腹いっぱい。
2014/06/10(火) 15:28:31.93>>825 でも "\AA(55)" とかのバックスラッシュは消えちゃうんじゃない
まぁ、バックスラッシュを保存したかったら入力側で "\\\AA(55)" とかして
おけば良いような
0839名無しさん@お腹いっぱい。
2014/06/10(火) 15:33:12.06>>825 は read を read -r にすればバックスラッシュ保存されるよ。
0840名無しさん@お腹いっぱい。
2014/06/10(火) 15:36:44.330841白バラ十字軍
2014/06/10(火) 15:41:26.82ネットではささやかれる時代になりました。刑務所受刑者の33%は創価員という事実は有名な話ですが、以下を見れば納得ができます
創価員が裁かれる 判決の際 法廷にこだまする「 池 田 先 生 万 歳 !」
◎以下これ以外にまだまだ創価員の犯罪多数あり、書類送検されていないだけであなたの街でも多数すさまじい事件の数が
発生しましたし、まだまだ毎日のように創価員による凶悪事件は発生しているのです!
しかもこれ以外にもTVでも報道された凶悪事件多数あり!。あなたの周りにも潜んでいる。
危険です。危機的状況です。酒鬼薔薇だけではありません。実にたくさんいるのです
あなたの街でも善良な人間のように取り繕い潜んでいるのです。
●宅間守(在日)→大阪 附属池田小学校児童殺傷 創価学会員。大量殺人犯 。8人殺害 15人が重軽傷。悪徳 朝鮮人部落出身。
(悪徳カルト)両親も創価学会員。獄中結婚したが相手の女も創価員。さすが創価員は悪徳な者を好む。あえて結婚する
とは殺人破壊者を賛美、美化、擁護する行為 2004年死刑執行 獄中結婚した女は慰謝料損害賠償払ったのか?被害者に詫びたのか?
宅間は被害者に詫びていない。つまり・・・判決の際 法廷にこだまする「 池 田 先 生 万 歳 !」ということ
日本の犯罪史上、稀に見る大事件
●畠山鈴香 (在日)→秋田県児童連続殺害事件 創価学会員。悪徳。(悪徳カルト)
●斉藤勇太 →JR取手駅前バス無差別殺傷事件 創価学会員。悪徳。(悪徳カルト)
●酒鬼薔薇聖斗→ 東慎一郎(在日)神戸の首切り魔で酒鬼薔薇聖斗 創価学会員。神戸の首切り魔。生首を校門に飾る。悪徳2人殺害。
元在日朝鮮人。両親も創価学会員(悪徳カルト)
●福田孝行(在日)→山口県母子殺害 殺害後屍姦、乳児も殺害 創価学会員。悪徳(悪徳カルト)
●阿部隆 →長野母子バラバラ殺人事件(平成元年)船橋市幼児バラバラ殺人事件 千葉県船橋市の熱心な創価学会員・A・A子さんと長男
のHちゃんが、同じく学会員である夫のA・Tに殺された。動機は生活苦。バラバラにされた死体が聖教新聞に包まれ、長野県の山中に捨
てられていた 悪徳(悪徳カルト)
0842名無しさん@お腹いっぱい。
2014/06/10(火) 17:33:57.23分かるけどさ
0843名無しさん@お腹いっぱい。
2014/06/10(火) 18:07:53.198月に出版されるそうな
http://www.oreilly.com/pub/e/3115
https://twitter.com/jeroenhjanssens/status/474948853284999168/photo/1
0844名無しさん@お腹いっぱい。
2014/06/10(火) 18:10:14.13あくまでコマンドラインで操作するってだけで
シェルスクリプト関係なさそう
つーかこういうツールって大抵CLIだからわざわざタイトルに書かなくてもいいような
0845名無しさん@お腹いっぱい。
2014/06/10(火) 20:07:24.970846名無しさん@お腹いっぱい。
2014/06/10(火) 23:27:05.36しかも Perl のワンライナーの方が速いっていう
0847名無しさん@お腹いっぱい。
2014/06/10(火) 23:31:05.390848名無しさん@お腹いっぱい。
2014/06/11(水) 00:19:36.580849名無しさん@お腹いっぱい。
2014/06/11(水) 01:24:39.28っていうのはスレ違いかな
0850名無しさん@お腹いっぱい。
2014/06/11(水) 01:57:36.02関係なさそうどころか、普通にIPythonとR使いますって書いてある
0851名無しさん@お腹いっぱい。
2014/06/11(水) 02:18:03.960852名無しさん@お腹いっぱい。
2014/06/13(金) 01:19:21.92>__BEGIN__
>NAME:xxx
>...
>STYLE:yyy
>...
>__END__
>__BEGIN__
>NAME:aaa
>...
>STYLE:bbb
>...
>STYLE:ccc
>...
>__END__
>__BEGIN__
>..
BEGIN-END間を1ブロックとして、1ブロック内にNAMEが1つ、STYLEが1つ以上。
1ブロックの情報を「NAME:STYLE,STYLE,,,,」というように1行にまとめて整形するようなスクリプトを考える。
全行数が数百万行、ブロック数は数千ほどあるとして、現実的実行時間で収まる事。
__BEGIN__は最初の1つ以外はすべて__END__の直後にあるとし、NAMEは__BEGIN__の直後に出現、STYLEの位置はブロック毎に異なるとする。
暇潰しにどうぞ
0853名無しさん@お腹いっぱい。
2014/06/13(金) 02:05:55.88sedでいらない行消してNで適当にくっつけて改行を,に変えてちょっと整形すればいいんじゃね?
0854名無しさん@お腹いっぱい。
2014/06/13(金) 08:51:41.06$1=="NAME"{n=$2}
$1=="STYLE"{s=s$2","}
$0=="__END__"{sub(/,$/,s);print n":"s;s=""}
0855名無しさん@お腹いっぱい。
2014/06/13(金) 11:30:59.140856名無しさん@お腹いっぱい。
2014/06/13(金) 14:16:24.79egrep '^(NAME:.*|STYLE:.*|__END__)$' | sed -E -e :begin -e N -e 's/\n__END__$/&/' -e tend -e bbegin -e :end -e 's/^NAME://' -e 's/\nSTYLE:/:/' -e 's/\nSTYLE:/,/g' -e 's/\n__END__$//'
0857名無しさん@お腹いっぱい。
2014/06/13(金) 15:32:01.10sed -e 's/^__BEGIN__$//' -e :B -e N -e 's/\nNAME://' -e 's/\nSTYLE:/,/' -e tB -e 's/\n__END__$//' -e tE -e 's/\n.*//' -e bB -e :E -e 's/,/:/'
0858名無しさん@お腹いっぱい。
2014/06/13(金) 17:39:23.28857だとうまくいきそうだな
実行時間どんなもんやろか
0859名無しさん@お腹いっぱい。
2014/06/15(日) 02:37:40.63必要最低限のことしかしてない感じと可読性の高さが気に入った
何より仕様変更に強そう
0860名無しさん@お腹いっぱい。
2014/06/15(日) 03:32:55.22ただし bash 限定で
0861名無しさん@お腹いっぱい。
2014/06/15(日) 04:10:21.090862名無しさん@お腹いっぱい。
2014/06/15(日) 04:23:17.300863名無しさん@お腹いっぱい。
2014/06/15(日) 09:26:22.48Apparix とか
http://micans.org/apparix/
0864名無しさん@お腹いっぱい。
2014/06/15(日) 18:39:14.24fiはfinish ifか何かの遊び心としてもこれはちょっと……
0865名無しさん@お腹いっぱい。
2014/06/15(日) 18:42:20.05for … rof
while … elihw
とかも出てくるから慣れようねw
0866名無しさん@お腹いっぱい。
2014/06/15(日) 18:50:25.870867名無しさん@お腹いっぱい。
2014/06/15(日) 20:45:19.150868名無しさん@お腹いっぱい。
2014/06/15(日) 21:41:52.54do .. done がごっちゃになってるのは美しくない!
みたいなこと言ってる人見たことあるけど割とどーでもいいな
0869名無しさん@お腹いっぱい。
2014/06/15(日) 22:25:33.360870名無しさん@お腹いっぱい。
2014/06/15(日) 23:52:31.710871名無しさん@お腹いっぱい。
2014/06/16(月) 01:57:14.370872名無しさん@お腹いっぱい。
2014/06/16(月) 12:54:05.030873名無しさん@お腹いっぱい。
2014/06/17(火) 12:58:22.00最後のsub(/,$/,s);ってsub(/,$/,,s);の書き間違いかなと思うんだが
0874名無しさん@お腹いっぱい。
2014/06/18(水) 22:51:23.12勘違いだったらハズカシィ
0875名無しさん@お腹いっぱい。
2014/06/19(木) 15:04:38.00esacとたいして変わらん
0876名無しさん@お腹いっぱい。
2014/06/19(木) 15:38:27.70とはいえサブシェルを{}で開くと違和感バリバリだが
0877名無しさん@お腹いっぱい。
2014/06/19(木) 15:41:14.67サブシェルは () だぞ。{ ;} は同じシェルの単なるグルーピング。
キモいと言ってるのはcase(switch)文をbreakする仕組み自体のことじゃなく、
そのbreakを ;; という記号で表すことについて言ってるんだけど。
0878名無しさん@お腹いっぱい。
2014/06/19(木) 15:43:46.400880名無しさん@お腹いっぱい。
2014/06/19(木) 16:26:09.260881名無しさん@お腹いっぱい。
2014/06/19(木) 16:29:05.110882名無しさん@お腹いっぱい。
2014/06/19(木) 16:37:30.82case $var in (hoge) echo hoge;; esac
とか書けるんだ。
0883名無しさん@お腹いっぱい。
2014/06/24(火) 02:53:56.45--
あるファイルに、
1
2
3..
という具合に、改行区切りで昇順に数字が書き込まれているとする
しかし、ファイル末尾の数値と行数が合わない為、どこかで数値が欠けている、もしくは重複していると予想される
ファイル内部は昇順ソート済みとして、重複・欠損している数値を洗い出す効率の良い仕組みを考える
shでもperlでもなんでもどうぞ
0884名無しさん@お腹いっぱい。
2014/06/24(火) 06:25:38.910885名無しさん@お腹いっぱい。
2014/06/24(火) 06:58:51.210886名無しさん@お腹いっぱい。
2014/06/24(火) 07:07:29.800887名無しさん@お腹いっぱい。
2014/06/24(火) 07:24:52.170888名無しさん@お腹いっぱい。
2014/06/24(火) 08:29:05.510889名無しさん@お腹いっぱい。
2014/06/24(火) 09:28:26.18rcファイルでd=/path/nameとしておいて ls $d とか。
ホーム直下に一文字シンボリックリンク作るより文字数は少なくて済む。
0890名無しさん@お腹いっぱい。
2014/06/24(火) 13:20:13.16diff -y --supress-common-lines <(seq 1 `tail -n1 num`) num
0891名無しさん@お腹いっぱい。
2014/06/24(火) 13:39:07.32えらい邪魔なような
0892名無しさん@お腹いっぱい。
2014/06/24(火) 15:02:19.920893名無しさん@お腹いっぱい。
2014/06/24(火) 15:04:16.550894名無しさん@お腹いっぱい。
2014/06/24(火) 15:28:53.020895名無しさん@お腹いっぱい。
2014/06/24(火) 15:41:08.12・ファイルに書き込まれたものをチェックする前提がある=標準入力使う必要がない
・重複、又は欠損がある=複数、両方ある場合に全て検出するのが理想
というのを考えると、diffが一番いい答えを返してくれそうな気がする
>>884は確かにシンプルなんだが、ファイルの比較的先頭のほうが狂ってた場合、それ以降を全部出力しちゃうっていう点で微妙な気もする
0896名無しさん@お腹いっぱい。
2014/06/24(火) 17:00:58.98headすればいいじゃん。
そんなに頻繁に使うものとは思ってないので、書きやすい方がいいと思いました。
0897名無しさん@お腹いっぱい。
2014/06/24(火) 17:31:03.08もしファイルの最終行が間違っていて 最終行の内容が 1 とかだったら、
どの行が違っているのか全然チェックできない。
0898名無しさん@お腹いっぱい。
2014/06/24(火) 17:46:42.34コンピュータのCPUが何ビットであるか調ベておく事が大切です。
32ビットCPUを登載したコンピュータには、
32ビット用のシェルを書くこと。
64ビットCPUを登載したコンピュータには、
64ビット用のシェルを書くこと。
これを間違えればシェルが動きません
0899名無しさん@お腹いっぱい。
2014/06/24(火) 18:07:22.220900名無しさん@お腹いっぱい。
2014/06/24(火) 18:10:05.250901名無しさん@お腹いっぱい。
2014/06/24(火) 18:16:36.30相手しちゃいかん。
0902名無しさん@お腹いっぱい。
2014/06/24(火) 18:36:12.99プロセス置換使って互換性無いのに backquote 使ってるのも気になるが、
diff がいいんじゃないの。
重複、欠損が1つとは限らないし、ワンライナーでなくスクリプトの話でしょ?
あと、yes '' | cat -n とかおもしろい。
改行区切りで昇順なのに、 >>897 の "最終行の内容が 1" って突っ込んだら負けなのか?
0903名無しさん@お腹いっぱい。
2014/06/24(火) 20:06:24.04$ cat a.txt | tee >(uniq -d) >(uniq | awk 'NR!=$1{for(i=NR;i<$1;i++){print i};NR=$1++}') &>/dev/null
moreutils の pee を使う場合
$ cat a.txt | pee "uniq -d" 'uniq | awk '\''NR!=$1{for(i=NR;i<$1;i++){print i};NR=$1++}'\'''
0904名無しさん@お腹いっぱい。
2014/06/24(火) 20:38:13.530905名無しさん@お腹いっぱい。
2014/06/24(火) 20:42:14.23とかでよくね
0906名無しさん@お腹いっぱい。
2014/06/24(火) 20:48:11.550907名無しさん@お腹いっぱい。
2014/06/24(火) 23:31:47.05>>902の「互換性ないのに`使ってる」っていう点なんだが、
プロセス置換の記述の中で``って使えない環境もあるのか?
プロセス置換自体よくわかってないとこあるからちょっとあれだが
プロセス置換と``が同時に使えない場合でも>>905みたいなのはさすがにな……
0908名無しさん@お腹いっぱい。
2014/06/24(火) 23:33:33.50これmanページから引っ張ってきたんだけどマニュアルの誤植なのか……
http://linuxjm.sourceforge.jp/html/gnumaniak/man1/diff.1.html
0909名無しさん@お腹いっぱい。
2014/06/25(水) 00:44:07.04awk '{if($0-p!=1)print NR,p,$0;p=$0}'
0910名無しさん@お腹いっぱい。
2014/06/25(水) 01:16:53.80これいいな。>>884の欠点を補った感じで
ifの構文がちょっとよくわからんのだけど
0911名無しさん@お腹いっぱい。
2014/06/25(水) 01:32:44.630912名無しさん@お腹いっぱい。
2014/06/25(水) 01:47:50.54次やる時にはそうする
0913名無しさん@お腹いっぱい。
2014/06/25(水) 03:19:08.72出遅れどころじゃないけど、NULつけてLFと交換するとか:
sed -n -e 's/^NAME:\(.*\)$/\x00\1:/p' -e 's/^STYLE:\(.*\)$/\1,/p' | tr '\000\n' '\n\000'
0914名無しさん@お腹いっぱい。
2014/06/25(水) 03:31:58.380915名無しさん@お腹いっぱい。
2014/06/25(水) 08:35:03.52http://sourceforge.jp/projects/freshmeat_moreutils/releases/
> 0.7
> 2006-03-20 07:39
> おしっこ(パイプティー)ユーティリティが追加されました。
0916名無しさん@お腹いっぱい。
2014/06/25(水) 09:48:52.03人の多いところに痴漢常習者が集まっただけ。
ジャニのコンサート会場の最寄駅なんかも沢山いる。
0917名無しさん@お腹いっぱい。
2014/06/25(水) 09:53:42.42まぁ機械翻訳だからな。
0918名無しさん@お腹いっぱい。
2014/06/25(水) 13:05:29.67もっと言葉を選べば良かった。互換性でなく portability とかの方が適切だったかも。
>>890 では、zsh bash ksh の機能であるプロセス置換を使っているので、
portability は既に失われている。
この為、back quote はあえて使う必要が無い。
スペルミス同様大した事じゃあ無いが、何で back quote 使ってるの?と気になった。
以下、念の為の補足。
参考他で議論されている通り、一般的に back quote は、
公式には非推奨ではないものの、使わない様にしたい古いやり方。
`...` は、POSIX 非互換のとても古い Bourne shell でのみ必要なレガシーな構文。
ただし、このスレは Bourne Shell(/bin/sh) がデフォルトで、heirloom sh がどうのと
>>1 に書いてあるので、portability を考え back quote を使うか、特記して
dollar parens を使用する事が望ましい。
個人的には POSIX デフォにしたいですが。
参考
Have backticks (i.e. `cmd`) in *sh shells been deprecated?
http://unix.stackexchange.com/questions/126927/
0919名無しさん@お腹いっぱい。
2014/06/25(水) 13:21:13.94890のbacktickは必要じゃないの?
というかコマンドの出力を文字列で参照するとき、backtickで括るのは珍しくないでしょbashでも
レス数が900を超えています。1000を超えると表示できなくなるよ。