シェルスクリプト総合 その24©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/11/11(火) 00:54:03.43□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0334名無しさん@お腹いっぱい。
2015/02/10(火) 11:41:25.850335名無しさん@お腹いっぱい。
2015/02/10(火) 11:43:10.440336名無しさん@お腹いっぱい。
2015/02/10(火) 12:28:31.34URL次第
0337名無しさん@お腹いっぱい。
2015/02/10(火) 12:55:57.86ベテランなら、サーバ自体死んでるか、sshdが動いてない(かfirewall等)
の切り分けを考慮してるんだろう。実際に使うスクリプトとしては正しい
0338名無しさん@お腹いっぱい。
2015/02/10(火) 13:20:41.45差分は専ブラで取得です^^;
0339名無しさん@お腹いっぱい。
2015/02/10(火) 13:36:06.53差分なんて git 以外にも diff や vimdiff 等あるからやってみたら?
0340名無しさん@お腹いっぱい。
2015/02/10(火) 14:15:44.400341名無しさん@お腹いっぱい。
2015/02/10(火) 19:43:43.25alias も出たから、ついでに...
自分は ${HOME}/bin に、スクリプトとして書いているが、場所はどこでもいいから
どこかにまとめて保存しておけばいいのでは?例えば、~/bin/oneliner/ 等
それらのファイルは、grep で検索も出来るし、それで見つかった script を編集するなら
history -r script で履歴に読み込んで、コマンドライン上で編集が出来る
(あと、あんまり使わないけど) bash zsh で、Ctrl-x Ctrl-e で editor を呼び出して
読み込んで実行とか
0342名無しさん@お腹いっぱい。
2015/02/10(火) 22:45:11.06> (あと、あんまり使わないけど) bash zsh で、Ctrl-x Ctrl-e で editor を呼び出して
> 読み込んで実行とか
Ctrl+rでヒストリ検索でいいんじゃない?
0343名無しさん@お腹いっぱい。
2015/02/10(火) 23:29:41.64>>342
スクリプトファイルから履歴に読み込むと、行毎に履歴の最後に追加されるから
previous-history Ctrl-p (もしくは↑)で十分だけどね
0344名無しさん@お腹いっぱい。
2015/02/14(土) 04:53:42.98!n:gs/string1/string2/
!-n
等 bash で履歴を利用するものは shopt -s histverify すれば確認・編集が出来て便利だよね
0345名無しさん@お腹いっぱい。
2015/02/16(月) 18:20:07.18どうなっちゃうの、2ちゃん?
なんか、ツイッターとかFBみたくなるのか?
極端に利用者減ると思うけどな。
1 :ニライカナイφ ★ 転載ダメ©2ch.net:2015/02/16(月) 16:24:24.83 ID:???*
◆2ちゃんねるがdatを近日廃止、さらにウェブスクレイピングを用いた専用ブラウザ開発・
公開は禁止して2015年3月3日以降はAPI経由の許諾制に
「2015/3/3以降、2ch.net専用ブラウザ(以下「専用ブラウザ」)を開発、
公開するには、2ch.netの所有者であるRaceQueen社の許諾を得て、
2ch.netが提供するAPI(以下「API」)を用いて開発する必要があります」
http://daily.2ch.net/test/read.cgi/newsplus/1424071464/
0346名無しさん@お腹いっぱい。
2015/02/16(月) 18:27:38.42テキスト広告除去
w3m some_2ch_URL |sed '1,/^$/d'|sed -e '/^━━━*$/,$d'|sed '$d'
例えば
w3m http://peace.2ch.net/test/read.cgi/unix/1415634843/ |sed '1,/^$/d'|sed -e '/^━━━*$/,$d'|sed '$d'
0347名無しさん@お腹いっぱい。
2015/02/16(月) 18:50:00.380348名無しさん@お腹いっぱい。
2015/02/16(月) 19:15:37.650349名無しさん@お腹いっぱい。
2015/02/21(土) 14:32:41.68http://hayabusa6.2ch.net/test/read.cgi/network/1387872458/
0350名無しさん@お腹いっぱい。
2015/02/24(火) 13:40:24.51あるテキストの中に含まれる、特定のキャラクタの数を数え
たいのですが、すごく簡単にできそうで、わからなくて
悩んでおります。grepでもwcでもできそうで、できません。
ご教授お願いします。
0351名無しさん@お腹いっぱい。
2015/02/24(火) 14:17:32.87全キャラクタの後ろに改行を入れて、grep 'キャラクタ' | wc -lで数えられる
改行を入れるのはOSによって面倒だったりするが。。。
0352名無しさん@お腹いっぱい。
2015/02/24(火) 14:32:17.30キャラクタ A を数える場合、
tr -dc A | wc -c
>>351
すみませんが詳しい方のみ回答をお願いします
0353名無しさん@お腹いっぱい。
2015/02/24(火) 14:40:49.91全キャラの後ろ(要するに1文字ごと)に改行は必要なくて
数えたいワード単位に改行入れて(sed)、grep、wcだね
sedあまり好きじゃないからperlならこう
perl -pe ’s/foo/foo¥n/g’ file | grep foo | wc -l
スクリプトにしてfooを引数にすりゃ汎用的に使える
0354名無しさん@お腹いっぱい。
2015/02/24(火) 17:15:08.030355名無しさん@お腹いっぱい。
2015/02/24(火) 17:53:14.61grep -o foo | wc -l
351とか353とか無駄すぎ。
353は1行に1回しかマッチしないことが保証できるので grep | wc ではなく、grep -c でよい。
0356名無しさん@お腹いっぱい。
2015/02/24(火) 19:23:17.83意気込んで帰宅してスレ開いたら>>355に書かれていたでござる
0357名無しさん@お腹いっぱい。
2015/02/24(火) 19:55:49.20"A" が抜けてるんじゃ?
$ grep -o A foo | wc -l
0358名無しさん@お腹いっぱい。
2015/02/24(火) 20:01:41.720359名無しさん@お腹いっぱい。
2015/02/24(火) 20:07:04.100360名無しさん@お腹いっぱい。
2015/02/24(火) 21:34:48.78ネタ的な解答です
echo $(( $( sed -e 's/[^で]//g; s/で/ + 1/g' data ) ))
0361名無しさん@お腹いっぱい。
2015/02/24(火) 22:11:45.11>>353ではfooが検索キーワードになっていることを受けてなんじゃね
ファイル名なりパイプ入力は実際に実行するには必要だが
言いたいことに焦点を当てるためと解釈すればおk
0362名無しさん@お腹いっぱい。
2015/02/24(火) 22:42:20.20身に染みてきた。VBSを仕事でやってるが、何せ長い。シェルスクリプトだと数十行で済むようなことが
何千行とかになってしまう。
Unixのコマンド自体がワンライナーで済んでしまうことも多いが、
シェルスクリプトや正規表現、Unixのアプリを組み合わせて20行、30行もかけば
かなりの処理ができるな。
ただし、VBSのすごいところは、GUIまでわりと自由に操作できることだな。
UnixもWindowsもそれなりに何かすばらしさを感じる。
0363名無しさん@お腹いっぱい。
2015/02/24(火) 22:43:45.95マッチ部分が重複するケースもあると思うけど
そういう時はどう書けばいいんだろ
$ echo ABC | grep -Po '..'
AB
$ echo ABC | grep -Po '.(?=.)'
A
B
$ echo ABC | ?
AB
BC
が欲しい
0364名無しさん@お腹いっぱい。
2015/02/24(火) 22:45:35.140365名無しさん@お腹いっぱい。
2015/02/24(火) 23:11:13.94>>348とかどうよ?
0366名無しさん@お腹いっぱい。
2015/02/25(水) 10:15:56.15お前は4時間以上かけてそんな回答しかできないのか
0367名無しさん@お腹いっぱい。
2015/02/25(水) 10:36:23.410368名無しさん@お腹いっぱい。
2015/02/25(水) 21:30:04.01ところで、あるテキストや特定のキャラクタは utf-8 であると考える必要性は有りや無しや。
神に問う。信頼は罪なりや。 果たして、無垢の信頼心は、罪の源泉なりや。'
echo "$str" | grep -o . | LC_COLLATE=C sort | uniq -c
echo "$str" | perl -0777 -ne 'print s/。//g,"\n"'
0369名無しさん@お腹いっぱい。
2015/02/25(水) 22:36:30.27楽しそうだね。でも、GUIの操作をすべてコマンドからやりたいよ。
オブジェクトでも作る?
0370名無しさん@お腹いっぱい。
2015/02/25(水) 22:47:56.060371名無しさん@お腹いっぱい。
2015/03/02(月) 23:05:19.70ネタは不評だったけど、最後かもしれないし >>363 にも答えておこう。
perl と ruby で
#!/bin/sh
echo '商工会議所長' |
perl -ne 'while( /(?=(会議所|所長))/g ){ print $1, "\n"; }'
echo '商工会議所長' |
ruby -Ku -ne 'puts $_.scan( /(?=(会議所|所長))/ ).join( "\n" )'
0372名無しさん@お腹いっぱい。
2015/03/02(月) 23:11:47.850373名無しさん@お腹いっぱい。
2015/03/03(火) 03:08:17.32何がなんだか…w
0374名無しさん@お腹いっぱい。
2015/03/03(火) 08:07:50.39「aaaaaaaaaa」に対して「aa」が
どうマッチするかってことなんだけど
なんで会議所と所長になっちゃうんだろうかw
脳味噌足りてなさそう
0375名無しさん@お腹いっぱい。
2015/03/03(火) 17:30:06.70AB
BC
じゃまずいのかな。
0376371
2015/03/04(水) 06:55:50.72>>374 に対しての発言の様にも取れるけど、>>371 に対しての発言ならば...
それも試した上で、書いてる
無反応だったけど >>368 で utf-8 である事を考えていないものが有る事を指摘したので
引き続き、>>363 のお題
> 単語単位だとマッチ部分が重複するケース
に沿って、日本語に入れ替えただけ
0377名無しさん@お腹いっぱい。
2015/03/04(水) 13:23:38.19所長と会議所限定じゃなく
0379名無しさん@お腹いっぱい。
2015/03/04(水) 22:57:35.29みんなどんな時も/bin/sh縛りなの(´・ω・`)?
それとも割と躊躇なく、bashとかzsh使うの(´・ω・`)?
使う人はどういう線引きで/bin/shと高機能シェルを使い分けてるの(´・ω・`)?
0380名無しさん@お腹いっぱい。
2015/03/04(水) 23:04:13.670381371
2015/03/06(金) 06:31:41.84wikipedia で LL言語を見ると、awk も AUTO だけど、sed は入っていなかったので
sed を使って無理やり書いてみよう
.*? が使えないので .. みたいな正規表現への対応は思いつけなかったけど、単語を抜き出すだけならこれで
#!/bin/sh
re1=${1:-会議所\|所長}
str=$re1
while
re2=$re2$( echo "$str" | sed -e 's/^\(.\).*/\1/' )
length=${#str}
str=${str#*|}
[ "${#str}" -ne "$length" ]
do
:
done
# ここから
sed -ne '
: loop
/'"$re1"'/ {
s/^[^'"$re2"']*\('"$re1"'\)/\1\n/
P
s/^.\(.*\)\n/\1/
b loop
}
'
0382名無しさん@お腹いっぱい。
2015/03/06(金) 06:33:59.92#!/bin/bash
re1=${1:-会議所\|所長}
str=$re1
while
re2=$re2${str:0:1}
length=${#str}
str=${str#*|}
[ "${#str}" -ne "$length" ]
do
:
done
while
IFS= read -r line
do
while
[[ "$line" =~ ^[^${re2}]*((${re1}).*) ]]
do
echo "${BASH_REMATCH[2]}"
line=${BASH_REMATCH[1]}
line=${line#?}
done
done
0383名無しさん@お腹いっぱい。
2015/03/06(金) 06:36:18.16$ echo 'abc' | ./testsed 'ab\|bc'
ab
bc
$ echo 'abc' | ./testbash 'a.|b.'
ab
bc
0384371
2015/03/06(金) 07:34:31.86全般的に変数代入の箇所のクォート
var="var"
と
#!/bin/bash
re1="${1:-会議所|所長} "
0385名無しさん@お腹いっぱい。
2015/03/06(金) 08:05:27.130386名無しさん@お腹いっぱい。
2015/03/06(金) 09:15:28.000387名無しさん@お腹いっぱい。
2015/03/08(日) 00:18:10.47個人用とか、そのマシンに特化したスクリプトならbashだろうがzshだろうが何でもアリだけど
普段から/bin/sh縛りにしておくと、違うマシンでもスクリプトが書けるようになるぞ
0388名無しさん@お腹いっぱい。
2015/03/08(日) 03:45:15.37でも実際は変な癖がそれぞれついてるんで、あまり役に立たない。
0389名無しさん@お腹いっぱい。
2015/03/08(日) 05:35:53.000390名無しさん@お腹いっぱい。
2015/03/08(日) 05:57:27.23bashが/bin/にない環境もあるで
0391名無しさん@お腹いっぱい。
2015/03/08(日) 07:00:32.870392名無しさん@お腹いっぱい。
2015/03/08(日) 08:29:58.08#!/sbin/busybox sh
と書くこと。
0393名無しさん@お腹いっぱい。
2015/03/09(月) 01:03:57.32害悪。
君個人しか絶対使わないマシン以外は触らないで。
0394前スレ119
2015/03/11(水) 18:57:08.87さて、プレーンテキスト中の
hoge_01_bar.pdf
hoge_01_foo.pdf
hoge_02_bar.pdf
hoge_02_foo.pdf
。。。
hoge_58_foo.pdf
hoge_59_bar.pdf
hoge_59_foo.pdf
hoge_60_bar.pdf
hoge_60_foo.pdf
を
hoge_{01..60}_bar.pdf
hoge_{01..60}_foo.pdf
に置換したいのですがどうすればできますか?
よろしくお願いします。
0395前スレ119
2015/03/11(水) 19:13:00.82同じtree.txt中に混在している状況です。
数字の部分も
01_{01..07} #(実際は7行ある)、
...
04_{01..04} #(これも4行ある)
になっているブロックもあったりしてかなりヤヤコシイのですが、
[(連番になっている数字)以外のところが同じ行]を検出して数字を{}でまとめたい感じです。
3000行あって手作業は泣きそうなので、エレガントな方法をご教授いただければ幸いです。
{01..04}_{01..07}とする必要は無いです。
よろしくお願いします。
0396名無しさん@お腹いっぱい。
2015/03/11(水) 19:16:18.160397名無しさん@お腹いっぱい。
2015/03/11(水) 19:54:30.560398名無しさん@お腹いっぱい。
2015/03/11(水) 20:19:19.48何で書くの(´・ω・`)?
0399名無しさん@お腹いっぱい。
2015/03/11(水) 20:27:02.770400名無しさん@お腹いっぱい。
2015/03/11(水) 20:48:55.55ご自分が言っているように、まず
>[(連番になっている数字)以外のところが同じ行]を検出して
これをする。たとえば次のように
sed -e 's/_[0-9][0-9]_/_%%_/' tree.txt | sort | uniq
これで「連番になっている数字以外のところが同じ行」をパターン化できる
そしたら、そのそれぞれのパターンで grep tree.txt して、sort -n し、
head -n 1 と tail -n 1 で連番の最初と最後の値を切り出す
こんな感じで行けないかな
0401名無しさん@お腹いっぱい。
2015/03/11(水) 20:58:26.700402名無しさん@お腹いっぱい。
2015/03/11(水) 23:14:35.24問題が全然理解出来ない
誰か問題を解説してくれ
0403名無しさん@お腹いっぱい。
2015/03/11(水) 23:20:28.51日本の植民地支配から、
日本が勝手に領有権を主張しだした。
現在は国際的にも韓国領と認識されている。
0404名無しさん@お腹いっぱい。
2015/03/11(水) 23:54:15.140405名無しさん@お腹いっぱい。
2015/03/12(木) 00:03:26.060406名無しさん@お腹いっぱい。
2015/03/12(木) 01:56:20.20やつらの主張の誤りは、独島=竹島だと言張ってるところ。
独島は竹島だとは別の島だよ。
0407名無しさん@お腹いっぱい。
2015/03/12(木) 02:02:58.540408名無しさん@お腹いっぱい。
2015/03/12(木) 02:46:00.10Bashのブレース展開の逆がやりたいってことかと
0409名無しさん@お腹いっぱい。
2015/03/12(木) 03:03:37.86http://search.cpan.org/~vvu/Compress-BraceExpansion-0.1.7/lib/Compress/BraceExpansion.pm
てのがあった
このままじゃ使いものにならんけどね
0410名無しさん@お腹いっぱい。
2015/03/12(木) 16:01:30.66テキストファイルを検索して見つけた行数を取得したいときって
grep -nで行数出力させて取得するのが一番シンプルかな?
マッチする最終行にしたい場合はtailと組み合わせてさ
ちなみにシェル知らなかったころってreadで1行ずつ読み込んで判断してたw
0411名無しさん@お腹いっぱい。
2015/03/12(木) 16:32:34.700412名無しさん@お腹いっぱい。
2015/03/12(木) 18:00:51.55grep -c
0413名無しさん@お腹いっぱい。
2015/03/12(木) 18:40:40.82オマエいつも問題の意味取り違えて回答して点数もらえないタイプだろw
0414名無しさん@お腹いっぱい。
2015/03/12(木) 20:35:27.12ん?
質問:検索して見つけた行数を取得したい
cオプション: 検索条件にマッチした行数を表示する
0415名無しさん@お腹いっぱい。
2015/03/12(木) 20:36:26.22あ、わかった
質問は行番号のことを行数といっているのね
0416名無しさん@お腹いっぱい。
2015/03/12(木) 20:36:37.62まだわかってないのか…重症?
0417名無しさん@お腹いっぱい。
2015/03/12(木) 21:26:36.040418名無しさん@お腹いっぱい。
2015/03/12(木) 22:07:04.23オプションなしだと複数返すコマンドだよね
0419名無しさん@お腹いっぱい。
2015/03/13(金) 00:23:15.74日本語に不自由してるのぅ
0420名無しさん@お腹いっぱい。
2015/03/13(金) 01:03:30.380421名無しさん@お腹いっぱい。
2015/03/13(金) 01:16:54.86>grep -nで行数出力させて取得するのが一番シンプルかな?
>マッチする最終行にしたい場合はtailと組み合わせてさ
これから察するに、行数と書いてはいるが、実際は行数じゃなくて行番号のこと言ってるんじゃないの?
マッチした行数が知りたいなら最終行の話なんて出てこないだろ
つまり本当にバカなのは>>416と推測
まぁ質問主から続きがなければ有耶無耶だが
0422421
2015/03/13(金) 01:17:57.58すまん眠かったってことで何も見なかったことにしてくれ……死ぬ……
0423名無しさん@お腹いっぱい。
2015/03/13(金) 04:43:04.000424名無しさん@お腹いっぱい。
2015/03/13(金) 07:28:39.510425名無しさん@お腹いっぱい。
2015/03/13(金) 07:40:15.74natural number = 自然数
complex number = 複素数
number = 数
0426名無しさん@お腹いっぱい。
2015/03/13(金) 08:04:07.16ちがう。
0427名無しさん@お腹いっぱい。
2015/03/13(金) 08:20:54.530428名無しさん@お腹いっぱい。
2015/03/13(金) 11:04:35.040429名無しさん@お腹いっぱい。
2015/03/13(金) 13:12:27.060430名無しさん@お腹いっぱい。
2015/03/13(金) 17:11:36.570431名無しさん@お腹いっぱい。
2015/03/14(土) 01:06:12.05Fランもたいがいにせいよ
0432名無しさん@お腹いっぱい。
2015/03/14(土) 02:26:16.92まあgrepでいいと思う
grep -n regexp FILE | tail -n1 | cut -d: -f1
awk /regexp/'{print NR}' FILE | tail -n1
sed -n /regexp/= FILE | tail -n1
0433名無しさん@お腹いっぱい。
2015/03/14(土) 04:57:44.74行数は line count (だからこそ grep -c )
0434名無しさん@お腹いっぱい。
2015/03/14(土) 05:17:25.87てかどーでもいいよ
行数にしろ行番号にしろ質問者が具体例を明示してる時点で誤解しようがないだろ
早がってんしたエスパースキルゼロのうっかりさんが
早漏の言い訳をぐだぐだぐだぐだぐだぐだぐだぐだぐだぐだ
くだらねー
■ このスレッドは過去ログ倉庫に格納されています