シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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/
乙です
ああ、次スレをいつ立てようかとタイミングを見ていたが
次スレ立ったか...
一応前スレでテンプレ書いた手前、書き込んでおきます
シェルスクリプトの総合スレです。
初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずはテンプレートをご覧下さい。
□A. お約束
1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。
2. 質問する前に、まず自分で調べましょう。ただし、
「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。
3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。
4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は
控えましょう。
□B. お約束の補足
1. Mac OS X では、/bin/sh の実体は bash です。また、一般的に BSD 系 や
GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。
ls -l /bin/sh や readlink -e /bin/sh で確かめて下さい。
2. 可搬性については、下記 F.1 を参照して下さい。
3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities )
を参照して下さい。
4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に
小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 )
5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、
SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。
SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。
( 下記 F.3 参照 )
□C. 初心者へのアドバイス
1. シェルスクリプトのことをシェルってゆーな
2. 知らないコマンドが出てきたら man コマンドで調べましょう。
3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。
apropos ないしは man -k でそれらしい単語による簡単な検索もできます。
4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。
5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。
6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が
適した処理にはそちらを使いましょう。
7. シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題は正規表現スレへ
8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照
http://www.speech-lab.org/~hiroki/csh-whynot.euc 9. cat file|すんなハゲ
a. 詳細は "Useless Use of Cat" UUOC で検索して下さい
b. 有用な場合も有ります Useful use of cat(1) 英文
http://www.in-ulm.de/~mascheck/various/uuoc/ □D. シェルスクリプトでよく使うコマンド
1. 制御・条件判定系: [, test, expr, true, false, yes, getopts
2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut,
paste, comm, join
3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、
find は -exec command {} + を推奨。
他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 )
4. ディレクトリ系: basename, dirname
5. 出力系: echo, printf
6. 対話コマンド制御系: expect
7. http / ftp の処理自動化: wget, curl
□J. テンプレートの変更案や、おすすめの本、リンク等が有りましたら続けてどうぞ!
1. 検索しやすい様に、先頭に "コメント複数行\n指示\n□X" を付けて指定して下さい。
追加や、削除、挿入、移動、分割等と適切に書いて下さい。
900 レスまでに別の方の反論が無ければ、次にスレッドを立てる人が適当に判断して
取り込むはずです。
2. レス例
スクリプトスレを列挙するのは不要に感じる
削除
□H. 関連スレ
H.5から8 ECMAScript, Rubyについて, Pythonのお勉強, サーバサイドjavascript
3. レス例
これは、聖なる本
追加
□E. 学習用テキスト
4.お勧め図書
a 伝承シェルプログラミング ( 199X年 )
http://www.example.net/404.html | テンプレートの変更案や、お勧めのリンク、本等が有りましたら、
V あ、張り切って〜、どうぞ〜! 案じゃ無くてつぶやきでも、どうぞ〜!
11 :
名無しさん@お腹いっぱい。:2014/11/12(水) 04:59:38.71
シャナスクリプトはまだですか?
シャロスクリプトもまだです
そういえば
コート脱いだらハワイのミポリソ萌えスクリプトが
サーバのどっかに転がってたかもなぁw
前スレで長テンプレを提案してた人スレ立ったらテンプレそのままでざまぁwww
とか思ってたらしっかり記載していたでござる
なんか文面の雰囲気変わったな、もっと堅い感じだった気がするが
>>14 変えてないけどなあ
意見聞く際になるべく中立、丁寧語で書いたから、そういう印象なのかな?
意見を聞いて了承を得てからという作業は面倒臭かったが
たとえ、その23 以前の短い1レスだけのテンプレのままを、立てる人がコピペするにしても
少なくとも Perl の矛盾した記述だけはなんとかしたい
シェルスクリプト総合 その1 からずっと最近までは
「(Rubyや)awkまたはperlの方が適した処理にはそちらを使いましょう。」だけだった
お勧めの shell を教えて下さい。
ずっと(22年ぐらい) 自宅や学校の FreeBSD上で tcsh を login shell として使ってきましたが、
このスレを読んで、 csh 系スクリプトはお勧めでないことを知りました。
root で作業するときには、 sh も必要なので使いますし、スクリプトも書くのですが
tcsh から sh系に移行できないでいます。
最近は仕事で数値計算をするときのプラットフォームが cygwin になってしまったため、
これを機に 自宅の FreeBSD でも、sh 系を login shell にするように切り替えようかとも思っています。
お勧めを教えて頂けませんでしょうか。
どうぞ宜しくお願い致します。
お、おう
ログインシェルとスクリプトのシェルを一致させる必要は別にないのになぁ…
ログインシェルはzshでスクリプト書くときはbashかな
ログインシェルもスクリプトもashだ
Bシェル系同士なら一致させなくても良い
スクリプトは ash か dash
z750sh3
shで無駄にがんばる
いやなんとなく続けてるだけか
/bin/sh でがんばっているよ
実体が ash だったり
dash へのリンクだったりするだけでw
がんばるってほどのことかな
スクリプト書く労力は他のシェルでもあんま変わらんでしょ?
ん? ログインシェルを/bin/shで頑張るって話でしょ?
補完なし、ヒストリーなし、aliasなしで。
スクリプトスレだからスクリプト動かす話だよ
>>19 の、ログインシェルとスクリプトのシェルを一致させる必要があるかどうか
という話から来てるから、
ログインシェルの話だろ
emacsキーバインドのtcshでログインして、viでashスクリプト書いてるわ。
>>28 ashはファイル補完もヒストリー呼び出しもある。
aliasなんてうんこ。functionの方が強力。
スレ違いっぽいので何だがw
ログインシェルは zsh
>>33 大抵emacsのshell-modeで使うので、ヒストリやコンプリーションは
なくてもそれほど困らない。
もういっそログインシェルをemacsにしろよw
ログインシェルを遊びでviにしてみたことならある。
その状態でログインしたviからシェルエスケープしようとすると
vi変数でshell=vi状態になってるのでシェルのつもりでさらにviが起動されてハマる。
emacsをdisplay managerにしたようなOSがあったな。
Oberon?
apollo domain
for文で空白区切りのリストを後ろからループさせることはできないでしょうか?
下記の例だと「1 2 3」の順で表示されますが、これを「3 2 1」の順で表示させたいです。
VLIST="1 2 3"
for val in $VLIST
do
echo $val
done
>>41 VLIST='1 2 3'
for val in `echo "$VLIST" | tac -s ' '`
do
echo "$val"
done
43 :
41:2014/11/25(火) 13:39:35.78
>>42 すごい!できました。
ありがとうございました!
もう答えが出ちゃってますけど rev コマンドでも行けます
$ for val in $(rev <<< "$VLIST"); do echo $val; done
tac便利、自分も使ってる
>>45 revだと、2桁以上の数字の時 数値の桁が入れ替わるので不可。
12 13 14 -> 41 31 21 みたいに
tac 知らなかったが便利そうだ。
良かった。知らないのは俺だけじゃなかったんだなw
GNU 方面は、他にも便利なコマンドがいろいろありそう・・・
(さすがに date コマンドで日付演算できるのは知ってた)
とりあえずcoreutilsに入ってるものは全部覚えておこうぜ
100個ぐらいしかないんだからさ
tac知ってたけど有効な使い道が見いだせないでいた
しかし名前のセンスいいよな
slがtacの仲間だと思って入れた時の脱力感
どうせまたBash shockのようにCoreutils shockが起こるんだぜ?
やめておけよw
tac使わずに標準コマンドまたは内部コマンドだけでやれ、というのがいい詰めスクリプト問題になるなぁ。
再帰すればラクショー
VLIST='1 2 3'
t=; for val in $VLIST; do t="$val $t"; done
for val in $t
do
echo "$val"
done
>>56 のあとに再帰すら使ってないラクショーな
>>57 が書き込まれた件について
再帰するならこうか。これ活用しにくい。これなら
>>57 の方がいい
VLIST='1 2 3'
func()
{
if [ $# -gt 1 ]; then
(shift; func "$@")
fi
echo "$1"
}
func $VLIST
未熟者のオレに
>>57の動きを教えてくだせえ。。。
set -x してから
>>57 を実行してみると分かると思う
>>57が正統派に思えてくる
素直で余計なことをしていない
逆転と出力で2回forってるのが気にはなるが
#!/bin/bash
VLIST='1 2 3 4 5'
val=($VLIST)
while [ ${#val[@]} -gt 0 ]; do
echo ${val[${#val[@]}-1]}
unset val[${#val[@]}-1]
done
>>64 どうせbash使うなら素直にこうやれよ
↓
#!/bin/bash
VLIST='1 2 3 4 5'
val=($VLIST)
for ((i=${#val[@]}-1; i >= 0; i--)) {
echo ${val[i]}
}
どうせ10個もアイテムないだろうから
VLIST="1 2 3"
set $VLIST
for val in $9 $8 $7 $6 $5 $4 $3 $2 $1
do
echo $val
done
それだったら
echo $9 $8 $7 $6 $5 $4 $3 $2 $1
でええやん…
>>59 bash/zsh なら local 変数使ってこんな感じに
function reverse {
local arg="$1"
[ $# -gt 0 ] &&
{ shift; reverse "$@"; echo -n "$arg "; }
}
最後の改行はどうすべぇ…
2段重ねにしてみる
function reverse {
function _reverse {
local arg="$1"
[ $# -gt 0 ] &&
{ shift; _reverse "$@"; echo -n "$arg "; }
}
_reverse "$@" | sed 's/ $/\n/'
}
キモい
もっと綺麗にならんかね
>>70 毎日凝視して眺める訳じゃないから
動けばいい、安定してどんな場面でも問題が起こらなければいい。
シェルスクリプトなんてそういうレベルのもの
しょせん手作業の積み上げだからね。
「コードが汚くても安定して動けばいい」なんてのは
他人のコードをメンテしたり機能追加したことのない奴が言うセリフ
継続してメンテしなきゃいけないスクリプトもあるし
一回動けばそれでいい使い捨てのスクリプトもある
それだけの話っしょ
>>68,69 は再帰を知っていれば分かりやすいと思うけどなぁ
再起知らないプログラマなんて存在しないだろ
>>72 自分しか使わないマシンでも他人にメンテをお願いする
前提で書かないとならないのかい?
むしろメンテ側の人間には全く関係ない話しなんだが。
>>76 一ヶ月前の自分は他人と思えって諺があってだな
個人的には自分のコードを汚く書いてしまったせいで泣くはめになったことも良くある
いくらか使いこなせるようになったPerlerによくあった
>>77 良い師匠に巡り会ったじゃない。
もし1ヶ月前の自分が完全無欠なら精進の可能性を断たれるな。
数年前にキレイに書いたつもりのスクリプトでもメンテ(改造)めんどいお
保身のため、コードはなるべく汚く、自分しか読めないように書くこと。リストラ対策。
それは辞めたくなったときに困る
数年たちゃ腕もあがるだろうから当時の綺麗でも今の汚いなんだろうな
こういっちゃなんだが何年経とうが、何日経とうが
シェルスクリプトに問題が出て治す必要があるなら
最初から書いた方が良いよ、、その時の実力で
最良のものが書ける。
1度書いた流れなら数年経っても頭に残ってるから
高速で仕上がるし、できた物を比べても大した違いは無い事も多い。
駆け出しの頃の書き物はまったく変わるのかもしれないが
それはそれで、全く変わらないと困るだろ。
過去の駄作に手をいれてジタバタしたって無駄
使い捨てのつもりだったのに、長期にわたって使われた上に
「これこういう風に変えられない?」とか言われて白目になったことはある。
もちろん一般化できる話じゃないとは思うけど。
改行って^Mですよね?
echo "1^M2"で2しか表示されません何故ですか?
echo "1\r2"もそうでした
echo "1\n2"はちゃんと改行されて1と2が表示されました
^M \r \nってどう使い分けるものですか?
^MはCTRL+V CTRL+Mで入力しました
\rと^Mは同じでCR。
\nと^Jは同じでLF。
CRとLFの違いは自分で調べろ。
CRはコンデンサと抵抗による時定数回路、
LFは低周波であることはわかりましたが、
そこから先がわかりません、よろしく女教授ください。
>>90 CRとLFやタブストップなどは
機械式タイプライター由来なので、一度現物を見れば忘れない
ヤフオクで1000円くらいで手に入るから買ってみるといいよ
私女だけど
Macのテキストファイルの改行コードは CR ひとつなんだっけ
OSによって開業コード違いますよね。
Linuxは0xJで改行、BSDは0xMで改行しますよね。
どうしてこういう違いができたんでしょう?
簡単に返還する方法はありますか?
dos2ux
これってHP依存コマンドだっけ?
97 :
88:2014/11/28(金) 20:10:29.27
CRだと最後の文字しか表示しないってことですか?
例えば
a<CR>
b<CR>
だったらbしか表示されないってことですか?
aを表示した後に行頭に戻ってbを表示している
CRだとQを上げられないから、ボルフォロで正帰還かけるか、LCRにするべきだな。
>>92 組み込みでもCR改行の場合がある。
LFで良いだろうぜぇ…といつも思うわ
なんでこんな反応してんの?
反応したら行けない理由は?
>>102に許可が射るのか?
改行コードは初心者のころに誰でも一度は通る道だからねえ
その次に通る道はBOM…だったけど最近はWindows触ってないから今どうなってるのか分からん
少し前に某サイトの解析スクリプト作ったときちょっと改行が面倒だった
HTMLはWindowsで作ってるらしくgrepとsedで抽出したあとCRのごみがついてることに気がついた
なのでCR削除したんだけどsambaで共有してるディレクトリに置いていたファイルを
メモ帳で開くことがあってまたぐちゃぐちゃに、まあTeraPadとかで開けばいいんだけど
環境に依存してしまうので再度CRくっ付けて解決したな
改行法師ンフフ
Macの標準がCRなんだよね
109 :
102:2014/11/29(土) 00:39:08.93
質問内容稚拙だったり、回答後に更に質問したり、
そのあたりから定期的に張られる改変コピペだろうと思っただけなんだが
今回やたらみんな親切だから気になっただけだ
改変コピペって・・・いつもこのスレに張り付いてんのかよ
$ echo "1\r2"
1\r2
$ echo -e "1\r2"
$ echo $'1\r2'
誘導も移動も自作自演
>>112-114 これいやらしくて自分も引っかかったんだけど
>>112はshで目的の動作をしてbashだとだめなんだよな
自分はシェルがbashでスクリプトはshなんだけど
実行結果が違うから引っかかって結構悩んだ
ひどい言いがかりだ
まだbashなんか使ってたのかよw
鉄腕bash
大腕硬爆衝
Xpath形式のデータを整形式にするスクリプト知りませんか?
1点ご質問させてください。
現在下記のようなシェルスクリプトを書いています。
trap 'echo "ERROR!!" ; exit 1' ERR
hoge 2>&1 | tee test.log
hoge2 2>&1 | tee test.log
hoge3 2>&1 | tee test.log
hoge4 2>&1 | tee test.log
コマンド結果の標準出力と標準エラー出力の両方を
ログファイルに残したいのですが
この場合、最初のコマンドで戻り値に1が返されても
次のteeコマンドで戻り値が0になってしまうため
trapで適切にエラーハンドリングできない状態です。
pipestatus使えば何とかなりそうなのですが
その場合コマンドを実行するたびにif文で
pipestatusを評価する必要があるため、冗長に感じてしまいます。
そのためもしより良い解決方法がありましたらご教授いただけませんか。
function にしてみるとか
err_and_exit () {
trap 'echo "ERROR!!" ; exit 1' ERR
eval "$@"
}
err_and_exit 'hoge' 2>&1 | tee test.log
>>127 全部まとめて tee して、コマンドは && でつなげばエラーがあれば途中で打ち切ってくれるよ。
( hoge && hoge2 && hoge3 && hoge ) 2>&1 | tee test.log
130 :
129:2014/12/07(日) 13:37:42.00
amp化けやだー 全角&で書き直すわ
( hoge && hoge2 && hoge3 && hoge4 ) 2>&1 | tee test.log
set -eじゃダメなのか?
>>127 #!/bin/bash
exec > >(tee test.log) 2>&1
trap 'echo "ERROR!!" ; exit 1' ERR
hoge
hoge2
hoge3
hoge4
>>131 set -e
false | true
echo 'set -e してもパイプ下流が真だと終了しないよw'
>>128>>129>>132 お礼が遅くなりましたが、ご回答ありがとうございました。
今回用途としてはコマンドを実行してエラーが発生した段階で
スクリプトを終了させたかったため、下記のような記述に変更しました。
(hoge && hoge2 && hoge3 && hoge4 ) 2>&1 | tee test.log
[ ${PIPESTATUS[0]} - ne 0 ] && exit 1
hoge5
hoge6
>>127と比べると「tee test.log」の重複した記述もなくなったので
少しすっきりしたように感じます。
良い解決方法を教えていただき、ありがとうございました。
136 :
名無しさん@お腹いっぱい。:2014/12/12(金) 12:07:03.36
もう1週間も悩んでいるのに解決せず、ぜひ皆さんのお知恵を
かしてください。
テキストの処理で、数千kBほどのテキストファイルをスクリプト
で処理したいと思っています。環境はCENTOS6.5(i686,32ビット)
で、シェルはBASHです。
シェルスクリプトの最初の方で得られた変数があり、これは動的に変化
します。
START="`grep start`"(←実際はgrepのあとにも処理あり)
END="`grep end`"
二つには行番号が入っており、これをsedのアドレスの指定に使って
START行からEND行までを削除させたいのです。この段階でデバグ
のため、START、ENDともスクリプト途中にechoで表示させて値が
きちんと入っているのを確認しています。
具体的には
sed -e "$START,$ENDd" /dir/file
を実行させても、sedは「,」が未知のコマンドです、と言ってき
ます。
sed -e "${START},${END}d" /dir/file
でも
sed -e '"${START}","${END}"d' /dir/file
でも駄目でした。sedが$を最終行と勘違いしているのかと
sed -e "\$START,\$ENDd" /dir/file
としてみても、これも駄目でした。
そもそも、sedのパラメータには変数は使えないのでしょうか?
同じ事がスクリプト中でできれば、sedでなくても構いませんが。
他におもいつきません。
ネットを検索すると、sedの置換(sed 's/$A/$B/'とか)ではそ
ういう例もあるようですが。よろしくお願いします。
>>136 sed ${START},${END}d /dir/file
で行けるよ。
変数 START ENDに余分なスペースが入ってないか注意。
スペース取るには、
START=`echo $START`
END=`echo $ECHO`
で、代入し直す。
ダブルクォートで囲っちゃえばいいんじゃない
sed "${START},${END}d" /dir/file
START=1
END=2
printf "foo\nbar\nbaz\n" | sed "${START},${END}d"
=> baz
printf "foo\nbar\nbaz\n" | sed " ${START} , ${END} d"
=> baz
>>136 > sedは「,」が未知のコマンドです、と言ってき
これ、START 変数が undef か空っぽ("")なんじゃない?
set -x してからスクリプトを実行してみて確かめたほうがいいよ。
エスパーすると $START とかに 全角スペース が入ってるw
なるほどw
$ printf "foo\nbar\nbaz\n" | sed ",2d"
sed: -e 表現 #1, 文字数 1: 未知のコマンドです: 「,」
144 :
名無しさん@お腹いっぱい。:2014/12/12(金) 14:02:50.73
>>136 です。
やさしきみなさん、コメントありがとうございます。
これからいじくってみて、あとで結果報告いたします。
145 :
名無しさん@お腹いっぱい。:2014/12/12(金) 14:35:13.48
>>136 です。
デバグ用の
echo $START
echo $END
の直後に、
START=`echo $START`
START=`echo $END`
を追加して実行したところ、な、な、なんと!
思い通りの結果が得られました。この一週間悩んだのが
たった2行の追加でクリアされました。なんかポカーン状態
ですが。。。
画面上では空白が入ってないように見えただけかもしれま
せん。
>>137 さん助かりました。ありがとうございます。
>>139 さんの書かれたprintf文、参考になりました。まずこ
れを試してみるべきでしたね。
たぶん後ろに改行が入ってたんじゃないかな
^Mのやつ
147 :
名無しさん@お腹いっぱい。:2014/12/12(金) 15:06:40.30
^Mですか。結構、ネット上には^Mを消すという記事がありますね。
これのことだったのか、がてんいきました。
^M だと、
START=`echo $START`
やっても^Mは取れないから、違うと思うぞ
シェルスクリプトはXMLのDOM操作のようなことはできないんですか?
あいだに要素を追加したりとか
要素って具体的に何?
シェルスクリプトで、XMLのDOM操作をしたいってことなのか
「のようなこと」ってあるから別の何かかと思った
使ったことは無いんだけど、XMLgawkが便利そう
XML Starletとか
155 :
名無しさん@お腹いっぱい。:2014/12/15(月) 19:52:22.36
dashってのがあったんだ。
知らなかった。。。ash系なのか、ダッシュ島系なのか
農家専用プログラミング言語
157 :
グールドの著作を読むなら原書で:2014/12/16(火) 15:34:56.67
1993年に慶応藤沢で書いたc shellプログラムです。fingerの結果から名字を省いて名前だけローマ字表示で取り出しHi xoxo!とするプログラム
#!/bin/csh -f
### Compact wise program that extracts user's first name only from result of "finger" command on UNIX without any Admin rights ###
set who = `finger -m $user`
echo -n ' Hi '"$who[7]" echo '\!' (= Hi YOURNAME!)
# First name comes at 7th place divided by spaces
当時の基準で採点してみてください。当時はこういうユーザフレンドリなプログラム見かけなかったんだけど。環境が違えばあったのかな?
>>157 1993年ってもうSVR4とかある時代だからそんなに古くないし、スクリプト内容も見所がない。
何を採点して欲しいやら。
強いて言うと、
cshスクリプト - 大減点
echoコマンドを2回に分ける必要ない - 減点
echoコマンドのところ改行のコピペミス?
fingerコマンドの出力って環境によってたぶん違うよ。
ちなみにこちらの環境では finger の 4番目の位置にファーストネームが入る。
#!/bin/sh
set `finger -m $USER`
echo ' Hi '"$4"'!'
159 :
グールドの著作を読むなら原書で:2014/12/16(火) 17:23:03.61
>>158 echoコマンドはこういう遣り方じゃないと勝手に改行が入って苦労しました。
!も特殊文字扱いだったということでしょう。
それはさておきいちいちwhoとか名前付けてsetしなくてよいということですね。
こういうプログラムって当時からやってました?
sfcって遅れたキャンパスだったので、他大学の工学部などでは常識でも
あのキャンパスでは非常識ということも多々あるかと思います。
とにかくHi [first name]っていうプログラムを動かしてたのは学内で自分だけでした。
プログラムの全体はLaTeXをエクステンション除いたファイル名だけ打ち込めば
任意のプリンタから自動印刷できるという内容なんですがね。
昔話がしたいの?
161 :
グールドの著作を読むなら原書で:2014/12/16(火) 17:38:54.20
他キャンパスでは当時どうだったか知りたいだけ。これってアドミン権限除いた
基本的な構造はAmazon.comなどで金になってる商売だから。
1993年ならUNIXとしては遅い方。
どこにでも普通に転がってるスクリプトだし、なんの変哲もないヘボスクリプトの何を評価しろとw
163 :
グールドの著作を読むなら原書で:2014/12/16(火) 17:54:06.78
このスクリプトの特許持っている人ってどの国の何ていう人で取得年は何年?
なんで特許持ってる前提になってんの?
165 :
グールドの著作を読むなら原書で:2014/12/16(火) 17:58:23.52
金になるアイデアには特許が付き物でしょう。Amazon.comだって誰かに金払ってるでしょ。
もしかして、root権限がなくても/etc/passwdのフルネームフィルドが読める手法がすごい、って言ってるの?
/etc/passwdは一般ユーザーでももともと読めるし、(たとえshadowでもパスワード部分以外は)
NIS使ってるならypcat passwdは一般ユーザーでもできるし。
何の新規性もない。
167 :
グールドの著作を読むなら原書で:2014/12/16(火) 18:38:28.60
>>166 そうではなくて、大したことの無いアイデアが金になることがある、ということを強調している。
Amazon.com等々が誰かに金を払っているのは事実の筈だし。無論アドミン権限の中のプログラム
であってもデータから抜き出す作業は同じ。で、Amazonとかできた当初はHi某とか言ってこなかった
筈なので、そこら辺の経緯を知りたいわけ。日本語では英語名で抜き出すのは日本語名で抜き出す
よりは厄介な筈。他に方法いくらでもあるから。
スレ違い。
「俺が始めてだ、すげーだろー」は、その時点で主張しなけりゃ何の意味もない
ちなみにBBSにおいてユーザーの識別子として一方向ハッシュを表示する手法を、提唱したのは俺だ。
>>167 そこまで知りたいなら調べて報告してくれ
おしえてクンじゃなければね
>>167 > Amazon.com等々が誰かに金を払っているのは事実の筈だし。
まず、このソースを出してくれ
mksh; MirBSD Korn Shell
ってのがあったんだ。
知らなかった。。。ash系なのか、ダッシュ島系なのか
173 :
名無しさん@お腹いっぱい。:2014/12/23(火) 07:08:11.72
おっさんそんな調子で年越せんのか
しっかりしろ
さあ、クリスマスだよ。
学生さんは冬休みに、買ってもらった
Mac, iPhone, android でシェルスクリプトを書いて遊ぼう!
買ってもらった?
学生なら自分で買うわ。
生徒や児童なら買ってもらうかも知れんが。
176 :
あ:2014/12/25(木) 19:32:27.25
/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// ヽ::::::::::::::l
l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/:::「'ヽ:::::::::::// ヽ:::::::::::|
|::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ノl:::ノ l:::::::/ ヽ::::::::|
ノ:::::::::::::::::::::::::::::::::::::::::::::::::::::/ ゙゙ ノ:::/ ,,;;;;;;,, ,,,,ヽ:::::l
):::::::::::::::::::::::::::::::::::::::::::::::/ ノ/ __,'''i: ('''__):::l
)::::::::::::::::::::::::::::::::::::::::::::::::::/  ̄ ̄ン:. :「 ̄`ヾ
1:::::::::::::::::::::::「 `┤l:::::::::::::::::l  ̄ , ヽ ̄ l
`l:::::::::::::::::::::ヽ :l li:::::::::::::/ ヽ /´ `l |
ヽ::::::::::::::::::::::\_」 lヽ::::/ .l !:-●,__ ノ /
ノ:::::::::::::::::::::::::::ノ | l `゙゙ i ,,;;;;;;;;;;;;;;;;;;;;, /ヽ
,/ ヽ::::::::::::::::::::::( l l::::::::.. /.:''/´ ̄_ソ / `ヽ
ヽ:::::::::::::::ヽ | l:::::::::::... /::// ̄ ̄_ソ / \ ヴッ!!
ヽ:::::::\| l::::::::::::::::... / :::.ゝ` ̄ ̄/ / ヽ
ヽ:::l l:::::::::::::::::::..  ̄ ̄;;'' / ヽ
l l;;;;;;:::::::::::::::.....;;;;............;;;;;;''ノ l
l l '''''''''''''''''''''''''''''''''''''' ̄l | |
http://www.youtube.com/watch?v=z2qK2lhk9O0
177 :
名無しさん@お腹いっぱい。:2014/12/26(金) 09:25:20.89
スレ違いかもだけど。。。
cronでスクリプト最速で回すとすると
* * * * * /home/user/hoge.sh
だけど、これ以上の頻度というか速度で実行できないのかな。
無限ループ覚悟で、hoge.shの最後に自分自身をコールするとか。
自分自身でまわすならcronからは1回でいいじゃん
>>177 何かの待ち受けイベントチェックか?
普通にsleep 1とかしながらループすればいいじゃん。cron必要なし。
自分自身をコールするするのは無駄だからwhile :; do hoge; sleep 1; done で無限ループな。
*じゃなく*だ。
181 :
名無しさん@お腹いっぱい。:2014/12/26(金) 10:01:04.07
>>179 そうです、自宅鯖で、smtpからweb、ssh、イベント監視まで
全部やらせてるマシン。あんまとっぴなことすると、落ちそう
なので。sleep入れれば、変な挙動はなくなりそうですね。
感謝!
182 :
名無しさん@お腹いっぱい。:2014/12/26(金) 12:23:03.31
>>179さんの助言をそのまんまパクリ、
さっそくcronをやめて、do while ( `nantoka` ) done方式に変更。
前にcase文をつけてstart、stop、resartで起動、停止
できるようにした。sleep_secは10秒。これで様子みます。
しかし、良スレですね、ここは。いつも助けていただき感謝です。
183 :
名無しさん@お腹いっぱい。:2014/12/26(金) 12:27:53.31
ここの住人のかたがたは皆さん知ってるだろうけど
今浦島な私には、pgrep、pkillというコマンドが使える
のが素晴らしいと思いました。(最近知った)
なんか昔は、kill -9 `pidof nantoka`とかやってたのが
なつかしいというか。
話続けるなら名前欄にレス番入れてよ。
>>179 conky使ったりatに登録したりしてまわさなくても、
単純にそれで良かったんだなあ。
さあ、大晦日だよ。
学生さんは冬休みに、買ってもらった
Mac, iPhone, android でシェルスクリプトを書いて遊ぼう!
iPhoneでどうやって書けるの?
ggl 検索文字列
でw3mを使って検索文字列でググる要にしているのを拡張したい
具体的には
コピーしてクリップボードの中に入ってる文字で検索しようと思う
それ自体は簡単なのだけど、問題は --clipboard や -c のオプションを付けた時に実行されるのか、(ggl -c)
それとももっとルーズに (ggl) と引数無しの状態で実行するか悩んでいる
オプションとかのガイドラインてある?
例えば -l はリスト(at -l など)で使うとか、多くのコマンドは
引数がない時は -h オプションと同じように簡単な説明がでるとかのメジャーなガイドライン
GNUにはあった気がする
引数ないときは「クリップボードから」なんて慣習は存在しない。
興味があったのでちょっと検索してみた。
ガイドラインというのはわからないが、こんな感じで使われてるね〜みたいのなら、
http://catb.org/~esr/writings/taoup/html/ch10s05.html > The -a to -z of Command-Line Options
>
> Over time, frequently-used options in well-known Unix programs have established a loose sort of semantic standard
> for what various flags might be expected to mean. The following is a list of options and meanings that should prove
> usefully unsurprising to an experienced Unix user:
http://www.gnu.org/prep/standards/html_node/Option-Table.html > 4.9 Table of Long Options
>
> Here is a table of long options used by GNU programs. It is surely incomplete, but we aim to list all the options that
> a new program might want to be compatible with. If you use names not already in the table, please send
>
[email protected] a list of them, with their meanings, so we can update the table.
>>191-193 サンキュー
URL先の情報にぴったりのオプション見つからないから
-h を少し書いて後々忘れた時に備えて、
デフォルトでクリップボードで検索、
引数あるときはそれで検索にする
両方用意すればいいんじゃない?
自分の名前がgglかgglcかで動作が変わるのも面白そう。
名前同じで動作変わるとmanの括弧書きの数字が増えてややこしいみたいな?
そういやgetopt(3)ってPOSIXで規定されてるんだね。いまどきの
*BSD, Linuxならlibcで持ってるものなんだな。
とあるソフトがGNUのgetopt.cを同梱しているので消してやりたいと思って
いたんだけど、configureでgetoptの存在チェックしてlibcの方を優先して
使わせるようにするのがいいのかな。
「とあるソフト」がGPLなら、一部を削除するのはライセンス違反。
GPL V3
4. Conveying Verbatim Copies.
5. Conveying Modified Source Versions.
202 :
名無しさん@お腹いっぱい。:2015/01/08(木) 18:53:35.81
質問です
22, 32, 33, 45,
12, 47, 78, 44, 32,
...
数字がカンマで区切って700個書いてあるファイルがあります。
一行に数字が何個あるか規則性はありません。
このファイルを読み込んで数字を100個ずつ出力して7枚のファイルを
作りたいと思っています。シェルスクリプトでうまくできますでしょうか。
出力されたファイルには数字が一列で入っているほうがいいです。
お願いします。
GNU awk 限定
awk -v RS='' -v FPAT='( *[0-9]+, *\n?){1,100}' \
'{
for(i=1;i<=NF;i++){
gsub(" *\n"," ",$i);
gsub(", *$","",$i);
print $i > i ".txt";
}
}' a.txt
上手く行けば 1.txt ... 7.txt というファイルができるはず
gawk じゃなくてふつーの awk で。
awk -v RS=, '{print $0+0 > int(NR/100)+1 ".txt" }'
int((NR-1)/100)+1 じゃないとダメだった。
206 :
203:2015/01/08(木) 20:51:41.18
あ、カンマはいらないのね
207 :
203:2015/01/08(木) 20:56:03.24
なおかつ1列を1行と読み間違えていた(´・ω・`)ショボーン
ファイル分割が有るし、awkでやる方が良いだろうけど、sedで
見易さの為-r付けてます
#!/bin/sh
sed -re '
:loop;
$! {
N;
b loop;
}
s/,[ \n]+/, /g;
s/([0-9]+, ){100}/&\n/g;
' | {
i=1
while read line
do
echo "$line" > "$(( i++ )).txt"
done
}
awkもsedも出ちまったか
tr -d '\r\n' < file
set -- `sed 's/,/ /g' input.txt`
i=1
while [ $i -le 7 ]; do
(j=1; while [ $j -le 100 ]; do echo "$1"; shift; done) > $i.txt
211 :
209:2015/01/08(木) 21:57:31.95
ミス
tr -d '\r\n' < file | tr ',' '\n' | split -l 100
考えてる途中で送っちゃった。やり直し
set -- `sed 's/,/ /g' input.txt`
i=1
while [ $i -le 7 ]; do
(j=1; while [ $j -le 100 ]; do echo "$1"; shift; j=$((j + 1)); done) > $i.txt
shift 100
i=$((i + 1))
done
213 :
209:2015/01/08(木) 22:01:45.08
/ *, */を改行に変換してhead
#!/bin/sh
file=`cat "$1"`
for i in `seq 1 7`; do
for j in `seq 1 100`; do
echo -n ${file%%,*}, >>$i.txt
file=${file#*,}
done
done
GNU grep and GNU parallel
$ grep -Po '[0-9]+' data.txt | parallel --pipe -L 100 -n 1 -k 'cat - > {#}.txt'
211と216を足して
$ grep -o '[0-9]\+' data.txt | split -l 100
218 :
202:2015/01/11(日) 18:59:23.53
>>203-217 ありがとうございます。本当に助かりました。
勉強不足を痛感。向上心を刺激されました。
$SEARCH に入れても awkが動いてくれません
{}が引っかかってしまったのだろうか? どうすればよいのだろうか?
while true
do read SEARCH
awk 'BEGIN{RF="---"}/${SEARCH}/' $save_to
done
シングルクォートで囲まれてるから置換されないのよ
>>220 多少書き換えてみました
しかし、まだ動きません
clp.sh
do read SEARCH
export SEARCH
awk -f ~/sbin/h_Searher.awk $save_to
done
~/sbin/h_Searher.awk
BEGIN{RF="---"}/$SEARCH/
perlで書いてしまった
たった1行のためにつまずくとは悔しい
do
perl ~/Perl_instance/clp.pl
done
~/Perl_instance/clp.pl
open FH, '<', '$save_toと同じファイル';
my @LOG = <FH>;
close FH;
my $sentence = join ' ', @LOG;
my @field = split /---/, $sentence;
# my $search = "Ano";
chomp(my $search = <STDIN>);
for my $lines (@field) {
if ( $lines =~ m/${search}/ ) {
print "---\n";
print "$lines\n";
}
}
>>219 awk 'BEGIN{RF="---"}/'${SEARCH}'/' $save_to
そして、$SEARCHにインジェクションされましたとさ。
GNU awk ならこんなのも
awk -v SEARCH="$SEARCH" 'BEGIN{RF="---"}/SEARCH/' $save_to
その雑誌の半分はシェルスクリプト関係ない内容だから相当ネタがないんだろなって思った
ツールドフランスの実況が森の景色の解説になってるようなもんか
230 :
名無しさん@お腹いっぱい。:2015/01/22(木) 16:29:19.37
コマンドラインから手入力するとちゃんと動くスクリプトが、cronからだと動かない。
数日悩んだ結果。。。原因はLANGだった
ルンゲの罠
>>230 まれによくある。
スクリプトの先頭付近でLANGを設定しちゃうことも多いんだけど、Unix的でクールな
ポータビリティのある手法を紹介してくれる偉い人が出てくるのを正座して待ちたい。
LANG=C
偉い人が
共通したものは crontab 先頭で、タスク毎のは env NAME=VALUE COMMAND
と答えるか、もうまるっきり答えないと予想した
共通したものは crontab 先頭で、タスク毎のは env NAME=VALUE COMMAND
偉い人のコピペ北ー!
自演っぽくて、コメントしづらい輪
この話はここで終わりって暗に言ってるんだろう
LANG=C sl
的な書き方ってどこまで有効なのかな?
bashだけ?
配列の命名規則ってある?
ない
242 :
240:2015/01/25(日) 04:39:03.74
みんなはどうしてる?
しっくりくる表記法がないんだけど
しっくりこない表記がワカラナイ
配列は邪教
使わないので規則などない
配列って変数名に連番を入れたりして使うことかと思ってたw
>>244,245
じゃあ代わりにどうすればよいのだ?
まさかコピペ?
ポインタとか言い出すと見た
あほらし
> じゃあ代わりにどうすればよいのだ?
> ポインタとか言い出すと見た
いかにも、めんどくさそう
会話するネタがないんだなぁ……
じゃあおれからネタ
xargsコマンドが好き。無理だと思ってた処理がワンライナーになる
いっそ、powershellみたいにjsonパイプラインみたいなのがあればいいのにって思う
俺がよく使うのはfind ... | xargs grep だったかな
他どんな場面で使うっけ
\ls -1t *.* |head -3|xargs head
254 :
名無しさん@お腹いっぱい。:2015/01/26(月) 12:06:00.33
>>235 *.*の3行が、headへの標準入力じゃなくて、引数として与えられるのか。
おもしろいなあ。
xargs で何か面白い事は無いかと、あれこれ考えた結果
ループになる
xargs loop で検索したら結構見つかるので
珍しくは無いんだろうが、まあ、一応
<<EOF xargs -I i sh -c 'seq 3 | xargs -I j echo i j'
foo bar
baz qux quux
corge
grault
EOF
xargs は並列処理でもよく使うかな
例えば find ... | xargs -P 12 -n 16 gzip とすると12プロセスがファイルの圧縮を行う
\nをファイル名に仕込まれて爆死する
find ... -print0 | xargs ... -0 ... ってしとけばええやん…
\0をファイル名に仕込まれて(ry
仕込めるんだっけ?
find ‥ -print0 を知らん奴もいるんだな w
>>260 API だと思い付かない
ディスクを直接バイナリ編集すれば可能かも
solarisにはまだない
大抵は
-exec {} +
で用が足りる
>>262 カーネル内でもファイル名は0終端で扱ってるから無理だね
実際のサイズと異なる事でカーネルクラッシュなどまずいことが発生する可能性は
あるけど、それは普通にカーネル内バグ
>>268 半分冗談だよ、いちいち気にしてたら禿げるぞ
冗談に見えないし、
冗談だとしても面白くないよ
大抵は
-exec \{\} +
とエスケープなりクォートで囲むなりするのを忘れる
{}をquoteしなきゃならないカタワ専用シェルって何?
-execはなんか怖いんだよなぁ
理由はないんだけど
>>272 シ
タッ・・(Φ Φ+)・・・ 恐らく Perl です
続
>>274 シ
タッ・・(Φ Φ+)・・・ 例えば、基礎公文で…
while (test) {
open test-file.txt(filehandle) ,
">test-file.pl"
print test-file.txt
close test-file.txt
}
斯様な様にですか…
276 :
名無しさん@お腹いっぱい。:2015/01/28(水) 00:14:24.97
>>271 で、{}をクォートする必要があるシェルって何?
277 :
名無しさん@お腹いっぱい。:2015/01/30(金) 19:56:12.76
wait入れるsleepだが、引数が整数だけだろと思ってたら、整数じ
ゃなくてもいいというので、0.1入れてやってみたら、ほんとに動
作してるっぽい。manには何も書いておらん。つかえねーman
うちのsleepはGNUだけど man sleep すると info 見ろって書いてあって、info 見たら:
Historical implementations of `sleep' have required that NUMBER be
an integer, and only accepted a single argument without a suffix.
However, GNU `sleep' accepts arbitrary floating point numbers (using a
period before any fractional digits).
279 :
名無しさん@お腹いっぱい。:2015/01/30(金) 21:57:35.82
>>273 客先環境での操作なんかだとおおいにある
xargsなら、-pとか-tがあるので安心
>>280 同意が得られて異端じゃないと安心出来た
尚就職してから今まで客先環境でしか働いたことがない模様
こうじゃなくて
v=${v:-default}
こうでしょ
: ${w:=default}
っていうの有りますか?皆さんの、そういうの教えて下さい
こうじゃなくて
echo -e 'hoge\nfuga'
こうでしょ
printf 'hoge\nfuga\n'
俺はecho派
285 :
名無しさん@お腹いっぱい。:2015/02/01(日) 07:05:52.05
公文い公文
echo は -e が必要だったり不要だったりモノによってバラバラなんで printf だなぁ。
OSX の /bin/sh は bash だけど、同じ bash のはずなのに
bash -c "echo -e 'hoge\nfuga'" と sh -c "echo -e 'hoge\nfuga'" で
結果が違うとかめんどくさすぎる。
似た様なのだけど、
こうじゃなくて
function f () {
echo hoge hoge
}
こうでしょ
f () {
echo hoge hoge
}
個人的には上なんだけど
最近やってるのがjavascriptだからかな
変数は大文字か小文字か。
個人的には環境変数と区別するために小文字なんだけど、
社内の他の人が書いたのを見ると大文字ばっかりなんだよな。
いつexportしても問題が出ないような命名規則なら問題無しw
291 :
名無しさん@お腹いっぱい。:2015/02/02(月) 21:56:58.79
質問です。
linux mint 17.1 でコマンドの練習してるのですが、
% ls -l
だと色々ずらーっと出るんですけど、本に書いてあるとおり、
ソートコマンドを練習しようとして
% ls -l | sort +4
と打ち込んでファイルサイズで降順ソートしたかったのですが
sort: cannot read: +4: そのようなファイルやディレクトリはありません
と出てしまいます。
bashですが、シェルの種類によってはこのオプション使えないんでしょうか。
-r等は正常に動作します。
sort -k4
sort -k4r
293 :
名無しさん@お腹いっぱい。:2015/02/02(月) 22:34:00.27
で、できました!有り難うございます!
Linux だったら ls コマンドは GNU coreutils の ls だろうから、
$ ls -l --sort=size
or
$ ls -lS
でええじゃまいか
>>297 おお、infoの日本語訳できたんだ
man on WWWのように検索できるとさらにいいね
よく使うワンライナーなどはどうやって呼び出すものなんですか?
何か簡単に管理する方法がありませんかね?
zshならzawから
vimのUnite historyの様なgrep効くから、それで呼ぶか
編集して完成させる
>>300 anything.elみたいなヒストリーサーチみたいですね。
bashなのでどうしたものか。
自分で書いたスクリプトはいつでも、一見、間違いのないように見えるw
まったくだ(´・ω・`)
ぼくの書いたスクリプトが動かないなんてけしからん(´・ω・`)
シェルの方を治したまえ
ping -c 1 ... にするべきじゃないの?
pingのコマンドオプションって統一されてないよなぁ
わざわざpingするのがわからん
pingしなくても wget -T でタイムアウトできるしな
俺んところの現場でも、ssh する前に ping するスクリプトを書いてる人がいたな。
これって、どこかに由来する文化なのかな?
(cronを「くーろん」と呼ぶみたいな?いや、これは違うかな……)
>>306 サンキュー
windowsのsystem32/ping.exeが呼ばれてた
そりゃ移植性がないわけだ
>>307-308 コードありがとう
>>310 -Tオプションなんてあったのか
>>309 pingで鯖落ちてないか検査した後w3mで複数のURLから取ってきて
スレの上下の不要な広告など取り除いてから git commit して
その差分見るから
全部安全に通信できるか見てからやらないと、差分の時にちょっと問題になる
通信できなかったスレがマイナス差分で大量表示されたり、
次回は大量追加されたり
git reset hard HEAD~ するぐらいならあらかじめ通信検査してからやろうと思った
>>310 それもあるし、どれかひとつでもエラーでping_error=1だからサーバの状態を確認してる感じがしない
もうひとつバグってた。こうしないと常に0で終了しちゃう。
echo ... | {
while read ... do
...
done
exit $err
}
>>312 > -Tオプションなんてあったのか
通信系のコマンドで、タイムアウトが指定できないものはスクリプトからは利用しないとか、
そういうことは考えないで作っちゃうタイプの方ですか?
ちなみに、大抵の通信系コマンドはタイムアウトが指定できるような気がする。
Windows 7 からだっけか? デフォルト設定では ICMP echo をフィルタリングしてるのって
>>302 >
>>299 > aliasじゃないの?
長いワンライナーは場面ごとに手直しする必要のあることが多いから、
それだと融通がきかないことがありませんか?
2chのスレが更新されてるかどうか(新しいレスがあるかどうか)チェックするのは自分もやってる
いろいろやり方はあるだろうけど、自分の場合は
libwww-perl(debian系)に入ってるHEADコマンドで.datファイルのLast-Modifiedフィールドみたいなのを見てる
>>316 XP じゃね?
毎回設定してたような気がする
2K は忘れた
>>311 ダイヤルアップとかで最初の接続に時間がかかるから ping でネットワーク接続してから、おもむろに目的のアプリケーションで接続するって言うのがあったような気がする
スクリプト化してると問題があったとききりわけが必要だから
ping打っているかどうか確認してるんじゃ?
>>321 ちょっと違うけど自動切断有効にしてて切れてほしくないときに
ping打ちっぱなしにしてたな
皆、同じようなことやってるんだなw
>>322 切り分けといっても、pingが成功したらネットワーク的に問題ないとは言えないわけで……
対話環境で作業している時だったら、お手軽だから「まずping打ってみるか」というのは
分かる気がするけど、スクリプトの場合では中途半端なように思えます。
「ICMPは通るね」というのをスクリプト中から確認できても、それほど嬉しくはないよね?
そういえばhttps対応とかが面倒で結局wget丸投げ取り込みとかに逃げてたりするけど
正しい汚染チェックってどうするべきなんだろう?
>>325 ネットワークよりむしろ、ローカル的な問題がない事が確認できるんじゃないかな?
>>321 なるほど。
自分ではそういう環境でスクリプトを走らせたこと無いけど、必要性は理解できる気がする。
でも今どきそんな環境あんまりないよなぁ
>>328 ネットワークの問題:待つ
ローカルの問題:別の方法を試す
自力で何とかなる問題とならない問題を切り分ける。
pingで切り分けになるか?
F5アタック状態でいいならどうでもいいかもしれないな。
pingはじくところもあるから
URL次第
>>311 ベテランなら、サーバ自体死んでるか、sshdが動いてない(かfirewall等)
の切り分けを考慮してるんだろう。実際に使うスクリプトとしては正しい
>>338 差分なんて git 以外にも diff や vimdiff 等あるからやってみたら?
いやレンジ指定じゃないかと?
>>299 alias も出たから、ついでに...
自分は ${HOME}/bin に、スクリプトとして書いているが、場所はどこでもいいから
どこかにまとめて保存しておけばいいのでは?例えば、~/bin/oneliner/ 等
それらのファイルは、grep で検索も出来るし、それで見つかった script を編集するなら
history -r script で履歴に読み込んで、コマンドライン上で編集が出来る
(あと、あんまり使わないけど) bash zsh で、Ctrl-x Ctrl-e で editor を呼び出して
読み込んで実行とか
>>341 > (あと、あんまり使わないけど) bash zsh で、Ctrl-x Ctrl-e で editor を呼び出して
> 読み込んで実行とか
Ctrl+rでヒストリ検索でいいんじゃない?
history -r script を bash の話と断って無かった。失礼しました
>>342 スクリプトファイルから履歴に読み込むと、行毎に履歴の最後に追加されるから
previous-history Ctrl-p (もしくは↑)で十分だけどね
^string1^string2^
!n:gs/string1/string2/
!-n
等 bash で履歴を利用するものは shopt -s histverify すれば確認・編集が出来て便利だよね
スレ違いスマソ
どうなっちゃうの、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/
スレ違いだとわかってるならよそでやれ
スレ的にはxdotoolとかでブラウザ操作すれば問題ないのではないだろうか?
質問です。
あるテキストの中に含まれる、特定のキャラクタの数を数え
たいのですが、すごく簡単にできそうで、わからなくて
悩んでおります。grepでもwcでもできそうで、できません。
ご教授お願いします。
>>350 全キャラクタの後ろに改行を入れて、grep 'キャラクタ' | wc -lで数えられる
改行を入れるのはOSによって面倒だったりするが。。。
>>350 キャラクタ A を数える場合、
tr -dc A | wc -c
>>351 すみませんが詳しい方のみ回答をお願いします
wwwww
全キャラの後ろ(要するに1文字ごと)に改行は必要なくて
数えたいワード単位に改行入れて(sed)、grep、wcだね
sedあまり好きじゃないからperlならこう
perl -pe ’s/foo/foo¥n/g’ file | grep foo | wc -l
スクリプトにしてfooを引数にすりゃ汎用的に使える
堂々とbashを使うお(´・ω・`)
>>352で答は出てるけど、どーしても grep を使いたいなら
grep -o foo | wc -l
351とか353とか無駄すぎ。
353は1行に1回しかマッチしないことが保証できるので grep | wc ではなく、grep -c でよい。
2chMateで質問を見て、これはこのスレで学んだgrep -oを披露するしかないと
意気込んで帰宅してスレ開いたら
>>355に書かれていたでござる
>>355 "A" が抜けてるんじゃ?
$ grep -o A foo | wc -l
せやな
せやろか
>>350 ネタ的な解答です
echo $(( $( sed -e 's/[^で]//g; s/で/ + 1/g' data ) ))
>>357 >>353ではfooが検索キーワードになっていることを受けてなんじゃね
ファイル名なりパイプ入力は実際に実行するには必要だが
言いたいことに焦点を当てるためと解釈すればおk
昔はWindowsが好きでUnixは嫌いだったが、最近、シェルプログラミングの真髄、Unixの真髄が
身に染みてきた。VBSを仕事でやってるが、何せ長い。シェルスクリプトだと数十行で済むようなことが
何千行とかになってしまう。
Unixのコマンド自体がワンライナーで済んでしまうことも多いが、
シェルスクリプトや正規表現、Unixのアプリを組み合わせて20行、30行もかけば
かなりの処理ができるな。
ただし、VBSのすごいところは、GUIまでわりと自由に操作できることだな。
UnixもWindowsもそれなりに何かすばらしさを感じる。
文字ではなく単語単位だと
マッチ部分が重複するケースもあると思うけど
そういう時はどう書けばいいんだろ
$ echo ABC | grep -Po '..'
AB
$ echo ABC | grep -Po '.(?=.)'
A
B
$ echo ABC | ?
AB
BC
が欲しい
真髄ねー
>>355 お前は4時間以上かけてそんな回答しかできないのか
20時間以上かけた回答に期待
str='
>>350 ネタ2です。
ところで、あるテキストや特定のキャラクタは utf-8 であると考える必要性は有りや無しや。
神に問う。信頼は罪なりや。 果たして、無垢の信頼心は、罪の源泉なりや。'
echo "$str" | grep -o . | LC_COLLATE=C sort | uniq -c
echo "$str" | perl -0777 -ne 'print s/。//g,"\n"'
>>365 楽しそうだね。でも、GUIの操作をすべてコマンドからやりたいよ。
オブジェクトでも作る?
xteじゃダメ? ドラッグの仕方はよくわからんが。
明日以降は、ここを見る回数も減るかもしれない。みなさん一応さようなら
ネタは不評だったけど、最後かもしれないし
>>363 にも答えておこう。
perl と ruby で
#!/bin/sh
echo '商工会議所長' |
perl -ne 'while( /(?=(会議所|所長))/g ){ print $1, "\n"; }'
echo '商工会議所長' |
ruby -Ku -ne 'puts $_.scan( /(?=(会議所|所長))/ ).join( "\n" )'
>>348で落としてdat変換位、スクリプトで出来ないかな?
374 :
名無しさん@お腹いっぱい。:2015/03/03(火) 08:07:50.39
>>371って問題がわかってないよな
「aaaaaaaaaa」に対して「aa」が
どうマッチするかってことなんだけど
なんで会議所と所長になっちゃうんだろうかw
脳味噌足りてなさそう
375 :
名無しさん@お腹いっぱい。:2015/03/03(火) 17:30:06.70
$ echo 'ABC' | perl -ne 'while( /(?=(AB|BC))/g ){ print $1, "\n"; }'
AB
BC
じゃまずいのかな。
376 :
371:2015/03/04(水) 06:55:50.72
>>375 >>374 に対しての発言の様にも取れるけど、
>>371 に対しての発言ならば...
それも試した上で、書いてる
無反応だったけど
>>368 で utf-8 である事を考えていないものが有る事を指摘したので
引き続き、
>>363 のお題
> 単語単位だとマッチ部分が重複するケース
に沿って、日本語に入れ替えただけ
>>363は任意のテキストに使える記述を期待してるんじゃないだろうか
所長と会議所限定じゃなく
378 :
363:2015/03/04(水) 22:12:28.21
>>377 いや…
スレタイ的にLL言語に頼らないやり方を期待してた
スレとあんま関係ないんだけど、
みんなどんな時も/bin/sh縛りなの(´・ω・`)?
それとも割と躊躇なく、bashとかzsh使うの(´・ω・`)?
使う人はどういう線引きで/bin/shと高機能シェルを使い分けてるの(´・ω・`)?
スレと関係ないからよそでやってくれる?
381 :
371:2015/03/06(金) 06:31:41.84
>>353 でも perl は使われているのだが、ワンライナーも許されませんか
wikipedia で 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
}
'
bash でも
#!/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
使用例
$ echo 'abc' | ./testsed 'ab\|bc'
ab
bc
$ echo 'abc' | ./testbash 'a.|b.'
ab
bc
384 :
371:2015/03/06(金) 07:34:31.86
訂正
全般的に変数代入の箇所のクォート
var="var"
と
#!/bin/bash
re1="${1:-会議所|所長} "
読む気もおきないです本当にありがとうございました
371って問題が理解できてない残念な子だな
>>379 個人用とか、そのマシンに特化したスクリプトならbashだろうがzshだろうが何でもアリだけど
普段から/bin/sh縛りにしておくと、違うマシンでもスクリプトが書けるようになるぞ
と思うだろ。
でも実際は変な癖がそれぞれついてるんで、あまり役に立たない。
bash拡張を使うなら#!/bin/bash
>>389 bashが/bin/にない環境もあるで
/bin/tcsh縛りで書いてるw
busyboxのsh縛りが実用的。
#!/sbin/busybox sh
と書くこと。
>>391 害悪。
君個人しか絶対使わないマシン以外は触らないで。
前スレ119です。その節はお世話になりました。
さて、プレーンテキスト中の
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
に置換したいのですがどうすればできますか?
よろしくお願いします。
追加で申し訳ないです。hoge部はhoge1、hoge2、piyo00_piyo01など入り乱れてるのが
同じtree.txt中に混在している状況です。
数字の部分も
01_{01..07} #(実際は7行ある)、
...
04_{01..04} #(これも4行ある)
になっているブロックもあったりしてかなりヤヤコシイのですが、
[(連番になっている数字)以外のところが同じ行]を検出して数字を{}でまとめたい感じです。
3000行あって手作業は泣きそうなので、エレガントな方法をご教授いただければ幸いです。
{01..04}_{01..07}とする必要は無いです。
よろしくお願いします。
そういうのはシェルで書きたくないな
とりあえずソートしようぜ
perlでもrubyでもpythonでも好きなのでいいよ
>>394,395
ご自分が言っているように、まず
>[(連番になっている数字)以外のところが同じ行]を検出して
これをする。たとえば次のように
sed -e 's/_[0-9][0-9]_/_%%_/' tree.txt | sort | uniq
これで「連番になっている数字以外のところが同じ行」をパターン化できる
そしたら、そのそれぞれのパターンで grep tree.txt して、sort -n し、
head -n 1 と tail -n 1 で連番の最初と最後の値を切り出す
こんな感じで行けないかな
なんのアイデアもなくすまんが、連番かどうか見るのがめんどくさそうですね
すまん
問題が全然理解出来ない
誰か問題を解説してくれ
もともとは韓国領だったが、
日本の植民地支配から、
日本が勝手に領有権を主張しだした。
現在は国際的にも韓国領と認識されている。
北朝鮮のことか。
理解できないなら無理に答えようとしなくていい
独島は韓国領だよ。
やつらの主張の誤りは、独島=竹島だと言張ってるところ。
独島は竹島だとは別の島だよ。
石島とか言ってたソビエトみたいな島の事?
>>402 Bashのブレース展開の逆がやりたいってことかと