シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その22
http://peace.2ch.net/test/read.cgi/unix/1383260330/
すみませんがシェルに詳しい方のみ回答をお願いします
3 :
名無しさん@お腹いっぱい。:2014/07/01(火) 18:10:58.47
・シェルスクリプトのことをシェルってゆーな
シャロスクリプトまだー?
その22 をそのままコピペしましたが
その16にあったもの
□関連スレ:
□初心者向けリンク:
□入門者向け書籍:
□参考リンク:
□最近のシェルスクリプト本:
□関連書籍と関連リンク:
□人間初心者へのお願い:
□シェルスクリプトでよく使うコマンド:
です。
今、追加案あればどうぞ
>>1 > 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
便利なものはどんどん使う方が頭いいと思うがなぁ。
このスレは純正シェル道の求道者達が集う道場スレです。
うかつに部外者が踏み込むとケガをする場合があるのでご注意ください。
知らんがな
昨今の*nixなら某かの方法でbashは入手できるよね
純性UNIXはkshを愛してるみたいだけど時代の要請を理解してる
別にbash限定のシェルスクリプト書いていけないわけではない
恥ずかしながらbashでしか動きません、と注釈付けてあれば
文句いう人は少ない
なら1行目で最初から解決してるんだね。よかったよかった
bashをログインシェルにしてる奴の作ったプログラムは全部GPLが感染するよ。
さあー、盛り上がってきたよ!
じゃんじゃん自分の意見を書いていこう!
ポータブル派保守系、時代はbash派革新系
シェルスクリプトに無理にこだわらない現実派
テンプレの募集もしていますよ
その17、その18で消えたようだから、その16、その17を元に話しましょう
16 :
名無しさん@お腹いっぱい。:2014/07/01(火) 22:20:53.98
ややこしい操作するなら安易にperlでやる派
>>11 組み込みとかメモリが足りなかったら入れられないんじゃないかな。
PCでも何千とか起動すると重そう。
そういう特殊な環境の話はしてないっしょ。
>>7 誰もメンテできなくなったVBやCOBOLやExcelの
資産()を見てもそう思えるんなら、才能ないから
コンピュータから手を引いたほうがいい。
bash を使うなとは言わんけど、bash でしか動かんものは
#! 行でそうと宣言しておいてほしい。
つーか、#!/bin/sh と書かれていたら
bash の独自拡張はぜんぶエラーにしてほしいんだが。
man によると sh という名前で起動されると POSIX 互換モードになるらしいけど、
あいかわらず bash 拡張がふつーに使えて違いがさっぱりわからん。
21 :
名無しさん@お腹いっぱい。:2014/07/02(水) 00:59:50.16
trapとセットでよく使うmktempとか結構システムによって挙動ちがうけど、純粋シェル道的にはどうやって実装するの?
>>20 bash で #!/bin/sh と書いたら、プロセス置換 <(command) とかが使えなくなるという違いはある。
>>20 Bourne Shellを自分で入れるのが一番良いかもね
>>20 例えばLinuxのDebian系ディストリだと
そのために拡張控えめな dash (Debian版ash) があったりするね
同じbashでも、#!/bin/shと書いて起動するとその動作モードが変わるという話をしてるんだけどね。
zshでも動作は変わる。が、ash(dash)は#!/bin/shと書いても#!/bin/ashと書いても何も変わらない。
>>20>>26 たぶんPOSIX準拠でエラーのないスクリプトが正常動作する程度の機能なんだろう。
最低限それやっとかないとPOSIX準拠のシェルとして採用してもらえなくなるから。
厳密にPOSIX準拠で拡張ゼロのシェルを内部に別途実装するとか無駄だから、
そういう要望はBourne Shell入れてそっちでやってくれってスタンスなんじゃね?
今後新しいシェルが出てきて乗り換えた時に、書き溜めたスクリプトが動くと嬉しいので、互換性指摘は嬉しい。
ただ、その時々によって必要性が違うので無視するかも。
つまり、互換性指摘はWarningということだ。
シェルスクリプトってインタプリタ言語だしWarning出さずにError出すイメージ
何その勝手なイメージは
お前の勝手なイメージを押し付けるな!
× イメージ
○ イミッジ
これを間違えると日本人と思われて馬鹿にされるので気を付けるようにw
× アイディア
○ アイデア
日本人ってだけでバカにするのはアレな国の人だけだと思う
>>35 使ってみたことあるけどBourne shとの互換性チェックには全然ならないよ。
ポータブルなスクリプトがデフォなのは賛成だが、
デフォが Bourne shell ( 商用 UNIX 等で生き残っている
Traditional Bourne shell と解釈しています ) とするのは反対
前から思っていましたが、多くの環境でわざわざインストールしないと使えない
Bourne shell にこだわる必要性は、少ないと思う
皆さんが、ポータブル性は POSIX 相当でも OK なら、こんな風にしたい
□お約束
・特記なき場合は #!/bin/sh がデフォルトです。この場合、ポータビリティーに注意し
Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
bash/zsh/ksh/ash/dash などに依存する場合は明示しましょう。
その辺はスレ立てる人が勝手に決めてるだけだから
次スレ自分で立てればいいよ。
今回立てた時に、やはり了承を得てからと思って、コピペにしました
本当は、
>>7 の言うことも納得で、
> □回答者への注意事項:
も消したかった
>>1 です
暇を見て、話題の途切れたときにでもテンプレ案出してみます
連投失礼します。テンプレ案考えてみました。かなり手を入れました
どんどん指摘して下さい
ただし、こんな風にしろとかだけでは無く、具体的に修正したものを付けて下さい
指摘された事に、別の方の反論が無ければ、そのまま機械的に取り込みます
考慮が足りなかった場合は、後で条件を追加・変更する事も有ります
変更点
1. "
>>1 A.3 を見てね" と簡単に指摘出来る様に、番号をふりました
2. 日本語とアルファベットとの間に半角スペースを入れました。/ ( ) 前後にも
3. お約束の項目でお約束で無い、前提知識等をお約束の補足に移動しました
4. 初心者でも参加しやすい様に、工夫しました
( 特にポータブル志向がハードルを上げ、参加をさまたげ無い様に )
5. Bourne Shell ポータビリティー POSIX について、説明を加えました
6. MacOSX について触れていないのが気になったので、書き加えましたが、
/bin/sh と /bin/bash でバイナリーサイズ、inode が違うらしいです
詳しい方、ぜひ修正をお願いします
https://discussions.apple.com/message/18600748 7. 過去ログから、テンプレートを復活させてみました。所々変えてます。
8. Wiki でなくこのスレで、気軽にテンプレ修正議論が出来る様に、してみました。
シェルスクリプトの総合スレです。
初心者、学生、アマチュア、プロ、シェルの種類や 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
□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
参考リンクはともかく、学習用文書はいらなくないか?
あまりテンプレ充実しすぎてても考え物な気がする
今までが1レスだったから特に
しかしポータビリティって単語好きだね
51 :
名無しさん@お腹いっぱい。:2014/07/05(土) 23:12:47.63
可搬性
POSIXのPはポータブルのP。
53 :
1:2014/07/06(日) 06:20:22.54
連投規制中です。しばらく待ちましたが、いっこうに書き込めません
代行さんに書き込んでもらっています
続きは明日以降で。参考リンクが、まだ続いて、他に
前スレ、関連スレ、テンプレートの変更案
が有ります。これ以上長いと、問題有そうですが
とりあえず、あげてみます
テンプレ貼るのに連投規制食らうようなものはいかんだろう。
つーか、今テンプレ決めて次スレ立つの何年後だよwww
前スレは1年かからなかった。
□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 あ、張り切って〜、どうぞ〜! 案じゃ無くてつぶやきでも、どうぞ〜!
portability の訳語についてです。移植性、汎用性、可搬性と訳されているようです
ポータビリティーはそのままじゃあ通じないのかなあ?しっくりくる言葉のご意見下さい
O'Reilly Japan - 詳解 シェルスクリプトでは、移植性 としています
原著 Classic Shell Scripting Shell Portability Issues and Extensions
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
汎用性としています。原著は未確認
可搬性は、O'Reilly Japan - 入門 bash や、bashクックブックで使われています
スクリプトではないですが、Small is beautiful. ではじまる、UNIX 哲学とかでは
本や、ネットを見ると Choose portability over efficiency. で移植性や、移植しやすさ
あと、F.1.a autoconf マニュアル は、移植性のあるシェルプログラム です
次に、連投規制についてですが、もしかして誤解されていたら残念なので一応
前置き、1 候補の A. B を分割して書き込んだ事、E を 2 回書いた事で、
3 レス分は余計に書いていますので、一応ほぼ全てを一度に書き込めはします
書けない 2 レス分+αは、スレ消化前に少し早めに立てて、分けて書き込むとかで
無理ではないかと思います
ただ、今までが 1 のみだったので、
>>50 ももっともです。どんどん書き変えて下さい
わりと
どうでもいいよね〜 ね〜♪
_ ‐..::  ̄ ̄ ::::... 、
. ィ r'::/ ::ィ:::::::::::j:::::::ヽ::::\
,._.._ .......、._ _ /:/l! | ::|::/ |::::::::∧:::レ::l:::| :::::rヘ
ヽ :~""''.>゙' "~ ,、、''‐'、| l ::仏_ノヘ:/ ー- ハ:::!::::::|::::i
゙、'、::::::ノ:::::::_,.-=. _〜:、 /::::リy=ミ ' ィ=ミ /:::::!::::/:::::!
``、/:::::::::__....,._ `゙'Y' _.ェ-、..._ |::::{xx xx/::::::「)'|:::::::|
,.--l‐''"~..-_'.x-='"゙ー 、`'-、 lハ:仆 ..._ヽフ /:::: /´ |:::::::|
" .!-'",/ `'-‐'') /\ ` Y::::ソ勺 7イV_ !:::::::!
.-''~ >'゙:: ‐'"゙./ ヽ. __ |::/ 爻___ん'´ッ'⌒ヽ! :::::!
//::::: ', (__,、\/ /‐―一弋{、 /  ̄_)
' /::::: .:'; \ ' { :::\ /~::!
どうでもよくない
めっちゃ頑張ってるのは評価するが需要にあってるかどうか微妙
レスを見ても長すぎるテンプレを褒める書き込みはない
その16でどんな議論があったのかは知らんが、今の提案は全部長文すぎて読む気が起きん
Small is beautifulなんだろう?
―┼‐ ノ / | --ヒ_/ / \ヽヽ ー―''7
`」 ┼, 二Z二 レ / /´レ' \ ―7 ̄} | ー-、 /
(__ (|フ) (__ノ _ノ ∨` ノ / / _ノ \_
─┼- / | ‐┼- | ー|―
─┼─ | \ レ /  ̄Tー / ノ -─
(二フヽ \/ _ノ (二フ\ ヽ_ノ / 、__
i';i
/__Y
||真|| /⌒彡
_ ||露|| /⌒\ /冫、 ) ・・・・・・。
\ || || ̄ ̄ ̄ ̄ ̄ ̄ ̄\ `./⌒ i ` /ゝ _,,..,,,,_
||\`~~´ (十万石) \( > ('\\ ./ ,' 3 `ヽーっ ・・・・・・。
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄\`つ ⌒ _) l ⊃ ⌒_つ
.|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| `'ー---‐
( 'A) ・・・。 〃∩ ∧_∧ <⌒/ヽ___
/(ヘ)ヘ ⊂⌒( ・ω・) ・・・。 <_/____/ zzzz・・・
`ヽ_っ⌒/⌒c
テンプレはどっかのwikiに置いてよ。
>>64 勝手に進めてま〜す♪
>>66 "Small is beautifulなんだろう?" は必要ですか?皮肉っぽく不快です
読む気が起きないなら、どこを削除するか具体的にお願いしますとは言えないので、
ごっそり削除した案を上げておきます
長くなった部分は、1.過去ログの内容も多く、他に 2.移植性、3.POSIX、
4.Bourne Shell、5.関連スレや、6.テンプレ変更案を促す内容を追加しましたが、
ほぼ削除しました
>>49 で UNIX FAQ を上げてもらっているので、何らかの参考リンクは
有ってもいいのでしょうが、取捨選択、別途追加は皆さんにお任せします
>>68 >>69 せっかくの提案ですが、今後とも wiki でなくこのスレで進めた方が
良いと考えているので、少なくとも私は作りません。申し訳ない
テンプレなんてドーデモエー
テンプレ検討だけでスレ埋めるなよ
シェルスクリプトの話しろよ
74 :
名無しさん@お腹いっぱい。:2014/07/07(月) 09:01:44.79
ポータビリティーがそのままじゃ通じないとか言ってんじゃねえんだよ
ただ読み方カタカナ表記しただけの長々しいカタカナが君には見やすいのか
俺はそう思わないしカタカナ列挙した糞翻訳は読みづらいし頭に入ってこない
極論すれば英語のままの方がマシだ
で、
できるだけ環境問わずそのまま使えるようにするのは
可搬性の向上なんだよ
移植性だと書き換え前提でその書き換えをしやすくする感じが強くなる
汎用性は可搬性みたいなことよりも*目的*を限定しない感じになる
/.:::.::.::.::.:: ト\ /∧:.::.::.::|:.::.:: |:.::.::.:.::.::.:.::.::.:.\
.: ::.::.::.::.::. |-‐''"´│:.::.::.|:.::.::.jヽ ::.:.::.:.::.::. |::.:.::.:.
.: ::.::.::.::.: l:| |:j.::._∧::.:/ ハ.::.::. }::.::.:|^';.::.::'.
.: ::.::.::.::.: |:!=-、 ノ:'!.::;仁∨ j:ハ.:: ;'::.::.::|ノ} :.::.'、 ふ〜ん …で?
.::.::.|.::.::.::.|:ヽ ∨ '弌示圷 j/.:: /.::| '.::.::.::.:ヽ
.:|.: |.::.::.::.'ャ弌示 ゝ.:ソ /.::./ :.::|/.::.::.::.::.::.::\
.::!八.::.::.::ヘ ゝ.:ソ  ̄´厶:イ :.::.:|、.::.::.::.::.::.::.::.:\
、ヽ.:\.::.::.:.. ` , |:i.::.::.::| \.::.::.::.::.::.::.::.:. \
.丶.:\:|>‐ヘ | .::.::.::| 丶、 _;rz: -‐ ⌒丶、
\:〈 ^トーゝ_ --、 1 :.::.::.| // \
|ヽ´ ⌒>‐ 、 、<. │.::.::. ! // 丶、
|.:: \ `く. Y:| \|.::.::.::.| |:l \
|.::.::.::.`7ーr:、 ,ノ::lヽ _|.::.::.: | / j:j \
|.::.::.:: / |:/ / |::{ |.::.::.: |´ ̄ /:/ 、__ \
|.::.::.:/ / / .l八 │:.::.: | |::| '⌒丶、
割りと胴で萌ぇ
テンプレは自分で勝手に決めていいよ。
いちいち誰にでもわかりやすいようにする必要はない。
ポータビリティで通じるし、通じないならそいつがタコなだけ。
シェルスクリプト書くような奴は、単語の意味を自分で調べるくらいできる。
ここは幼稚園か? 違うだろ? 出来ない奴は相手にしなければいいだけ。
目の前にすぐ調べられる魔法の箱があるのに活用できない奴は、もはや現代では馬鹿の謗りを免れえない。
bashって$RANDOMが定義済みなんだな。
自分で範囲を決めて作ったランダムを$RANDOMに突っ込んで、
呼び出したときの値の範囲がおかしいから、???ってなったわ。
頭にBASH_つけるとかして欲しかったな。
>>79 それは bash独自じゃなく、zshでも kshでも同じだよ。
RANDOMを普通変数として使いたいなら、
先に unset RANDOM してから RANDOM=1234 とか自分で代入すれば値は変化しない。
zshだとunsetしても普通の変数にはなってくれないよ
純正シェルで使って良いシェル変数は$aから$mの13個だけだと言ってるだろうが。
いま純正シェルの話じゃないから。
ファイルがたくさんあって、それら全部に対して
・手っ取り早く文字コードを調べるのにfileコマンドを使う (file *)
・正確に出したい時にiconvコマンドを使う (iconv -f code < filename)
という事をやってたんだが、手っ取り早く正確に文字コードを調べる方法って何かないかな?
むしろ皆のやり方を知りたい
前スレ
http://peace.2ch.net/test/read.cgi/unix/1383260330/990 のつり餌
> bourneシェルの中でもV1-V6はコマンドラインインタプリタとしての...
> PWBシェルでも動作可能なことが純正シェル道
V1 - V6 は Bourne shell ではなく、Thompson shell
その22 のスレのデフォルトシェルは Bourne shell であって Mashey shell ( PWB shell ) ではない
よって、前スレ
>>983 を失格というのは間違い
そもそも、Bourne shell の B は大文字で書く
純性シェルじゃないと何が困るの?
$()使うなとか言い出す輩がいる
>>88 $( )を使わないようにすることは、Bourneシェルを基準にすることで達成されるから、
純正シェルまで遡る必要はなくなる。
nkf←古くて時代遅れ
iconv←今風これからの標準
って認識あるんだけどnkfの方が全体的に使いやすいし
機能も豊富だからつい使っちゃうんだよなあ
iconvって文字コードにエラーがあるとファイルの途中で異常終了しちゃうから使いにくい。
>>86 困るとかじゃなく、あれは武道とか精神修練とかそっち系のアレだから。
nkf入ってないんだよなうちの会社の環境…
別環境でnkf -gがめっちゃ使いやすかったからなんで入ってないんだと思ってしまう
客先環境だから仕方ないんだけどさ
>>90 にならってみた
nkf ← 日本語 / 自動判定有り / 入っていない事がある / 素敵
iconv ← 多言語 / 自動判定無し / POSIX / i昆布とか名前が嫌い
>>84 が日本語と限定してないので nkf と思っても、考えてしまった
>>91 iconv -c とか?
>>86 コンパイル時に使用するスクリプトでは、場合により v7 shell でも動く様に書いた方がいい
みたいです
autoconf マニュアル (24 April 2012) を見ると v7 shell や SVR2 がどうのと書いています
# commentsも使うなとか言い出す輩です。: comments とかは何かで使った覚えが有るけど
>>78 でポータビリティで通じない奴はタコだと。確かに
>>74 なるほど、全ての場合についてのコメントが参考になります
コンピュータと電算機の様に、カタカナvs漢字については個人・職業差も有りますが、
>>51 >>74 で可搬性を積極的に押される方がいるし、
>>63 >>78 は特にポータビリティ押しではないので、今のところ可搬性に決まりですか?
テンプレがどうでも良い方は、どうでも良いとして、
>>65 >>73 の意見もあるので、
話題が尽きた時等、スクリプトの話の邪魔にならない程度に、遠慮ぎみに進めたいと思います
特にレスが無ければ、長いという意見と可搬性という意見で、
>>71 を元に可搬性としたものに
なりそうです
iconv -c でも駄目な場合がある。
nkfはそういう場合でもデコード頑張る。
nkfの方が日本語を扱う上で現実的
この程度のテンプレは長いに入らん
スレ立てる人が面倒で無ければテンプレ付ければいいし
面倒なら誰かに任せてもいい
いや長い
まぁどうせ1回読んだらもう読まないし長いから何が困るってこともないんだが
その長いテンプレを議論する為に何レスも長文が続くのはゴメンだわ
ふむ。ちょっとテンプレ短すぎかもしれないね
こ、これは凄いなw
>>102 そのスレのテンプレはこれでもかなり簡略化されたほう
過去ログだと200レスくらいテンプレだったりする2chでは伝説のスレ
>>100 >>104 100レス目にふさわしい書き込みGJ
111レスでもすごいが、以前は200もあったのか!? 個性的なスレだ
>>100 キーボードでスクロールする俺には辛いテンプレだわ…w
このスレって「シェルスクリプト高速開発手法入門」とかUSP MAGAZINEとか読んでる人いるの?
USP MAGAZINE → 定期購読
シェルスクリプト高速開発手法入門 → 買ったけど積ん読状態
高速開発手法って発売前にちょっと噂になって興味あったけど、アマゾンの「なか見!」読んだら一気に冷めたわ
Cとかで書いたプログラムをシェルから実行するだけみたいだし、本書で解説するbashCMSは著者自身は使って無くて、
WordPress使った方が得って著者自身が書いてて、え?じゃあ意味無いじゃんって 完全にネタ本
釣れればいいんですよ釣れれば。
>>108みたいにお金出してくれる人が偉いんです。
ここシェルスクリプトについての愚痴でもいいんすか?
いま、Visual Cで書かれたソースコードを
c shellにマイグレーションするという
とんでもないプロジェクトに今月から投入された
俺に慰めの言葉とアドバイスをくれ
あと質問だが、shellスクリプトとシェルスクリプト、どっちが正しい表記?
>>111 君は多分自分の仕事をきちんと理解してないなw
113 :
名無しさん@お腹いっぱい。:2014/07/12(土) 04:09:54.37
c shellて忌まわしきはcshのcshだよね
gccとかmakeとか、シェル上のコマンドを使ってCプログラムを開発という意味だったりして
シェルterminalに直接ソースを書いてhello worldってできるの?
はじめまして、誘導されて来ました。質問させて下さい。 ubuntu 11.20です。
1 yyyy-mm-dd
...
n yyyy-mm-dd
というテキストから、各行を名前に持つディレクトリを
n個 生成するのはどうしたらできますか?
また、できたディレクトリに、各日に撮影されたデータを
移動するうまいやり方があったら教えて下さい。
ファイル名の頭がyyyy-mm-ddとなっているのと、exif情報があります。
iphoneで撮影してdropboxのcamera uploadsに溜まっている 写真を整理しようと思い、
ls -h
cut -c-11
uniq
を調べながら使って冒頭のテキストを作るところまでできたところです。
「それならそもそもこういうやり方をすればもっと上手い」とかでも構いません。
当方プログラミングはほとんどわかりませんが、以上よろしくおねがいします。
>>119 cat テキスト | xargs mkdir でディレクトリを作れる。
テキストを使わないなら
ls -1 | cut -c -11 | uniq | xargs mkdir
でもいいと思う。
ファイルの移動は、ファイルとディレクトリの 4文字2文字-2文字(日付の部分) が一致することを利用する。
for i in ????-??-?? ; do mv -i "$i"?* "$i"/ ; done
| (パイプ)と xargs と ? と for文 で出来るから、意味を調べていくといいと思う。
>>119 mkdir2種類。
$ cat dates |while read n date;do mkdir $date;done
$ cut -d ' ' -f 2 dates |xargs mkdir
move
$ find . -mindepth 1 -type d -printf "%f\n"|while read d;do find . -type f -name "$d*" -exec mv {} $d \; ;done
>>119 そもそもjhead -nで出来た気がする。
>>122 これで文句ないだろ。
$ jhead -nf%Y-%m%d/%f *.jpeg
-nfのfは重複防止だから、場合によってはない方がいいかも。
124 :
名無しさん@お腹いっぱい。:2014/07/14(月) 23:22:43.26
ログファイル等の検索で、
「ある文字列が最初に出た行以下すべてを表示する」場合、sedコマンド以外で簡単な方法ないでしょうか?
(有った気がするのですが忘れてしまいました)
>>124 grepで-Aをでかくするとか、grepで行番号出させて最初の行番号からtailするとか
>>124 $ awk '/ある文字列/,0' ログファイル
とか?
127 :
名無しさん@お腹いっぱい。:2014/07/15(火) 09:12:14.40
改行または先頭からある文字列までをげとしておいて
先頭からある文字列までをそれで置き換えればいいのさ
お前は何を言ってるんだ
ぱっと見awkで簡単にいけそうだなっと思ったが
>>126がどうなってんのか簡単過ぎてよくわからないw
sedがダメという状況でawk使うというのは解決になってない気がしなくもない。
>>132 パターン条件だけ書いてデフォルトprintしてるだけだろ
>>132 行範囲の終了条件が 0(偽)だからいつまでも一致せず、最後の行までという意味になる。
>>132 sed -n '/regex/,$p' といっしょ。awk はファイル終端を表す $ が使えないので、
$ のかわりに常に偽の 0 で代用してる。
ちょっと苦しいが、
>>125以上の案が思いつかん…
tail -n $(( $(wc -l < file) - $(grep -c 'pattern' file | head -n 1) )) file
なんかすごい簡単にいけそうなのになにこれキモい…
sedならsed '/pattern/,$!d' fikeでいいのに
なるほど
,0の部分がよくわからなかったんだ
0が一致しないから終わりまで全部って意味になるのね
>>126みたいに簡単に書けるならsedでもawkでもいいんじゃね?w
俺の中ではsedでいいじゃんという結論になっている
なんでsedじゃだめなんだろう。
ある文字列の検索が終ったあとは余計なCPUパワーを使わずに単純出力させたい。
sedを使う方法だとログを表示中(| less してるとかを想定)は、ずっとsedプロセスが残ったままで、それを経由するので無駄。
とか?
>>136 >>125 はこんな感じとして、どういう事?
tail -n "+$( grep -ne "$regex" "$file" | head -n 1 | cut -d : -f 1 )" "$file"
ついでに、マッチした行の n 行下からの印字 (GNU sed)
sed -ne "/${regex}/,\$ { /${regex}/,+$(( n - 1 )) d; p }" "$file"
>>141 がいいことを言った。
lessで表示する前提なら、
less +/ある文字列 logfile
だけでいいじゃんw
>>141 それsed以外の方法でもたいてい同じになるんじゃね。
なぜsed禁止なのか
>>124に聞きたい。
外野の憶測じゃないく。
>>141 つきるめるなら、文字列がマッチした時点でその行の先頭を指してる標準出力ファイルディスクリプタをもったまま
何らかのプログラムをexecするプログラムを作れということか!
いらねえw
「男は度胸!何でも試してみるもんさ」
>>145 禁止なんて誰も書いてないだろ
sedより簡単な方法があったような気がするから教えてだろ。
>>148 > sedより簡単な方法があったような気がするから教えてだろ。
そうは書いてない。
150 :
119:2014/07/15(火) 14:28:02.53
みなさんありがとうございました。
>>120で思い通りのことができて嬉しいです。
雰囲気以上のことはあまりわかりませんでしたが調べてみます。
使いこなせるようになりたいのでまた疑問ができたら質問させて下さい。
ありがとうございました。
>>149 どう解釈しても良いけど「sed禁止」と読み取れる
文言はどのへん?
禁止というのはおれの誤読かもしれないけど
それならそうと
>>124が訂正してくれればいい。
ログファイル等の検索で、
「ある文字列が最初に出た行以下すべてを表示する」場合、sedコマンド以外で簡単な方法ないでしょうか?
(有った気がするのですが忘れてしまいました)
それほど複雑な文言じゃないが
sedでも簡単だけど、言語かコマンドかでフィーリングが違うな。
awkでも出来るけど、なるべくcut使ったり。
awkは「言語としても使えるコマンド」って印象があるなあ
プログラマだからそう思うのかな
>>143を見てlessって思ったより便利なのかと思って試したんだが、
これlessで眺めるの前提だからうまく機能するんだな
これ利用してファイルに吐き出す方法ないものか
>>157 表示されてないだけで、読み込まれてはいるんだから、何か違う気が。
awkとかsed使うくらいならperlの方がいい
ポータブルだしね
>>159 コマンドとして考えるとperlはちょっとデカいかな
長いスクリプト書くなら、複数プロセスを通すより軽くて良いが
このスレで言うのもなんだが、awkとsed覚える前にPerl覚えちゃったクチだわ
awk/sed入っててPerl入ってないなんて組み込み系か宗教上の理由じゃない限り有り得ないし
さらにzshが意外とzsh内で完結できる守備範囲広いからそっちの方も勉強するようになって
ますますawk/sedは覚える機会が…
俺もawk,sed覚える前にperl覚えたけど
大抵のことはbash,awk,sedその他で出来てしまうから
逆にperl書かなくなっちゃた派だな
perlのワンライナーがキモくてどうも使う気になれない
俺の場合、インタラクティブにはsed/awk
その組み合わせをメモするついでにシェルスクリプトにする場合もある
何にしてもshebangにsedやawkを書くことはないな、shになる
最初からスクリプトとして書くつもりならperlになるかな
こちらは逆にシェルスクリプトに埋め込むことを滅多にしない
perlはワンライナーに限らずキモい使い方される事の多い環境。
ワンライナーではキモいコード使うことが多いってだけで、
perlワンライナーのキモさは本質的にperlそのもののキモさ。
キモいけどまぁあれはあれで便利なもんだよ。キモいけど。
awkとかsedは、ヒアドキュメントにして見づらくならない程度。
長くて2〜30行以内。
あと、拡張正規表現が標準正規表現と互換性(ほんの少しだけど)がないから、めんどくさい。
perlのキモさを見て使いこなしたくなったけど結局勉強していない
perlでがっつりスクリプト書くならCで書いちゃうなw
正規表現でさらっと処理するならawkかsedで充分。
最近流行のキモかわいいって奴
Rubyのほうが相性いい
Apacheの1日分のログで、IPアドレスごとに1分ごとの平均接続数を一覧で確認したいのですが、どうゆう方法で1分ごとの平均を出したらいいのでしょうか?あ、スレ違いとかスレ目的とずれてたらスルーしてください。
>>171 確かに!
DoSとかクロールとかが埋もれないようにとか思ってたけど、それで十分ですね。
ありがとうございます!
難しく考えすぎてました...orz
124と似ていますが、行番号だけの表示をさせたい…
シェル作成しているのだが(行番号を取得してログの一定範囲を表示させたい)んだが、sshで別サーバのログをgrep,sed,awkしてたりするんだが、上手くいかない…
わかりづかくて申し訳ない
わからんなw
今まで書いた部分をstackoverflowあたりに貼って質問してみれば
>>174 awk '/ある文字列/{print NR}' logfile
>>174 sed -n '/ある文字列/=' ログファイル
>>177-178 最初に一致した行番号だけ表示するならqやexitを追加しとけ。
sed -n '/ある文字列/{=;q}' file
awk '/ある文字列/{print NR;exit}' file
>>177 >>178 >>179 どうもです。まださわりはじめたばかりでどうも入りづらく…
ちなみに私が実施していたコマンド
set 変数 = `ssh 鯖 " grep -n 文字 ファイル | tail -1 | sed 's/ /: g' | awk '{print $1}'
環境がいまないので教えていただいたのを試してみたい…
ちなみに最後にヒットした行番号を抜き出します。
パイプの使い方がいまいちわからん…このコマンドだと最後の行の文章まで引き出してしまう
>>180 最後にヒットした行番号かよ
ほれ↓
awk '/ある文字列/{t=NR}END{print t}' ファイル
>>181 .なんでそんなに分かるんだwww
ありがとうございます。
手元に何らかのUnix系環境あると楽だぞ
UnixやBSD、LinuxやMacを使ってるならそこで色々試せばいいし
Windowsでも、ちょっとお試し程度ならCygwinでも問題ない
ただCygwin独自の問題もあること考えると仮想マシンにUnix系の環境あると便利
知らない間に、レス数が増えてるな。なんか、反応が早すぎるよね
>>174 出遅れたけど一応 sed
sed -e '=' "$filename" | sed -n 'N; /'"$regex"'/{ s/\n.*//; h }; ${x; p}'
そして、
>>180 のを直してみた
grep -n "$regex" "$filename" | tail -n 1 | cut -d : -f 1
>>181 もしよろしければなぜそうなるか教えていただきたい…
私が作成したコマンド含めて…
書いた人じゃないが
awk '/ある文字列/{t=NR}END{print t}' ファイル
ある文字列 にマッチすると、その行の行番号をtに保存する
END(つまりすべての行読み込みが終わった後)に最後にtに保存された行番号を表示する
NRはNumber of Recordとかそんな感じの変数。
テキスト中に現れる<text:s c="n"/>のような文字列を
n個の半角スペースに置き換えるにはどうすればいいでしょうか
たとえば<text:s c="23"/>だったら、半角スペース23個に置き換えられるとうれしいのですが
>>189 これもawk案件かな。
改行が入ってたりはしないんだな?
>>189 全ての行をechoで出力するように置換して、
該当の部分を`printf %23s " "`に置換、
それらを評価してテキストを出力する。
この方法は元のテキストで、shが解釈する文字をどの程度使ってるかでコストが変わる。
>>189,190
とりあえずやっつけで、、、
$ cat hoge.txt | awk '{if(match($0, /^(.*)<text:s +c="([0-9]+)"\/>(.*)$/, m)){printf("%s%" m[2] "s%s\n", m[1], " ", m[3])}else{print}}'
これは <text:s〜> が同一行に複数あったらダメだな。。。
誰かもっとスマートな方法をお願い
Perl なら一行で…
$ cat hoge.txt | perl -pe 's@<text:s +c="(\d+)"/>@sprintf("%$1s", " ")@ge'
ついにperlさんが活躍するのか
sedで頑張ろうと思ったがどうやっても複雑になるからあきらめた
前スレに出てたスクリプトを出力するスクリプトを書けばって気はするが、作り方が分からん……
>>190,195
192だが、やってみたらこうなった。
$ cat in.xml|sed -e "s/^\(.*\)\$/echo '\1'/" -e 's|<text:s c="\([0-9]\+\)"/>|'\''"$(printf "%\1s" " ")"'\''|g'|while read;do eval $REPLY;done
printf埋め込むまわりのクォートがわけわからんことに。
こんな感じのを作ってる。入力にシングルクォートがあったら終わりかな。
eval echo '<?xml version="1.0"?>'
eval echo ' <p>'"$(printf "%10s" " ")"'</p>'
sed で2通り。2番目は、長いです
1. POSIX shell and GNU sed
#!/bin/sh
ReTag1='<text:s +c="'
ReTag2='"/>'
sed -re '
: Loop
s@^(.*)'"${ReTag1}"'([0-9]+)'"${ReTag2}"'(.*)$@echo '\''\1'\''"$( printf "%\2s" " " )"'\''\3'\''@e
t Loop
'
2. 連投失礼します
ReTag1='<text:s \{1,\}c="'
ReTag2='"/>'
sed -e '
# using: unix.stackexchange.com/questions/36949/ the answer of Simon Richte
: Loop1
\@'"${ReTag1}"'[0-9]\{1,\}'"${ReTag2}"'@ {
: Loop2
s@\('"${ReTag1}"'[ <]*\)0\([0-9]*'"${ReTag2}"'\)@\1<\2@
s@\('"${ReTag1}"'[ <]*\)1\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)2\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)3\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)4\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)5\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)6\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)7\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)8\([0-9]*'"${ReTag2}"'\)@\1< \2@
s@\('"${ReTag1}"'[ <]*\)9\([0-9]*'"${ReTag2}"'\)@\1< \2@
t Loop2
: Loop3
s@\('"${ReTag1}"'< *\) <\([ <]*'"${ReTag2}"'\)@\1< \2@
t Loop3
s@'"${ReTag1}"'<*\( *\)'"${ReTag2}"'@\1@g
}
t Loop1
'
197 のインデントを置換するのを忘れた
197 ですが、@\1<数字分の半角スペース\2@ で置換します
連続した半角スペースが、1つになってしまったので、読み替えて下さい
200 :
189:2014/07/21(月) 11:38:36.49
>>189です。みなさんありがとうございます。
いただいたどの案でも目的を達することができました。
201 :
189:2014/07/21(月) 11:39:16.74
>>191 printfを使うというのは目からウロコでした。
ある文字を指定された回数だけ出力する(expand?のような、あるいはBASICの
STRING?のような)コマンドを探したりしていたのですが見つからず…
202 :
189:2014/07/21(月) 11:40:06.63
>>190,192
できました。同一行に複数ある場合ですが、ちょっと後出しみたいで申し訳ないのですが、
入力をあらかじめタグの切れ目で改行しておけばよいので全然問題ないです。
203 :
189:2014/07/21(月) 11:40:55.78
>>193 ううむ、簡潔ですね。さすがperlです。sedやawkでだめならperlかなと思っていたので
そのものズバリの回答ありがたくいただきました。
204 :
189:2014/07/21(月) 11:41:42.39
>>195 ご明察のとおり元のテキストファイルはxmlファイルで、
OpenOffice Writerの文書ファイルからcontent.xmlを取り出したものです。
evalを使ったスクリプト、期待どおり動作しました。入力中にシングルクォートは
ありませんでしたが、アスタリスクがあって、ちょっと副作用出ました。
この辺が
>>191さんのおっしゃるコストでしょうか。
205 :
189:2014/07/21(月) 11:42:20.07
>>196 GNU sedだとeコマンドが使えるのですね。ループの使い方とあわせてとても勉強になりました。
>>197-199 うーん、そういう方法があったか!と唸ってしまいました。
元記事Simon Richterさんのsedで加減の演算を実装してしまう方法はとてもマニアックですが
sedでもここまでできるという見本のような使い方だと思いました。
206 :
189:2014/07/21(月) 11:47:24.63
上にもちょっと書きましたが、入力ファイルはOpenOffice Writerの.odtファイルに含まれているcontent.xmlで、
unzip -qq -c document.odt content.xml | sed -e 's,<[^>]\+>,,g'
このような感じのフィルタスクリプトでxmlタグを取り除いてやると、元の文書のうち文字情報だけを
取り出すことができるので、これを~/.lessfilterに登録しておけばlessでファイルの内容をさっと確認
できるなと思ったのが出発点です。
しかし複数のスペースが入力されているところは<text:s text:c="n">(すみません、正しくはこうでした)
のようにxmlの記法?でまとめられてしまっていて、これがsedでは(というか自分の力量では)
うまく変換できなかったので、質問させていただいた次第です。
xmlなんだからパーサーに食わせればいいと思う。
パーサー使っていいならodt2txtもありになってしまうじゃん
あくまで標準的なコマンドでやりたかったんじゃないの?
>>204 >>195だけど、evalは危険なので気をつけて下さいね。何らかの方法で任意のコマンドが実行できるかも知れない。
>>207 xmlstarletでやろうとしたけど挫折した。純粋なxsltなら出来そうだけど。
>>208 時間の無駄。
XMLパーサの再発明(しかも超劣化版)してどうするの?
別にパーサでやるのも、あくまでシェルスクリプトでやるのもアリでしょ。
そこの議論やるより、スクリプトを書いたほうが建設的。
>>210 なんでも使える環境で作業してるなら Perl でも Python でも Ruby でも使えば良いじゃん
なんでこのスレいるの?
最近は
>>189みたいにxslt使うまでもないのは
s.split(/<(^[>]+)>/m).forEach
みたいな感じでnode.jsだな 改行入っててもOKだし
今回はperlさんが最適解っぽいな
しかしawkで
>>192のようなやり方があるとは
matchの3つ目の引数使って後方参照出来るってことだよな?
これは使いこなすと強そうだ
gawk限定でもいいのかっていうのはこのスレではやや気になる。
自分だけなら好きなように使うけど(特にgawk4.0以降の多次元配列)。
pythonやrubyは?
#!gwak
と書いて置けばいいさ
shebang行に相対パスは環境依存…とかそれ以前にグワック
空白の行を取り除くとして、方法が何通りかあると思うんですけど
どんな方法がありますか?また一般的な方法はどれですか?
>>220 grep -v ^$
空行ならこうだけど、空白の行なら'^ \+$'かな。
「空白行を取り除く」という言葉を重視するなら sed かな
tr -s \\n #空行を取り除く
質問は空行じゃなくて空白行。
空白行と空行ってなにか違うんですか?
空行は何もない行。
空白行は空白のみがある行。
227 :
名無しさん@お腹いっぱい。:2014/07/22(火) 16:31:35.12
s/\n+/\n/m
228 :
名無しさん@お腹いっぱい。:2014/07/22(火) 16:32:18.04
s/\n\s*\n/\n/m
それじゃ答えになってない。
sed様のお手を煩わすまでもない、
お前など、このgrepが排除してやるわ
# 仕様後出しアタック
grepを倒したからと言っていい気になるなよ
奴は正規表現四天王の中でも最弱
ここまで妄想した。
汎用性を考慮して行頭、行末、行頭と行末の空白文字を取り除くスクリプトを用意
#!/bin/sh
progname=`basename $0`
case $progname in
ltrim) sed -e 's/^[[:space:]]\+//g' "$@" ;;
rtrim) sed -e 's/[[:space:]]\+$//g' "$@" ;;
lrtrim) sed -e 's/^[[:space:]]\+//g' -e 's/[[:space:]]\+$//g' "$@" ;;
*) echo "unsupported program name: $0" 1>&2 ; exit 1 ;;
esac
誰かファイル末尾の空行を削除するスクリプト作って
少なくとも空行、空白行削除なら
>>221のをちょいとだけいじって
grep -v '^ *$'
でいい気がするんだが
sed使うほどでもないだろうこれ
>>226 ちょっとまって。
空白しかないんでしょう?
改行があったらダメじゃん?
でも改行ないと行じゃないよ?
あれ?
全角スペースもお願いします。
全角スペースに見える未定義コードもお願いします。
>>233 sed でタブと全角スペース込み
unnamed)
sed -e '
: Loop
N
$ d
/^[[:space:]\n]*$/ b Loop
'
;;
>>237 お前みたいな曖昧な提案しかできない奴が仕様をまとめるから炎上するんだ
240 :
238:2014/07/22(火) 21:34:16.78
一々言う事でもないけど、"$@" つけ忘れた
こういうミスを、書き込む前に気付く様な人に、いつかなりたい
>>234 sedのdコマンドのほうが、意味的に近いかなと思うんよね
grepはどうしても「抽出する」イメージが強いコマンドだし
>>237 [[:space:]]
これの対象にならないならもうだめぽ
sedっていうとどうも編集役っていう先行イメージがな。置換とか
行の一部を編集ならsed、行丸ごと処理ならgrepだと勝手に思ってる
同じ処理ならgrepのほうが高速に動く……多分
>>237 バカには見えない文字があるので仕様通りです。
245 :
233:2014/07/22(火) 23:00:49.86
>>238 おお、さっそく作ってくださってありがとうございます。
tac と組み合わせればファイル先頭の空行も取り除くことができるので願ったり叶ったりです。
自分も早くパターンスペースやホールドスペース、ループを自在に操れるようになりたいです。
具体的な話しじゃないけど
無印良品のデータベースって市販の管理ソフトだと
効率が悪いんで、txtベースで資料を造ってボーンシェルかなにかで
検索システム造ったと聞いたが、cat|grepとかだったのかな。
>>247 ありがとう。
ググルよりオマエに頼ってオマエを愛したい。
249 :
247:2014/07/23(水) 11:49:25.56
やだよ気持ち悪い。
>>230 >>248-249 笑った。四天王の中でも最弱とか、よく出てきそうなフレーズだなあ
と思って調べると、有名なネタですか
先頭の空行のも書いてみました。正規表現で2回走査する所がいまいちですが
unnamed2)
sed -e '
0, /[^[:space:]]/ {
/[^[:space:]]/! d
}
'
;;
[ここか[:space:]ここに]
空白文字を足せば解決の様な気がしますが、落とし穴?
>>236 grep -v '^[[:space:]]*$'
ちょっと苦しいか
>>250 ファイル先頭の空行を削除するスクリプトありがとうございます。
アドレス0の使い方を学びました!
>>193 Perl は 'x' で文字列のリピートができるのか… '*' じゃないんだな
$ cat hoge.txt | perl -pe 's@<text:s +c="(\d+)"/>@" " x $1@ge'
catが無駄です
cat始まりとか割とよくやるよな。
最初だけcurl $url|tee cache|した時とか特に。
cat始まりで実行するのは素人。
コマンドライン上、ファイルを最初に書きたいなら、
< file script > outfile
ってやればいいだけ。catもパイプも要らん。
問題:この話題は過去何回目でしょう?
スクリプトではなく対話のシェルに打ち込むなら
ネコを使っておいた方がヒストリを検索するときに
まとまっていて楽w
>>256 なるべくなら少ない方法を使い回したい。
あと入力がgzのものがあって、zcatに置き換えるのはありがち。
おれも最初に cat するクセがあったんだけど、以前このスレで違いを教わってやめた
cat するのとしないのとの、実行時間の違い
対象ファイルは DVD 版 KNOPPIX にあるファイル KNOPPIX (ややこしいな)
$ du -h KNOPPIX
4.0G KNOPPIX
$ time bash -c 'tail KNOPPIX > /dev/null'
real 0m1.811s
user 0m0.000s
sys 0m0.004s
$ time bash -c '< KNOPPIX tail > /dev/null'
real 0m0.182s
user 0m0.000s
sys 0m0.004s
$ time bash -c 'cat KNOPPIX | tail > /dev/null'
real 9m6.519s
user 0m4.148s
sys 0m28.584s
そんな差あったのか
パラメータにファイル指定するより標準入力に突っ込んだほうが早いというのは知らなかった
俺も今後は控えよう
その例は・・・w
catの次が標準入力を先頭から普通に読むタイプのフィルタならそこまで差はつかないと違う?
tailはちょっと特殊な読み方をするんじゃないのかな
じゃあ、tailの代わりに wc -c でどぞ。 -c も付けるんだぞ。
>>261の3番目だけは遅いブロックデバイスへのブロックリードが大量に発生するんだよね
catが全部読んでtailに渡しながら、tailは先頭から改行カウントするしかないからね
その結果I/O待ちのidle時間が膨大になる
1番目と2番目はtailがKNOPPIXのファイル記述子を直接得られるので、seekして後ろの方から読んで改行を探せる
その結果ブロックリードの量が激減するので時間がかからない
まあtailの特殊事情だから、wc -cならここまで差はつかないだろう
ほう。wc -c の方が大差がつくとなると何か自分が知らない仕組みがあるのかなあ?
とても興味があります
おお。たしかに差がでるなあ?なんでcat通したwcはこんな遅いんだ?
並列化が云々
ああ、なるほどwそりゃそうだw
wc -cだとデータの中身は見なくていいのね
だからファイル記述子が直接得られりゃ、即効で終われるのか
「cat file|」だと後段の入力はパイプだけど、「<file 」だと後段の入力はファイルになるんだっけ。
大抵は大丈夫だけど、物によっては動作自体異なる場合もあるのかな。
>>261>>262 2つ目ってキャッシュ効いてたりしないよな?