シェルスクリプト総合 その25©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2015/08/14(金) 23:42:01.51□お約束
・特記なき場合は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.illumos.org/source/xref/illumos-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0159名無しさん@お腹いっぱい。
2015/11/12(木) 15:31:56.60そのとおりです
(大きなファイルはクリティカルパスになりえるってことです)
0160名無しさん@お腹いっぱい。
2015/11/12(木) 16:43:29.68> ただこの方法だと初めの方に大きいファイルばかりダウンロードするため
> 成果が上がってるように見えません
この場合の成果とはより短い時間で完了することであるわけだが
大きいファイルを先に転送すると短い時間で済む筈だったが実際には逆で
より長い時間掛かってしまうから何とかしたい、ということですか?
0161名無しさん@お腹いっぱい。
2015/11/12(木) 17:51:07.33大きいファイルが先だとはじめはなかなか進まないってことじゃないかな。
どんなコマンドでダウンロードしてるか知らないけど、
たいてい転送バイト数を出力できるはずだから、
頑張って出力を解析して計算すればいいかと。
あるいは手元のファイルサイズを監視したほうが早いか。
0162名無しさん@お腹いっぱい。
2015/11/12(木) 17:59:30.650163名無しさん@お腹いっぱい。
2015/11/12(木) 18:33:07.59その時、残りのファイルのダウンロード順はまだ決めない。
その10個のwgetのうち、どれか先に終了したもの(ファイルサイズ最小のもののことが多いがネット環境によりそうとは限らない)
について、その時点で残りのファイルのうちサイズ最大のものを割り当てて
ダウンロードさせる。
以下、残りファイルがなくなるまで繰り返し。
0164名無しさん@お腹いっぱい。
2015/11/12(木) 20:25:10.34ダウンロード時間があらかじめ分かっていたとしてもとても難しい問題。
数学苦手なのでテキトーに聞き流してもらえると助かるが、多分 NP hard って呼ばれる問題と
同等で、全通り試さないと厳密解は得られないんじゃね?
現実的には >>163 の言う貪欲法(greedy algorithm)的な?アルゴリズムが一番だろうな。
0165名無しさん@お腹いっぱい。
2015/11/12(木) 22:52:33.75自分側のバンド使い切っていないかとか、もっと条件詰めないと
そもそも議論出来ない気がするけど。
0166名無しさん@お腹いっぱい。
2015/11/13(金) 02:37:34.170167名無しさん@お腹いっぱい。
2015/11/13(金) 02:48:29.590168名無しさん@お腹いっぱい。
2015/11/13(金) 12:04:00.880169名無しさん@お腹いっぱい。
2015/11/13(金) 12:06:28.520170名無しさん@お腹いっぱい。
2015/11/13(金) 23:16:03.310171名無しさん@お腹いっぱい。
2015/11/14(土) 00:11:59.240172名無しさん@お腹いっぱい。
2015/11/14(土) 00:39:23.96ファイルを分割してダウンロードすればいい
0173名無しさん@お腹いっぱい。
2015/11/15(日) 12:35:05.13異常だったらtcp二階建てとかしてない限りロストしてるんだから
どんどん長くなるタイムアウトをボケっと待ってたって仕方がないじゃん
むしろ定期的に試行するようにしたほうが復旧を即感知できるんじゃないか?
0174名無しさん@お腹いっぱい。
2015/11/19(木) 07:18:13.65実行するのですが、許可がないとはねられます。パスワードを入力しろ、も出て
きません。
実行者はもちろん、visudoでUSER ALL=(ALL) ALLの権限を与えられています。
$sudo echo "abc" >> /path/a.txt
bash: /path/a.txt: 許可がありません
何が問題なのでしょうか?
0175名無しさん@お腹いっぱい。
2015/11/19(木) 07:28:16.93sudo sh -c 'echo "abc" >> /path/a.txt'
0176名無しさん@お腹いっぱい。
2015/11/19(木) 07:30:35.56ぐぐったら答え書いてありました。失礼しました。
最初のechoだけsudoで評価されて、リダイレクトはそうじゃないと。
0177名無しさん@お腹いっぱい。
2015/11/19(木) 09:35:05.07さんくすです。なるほど。
ググり先を参考に、evalを使いました。
また、引数が複数の場合も含めて、スクリプトにしました。
パイプを使わない分、>>175 さんのほうがスマートですね。
for i in "$@"; do
eval echo $"$i" | sudo tee -a /path/a.txt
done
0178名無しさん@お腹いっぱい。
2015/11/19(木) 09:36:39.66>ググり先を参考に、evalを使いました。
evalじゃなくて、teeだった。すんません
0179名無しさん@お腹いっぱい。
2015/11/19(木) 13:15:22.39sudo sh -c 'echo "hoge" > "teki tou"'
echo hoge | tee "teki tou" >/dev/null
他の解決方法を考えてみました
# /dev/null 反対
echo hoge | sudo sed -ne w"teki tou"
# tee の様にファイル名を引数で受け取る
echo hoge | sudo sh -c 'cat > "$0"' "teki tou"
# pipe は無しの方向で
sudo sh -c 'echo "hoge" > "$0"' "teki tou"
0180名無しさん@お腹いっぱい。
2015/11/19(木) 22:35:50.88スレ違い
というかシェルスクリプトにすれば問題ないのに
0181名無しさん@お腹いっぱい。
2015/11/20(金) 13:29:04.21スクリプトで使う要点の一行を書くのは、このスレでなくともよく有る事では?
sudo を使っていてスクリプト向けの行ではないって事かな?
0182名無しさん@お腹いっぱい。
2015/11/20(金) 13:42:47.00違うよ。
リダイレクトを含めてスクリプトに書いておけば
sudoで(リダイレクトの)問題が起きないという意味。
0183名無しさん@お腹いっぱい。
2015/11/20(金) 13:54:47.850184名無しさん@お腹いっぱい。
2015/11/20(金) 14:14:40.640185名無しさん@お腹いっぱい。
2015/11/20(金) 14:38:57.72スクリプトの意図がよくわからない
0186名無しさん@お腹いっぱい。
2015/11/20(金) 19:37:14.930187名無しさん@お腹いっぱい。
2015/11/20(金) 22:49:21.30test.txt
int main()
{
printf("\n");
}
int hoge()
{
モジモジ
文字文字
}
void pyo()
{
もじもじ
}
--------------
$コマンド test.txt hoge
モジモジ
文字文字
0188名無しさん@お腹いっぱい。
2015/11/21(土) 00:03:09.770189名無しさん@お腹いっぱい。
2015/11/21(土) 00:06:00.44#!/bin/sh
grep --null-data -Po "(^|\n).* $2\(.*?\)(.|\n)*?{(.|\n)*?\n\K(.|\n)+?(?=\n?})" "$1"
0190名無しさん@お腹いっぱい。
2015/11/21(土) 00:15:34.13ありません
というか、何のためにそういうコマンドが必要か書いた方が
的確なアドバイスもらえる可能性高そう
0191名無しさん@お腹いっぱい。
2015/11/21(土) 00:18:18.23保守性ゼロ、使い回せる可能性ゼロのいい見本だな
0192名無しさん@お腹いっぱい。
2015/11/21(土) 00:48:31.940193名無しさん@お腹いっぱい。
2015/11/21(土) 00:52:28.46できました、ありがとうございます!
>>190
目的は外部ファイルにある関数を調べたかったのでcatで連結して
一括で調べたかっただけなのです…
0194名無しさん@お腹いっぱい。
2015/11/21(土) 01:00:24.01え、できたのw ネタのつもりで書いたのにw
まぁ真面目な話、関数内にブロックがあったら途中でちょん切れるので気をつけて。
0195名無しさん@お腹いっぱい。
2015/11/21(土) 01:04:07.86if文とか無いの?
関数の中に
}
が有れば、そこで切れると思うよ
0196名無しさん@お腹いっぱい。
2015/11/21(土) 01:05:28.850197名無しさん@お腹いっぱい。
2015/11/21(土) 01:12:31.11"\n}" である、という条件なら以下で
grep --null-data -Po "(^|\n).* $2\(.*?\)(.|\n)*?{(.|\n)*?\n\K(.|\n)+?(?=\n})" "$1"
0198名無しさん@お腹いっぱい。
2015/11/21(土) 01:26:46.640199名無しさん@お腹いっぱい。
2015/11/21(土) 02:25:44.080200名無しさん@お腹いっぱい。
2015/11/21(土) 17:10:42.130201名無しさん@お腹いっぱい。
2015/11/21(土) 18:12:48.25例えば、以下のようなテキストで
111
aaa
222
bbb 〜 ccc 〜
bbb 〜 ddd 〜
「aaa」または「bbbかつccc」だけ抜き出して
aaa
bbb 〜 ccc 〜
を抜き出したいです
grep aaa sample.txt
grep -e bbb -e ccc sample.txt
として、個別の条件で出力できるところまでは分かったのですが、
テキストに出てくる順番も重要なので、何とかうまくできないかと思ってます
それともawkとかを使う必要があるのでしょうか…
0202名無しさん@お腹いっぱい。
2015/11/21(土) 18:21:02.93grep -E 'aaa|bbb.*ccc|ccc.*bbb' a.txt
0203名無しさん@お腹いっぱい。
2015/11/21(土) 18:27:53.77できました
「bbb.*ccc」「ccc.*bbb」という書き方が思いつきませんでした
ありがとうございました
0204名無しさん@お腹いっぱい。
2015/11/21(土) 18:57:13.66yacc(よく知らないんだけど)なんかは関係ない?使えないの?
0205名無しさん@お腹いっぱい。
2015/11/22(日) 19:30:02.7001.mp4
02.mp4
…
25.mp4
という動画ファイルがあります
それとは別のテキストファイル (List.txt) があり、内容は
orange 01「みかん」
orange 02「ぽんず」
…
orange 25「かんきつ」
動画ファイルを、テキストファイルから取得した文字列で
リネームしていきたいですが良い方法を知りたいです
sedやawkでも構いません
よろしくお願いします
環境はMac El Capitanです
0206名無しさん@お腹いっぱい。
2015/11/22(日) 20:11:25.81for i in {01..25}
do
mv $i.mp4 $(grep $i List.txt).mp4
done
0207名無しさん@お腹いっぱい。
2015/11/22(日) 20:56:26.91usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
というメッセージエラーで上手くいかなかったです
List.txtの空白スペースに対応してなかったようで
orange 01「みかん」→ orange01「みかん」にしておくと
うまくいきました
0208名無しさん@お腹いっぱい。
2015/11/22(日) 20:57:02.290209名無しさん@お腹いっぱい。
2015/11/23(月) 10:43:36.030210名無しさん@お腹いっぱい。
2015/11/23(月) 14:52:02.86私はsedでこういう使い方なら使用度高いな。
ただCの関数の抜き出しなどはこれだけじゃ全然足りないね。
readf ()
{
sed -n '/[[:space:]]*[int|void][[:space:]]\+'$1'[[:space:]]*(.*)/b filter1; d;
:filter1; n; /[[:space:]]*{/n; :filter2; /[[:space:]]*}/q; p; n; b filter2' $2
}
0211名無しさん@お腹いっぱい。
2015/11/23(月) 14:53:07.970212名無しさん@お腹いっぱい。
2015/11/23(月) 15:08:42.76grepの-Pを使うといいと思う。
0213名無しさん@お腹いっぱい。
2015/11/23(月) 21:42:42.57bashism
このスレ的にだけでなく一般的にも
bash 依存のスクリプトには、#!/bin/bash を付けた方が良いよ
0214名無しさん@お腹いっぱい。
2015/11/24(火) 04:40:58.26echoを外してunset rをしてから行う事。
cat List.txt |while read
do
printf '%02d\n' $(( ++r )) |xargs -i echo mv {}.mp4 ${REPLY}.mp4
done
0215名無しさん@お腹いっぱい。
2015/11/24(火) 06:19:42.030216名無しさん@お腹いっぱい。
2015/11/24(火) 07:10:44.29じゃあちょっと分らないな。
0217名無しさん@お腹いっぱい。
2015/11/24(火) 07:13:51.390218名無しさん@お腹いっぱい。
2015/11/24(火) 07:15:07.670219名無しさん@お腹いっぱい。
2015/11/24(火) 08:53:18.61xargsが無駄です。
catが無駄です。
r=0
while read
do
: $((r++))
echo mv $(printf %02d $r).mp4
0220名無しさん@お腹いっぱい。
2015/11/24(火) 09:27:10.950221名無しさん@お腹いっぱい。
2015/11/24(火) 10:13:12.690222名無しさん@お腹いっぱい。
2015/11/24(火) 10:16:52.250223名無しさん@お腹いっぱい。
2015/11/24(火) 11:42:10.340224名無しさん@お腹いっぱい。
2015/11/25(水) 00:35:58.05bash でもいいなら
mapfile -t -O 1 -c 1 -C 'move(){ mv $(printf "%02d.mp4" "$1") "$2.mp4"; };move' < List.txt
0225200ではない
2015/11/25(水) 20:05:12.35:filter1; n; /[[:space:]]*{/n; の辺りについて
2行目に { が無い場合は、どちらを想定したのかしれないが、興味を引いた
たぶん前者だろうな。すると、古くから実際に使っていそうだね
int main(argc, argv)
int argc;
char *argv[];
{
int main(int argc, char *argv[]) {
0226名無しさん@お腹いっぱい。
2015/11/28(土) 10:55:16.58callback の中で関数定義してるよ。外でやるか、bash -c '...' にしろよ
mapfile -t -O 1 -c 1 -C 'bash -c '\''echo mv $(printf "%02d.mp4" "$0") "$1.mp4"'\' < List.txt
0227名無しさん@お腹いっぱい。
2015/11/29(日) 10:07:15.23sed: -e expression #1, char 2: 不明なコマンド: `-'
なして?
0228名無しさん@お腹いっぱい。
2015/11/29(日) 14:16:20.05sedのアドレスで $-3 とか使えませんw
head -n -4 で行けるよ。 ($-3から$までだから終りの4行削除)
0229名無しさん@お腹いっぱい。
2015/11/29(日) 18:57:29.270230名無しさん@お腹いっぱい。
2015/11/30(月) 06:01:18.54やっつけ仕事的な興味だと思うけれどまあ実際やっつけ仕事に使える。
書き留めたものの仕分けとかね。他にもhtml-xml-utilsというsoftwareに
hxpipe,hxunpipeというcommandが入ってるのだけど、その出力の処理にも使える。
はぁそろそろ現実世界に帰るか準備をぽつぽつするので帰ってきません。
0231名無しさん@お腹いっぱい。
2015/11/30(月) 09:32:38.39じゃ、この人は
http://qiita.com/takechika/items/b96eff5773ce9d9cc9b3
嘘書いてるわけねw
他のサイトでも、同様の記述見た事あるんだけどなー
0232名無しさん@お腹いっぱい。
2015/11/30(月) 11:51:54.22ネットで嘘が蔓延するのはよくあること。
他サイトは嘘をまるごとコピーして載せてるだけだろw
vi(ex)やedでは $-3 とか使えるので、それと混同してるんだろ。
0233名無しさん@お腹いっぱい。
2015/11/30(月) 12:19:42.130234名無しさん@お腹いっぱい。
2015/11/30(月) 13:05:21.61同様の記述ってどこ?
0235名無しさん@お腹いっぱい。
2015/12/01(火) 02:36:00.460236名無しさん@お腹いっぱい。
2015/12/01(火) 15:02:08.23そういうばか、死ねばいいのに。
0237名無しさん@お腹いっぱい。
2015/12/01(火) 15:30:51.280238名無しさん@お腹いっぱい。
2015/12/01(火) 15:39:36.30exで使えるからsedも使えるだろうとかセンス悪すぎる。
エンジニアの素質無い。
0239名無しさん@お腹いっぱい。
2015/12/01(火) 17:09:19.190240名無しさん@お腹いっぱい。
2015/12/01(火) 17:18:23.690241名無しさん@お腹いっぱい。
2015/12/01(火) 18:23:49.12最後に切る行数分だけバッファーすれば良い
0242名無しさん@お腹いっぱい。
2015/12/01(火) 21:49:07.761,$-3s/hoge/hage/
0243名無しさん@お腹いっぱい。
2015/12/01(火) 22:53:36.240244not 238
2015/12/02(水) 07:07:15.41それとは別に、sedではそういう処理には向かないというのは同意。
0245名無しさん@お腹いっぱい。
2015/12/02(水) 23:21:03.30sed -ne ':Lp; N; 1,4b Lp; P; D'
cutTail()
{
sed -ne '
:LoopToFillBuffer
N
1, '"$1"' b LoopToFillBuffer
P
D
'
}
0246名無しさん@お腹いっぱい。
2015/12/04(金) 00:22:12.57sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2
http://sed.sourceforge.net/sed1line.txt
0247名無しさん@お腹いっぱい。
2015/12/04(金) 06:04:34.02-e オプションで複数に分ける意味ないだろ。
sed ':a;$d;N;2,10ba;P;D'
または
sed -n ':a;1,10!{P;N;D;};N;ba'
だけで行ける。
0248名無しさん@お腹いっぱい。
2015/12/04(金) 06:26:55.090249名無しさん@お腹いっぱい。
2015/12/04(金) 07:53:54.11つ 『Unix Shell Objects』
http://www.amazon.co.jp/dp/toc/0764570048
0250名無しさん@お腹いっぱい。
2015/12/07(月) 10:28:27.330251名無しさん@お腹いっぱい。
2015/12/07(月) 10:33:45.350252名無しさん@お腹いっぱい。
2015/12/07(月) 10:48:19.190253名無しさん@お腹いっぱい。
2015/12/07(月) 11:21:08.520254名無しさん@お腹いっぱい。
2015/12/07(月) 13:20:40.25スクリプトからブラウザ呼ぶの?
0255名無しさん@お腹いっぱい。
2015/12/07(月) 16:31:25.34うちではcurlが鉄板だわ
0256名無しさん@お腹いっぱい。
2015/12/07(月) 21:08:34.28http://stackoverflow.com/questions/9490872/is-wget-or-similar-programs-always-available-on-posix-systems
まあ、wget curl が普通だろうけど、汎用的って言う事で考えるに telnet を追加
{ sleep 1; printf 'open home.mcom.com 80\n'; sleep 3; printf 'GET /home/welcome.html HTTP/1.0\n\n'; sleep 3; } | telnet -8
0257名無しさん@お腹いっぱい。
2015/12/07(月) 21:20:56.810258名無しさん@お腹いっぱい。
2015/12/07(月) 21:27:45.230259名無しさん@お腹いっぱい。
2015/12/07(月) 22:42:59.47SSL/TLSのためにもうひと工夫あるんだよな?
ボケ回答のウケ狙いじゃないよな?
■ このスレッドは過去ログ倉庫に格納されています