シェルスクリプト総合 その11at UNIX
シェルスクリプト総合 その11 - 暇つぶし2ch452:名無しさん@お腹いっぱい。
08/07/04 11:13:09
FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。

wc -l $file | sed "s/ /_/g"
_____340_/usr/bin/g++

Linux では次のようにして 340 という値を得ていたのですが、
FreeBSD では空白文字が出力されてしまいます。

wc -l $file | cut -f1 -d" "

FreeBSD 版 wc ではどうすればいいでしょう。
ltrim() みたいなものがありますかね。
それともいったん sh の変数に代入する?
それとも wc や cut には未知のオプションがある?
cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ?
お前 awk '{ print $1 }' も書けないのか?

bash をよく使うので、依存しているところがあったらごめんなさい。
awk はほとんど馴染みがありません。というか、
何かにつけて不遇の cut を使ってあげたい気持ちがあります…。

453:名無しさん@お腹いっぱい。
08/07/04 11:15:19
>>452

echo `wc -l < $file`

454:名無しさん@お腹いっぱい。
08/07/04 11:28:33
>>452
長文で cutを力説してるのに、
>>453 で cutすら必要ないというオチにワロタ

wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので
cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。

455:名無しさん@お腹いっぱい。
08/07/04 11:33:53
> それともいったん sh の変数に代入する?
質問者が用意した選択肢を誇らしげに答える>>453-454が憐れ。

456:名無しさん@お腹いっぱい。
08/07/04 11:38:03
空白文字のパディング方式に、
暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。
仕様の特殊化しても嬉しくない。

457:452
08/07/04 11:38:04
いやいや

> wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので

役に立ちました! 確かに笑った。

458:名無しさん@お腹いっぱい。
08/07/04 11:38:44
>>455
おまえ、シェルスクリプト書いたことないだろ?

>>453 では一切「sh の変数に代入」は行なっていないがww

459:452
08/07/04 11:50:48
>>456
いやいや、そうなんですよ。 cut ってつまり結局
他のコマンドと組み合わせるには中途半端なツールなんですよ。
単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが…
awk や bash は区切り文字を変えるだけでも結構タイプする印象が。

いや、変にこだわってごめんなさい。

460:名無しさん@お腹いっぱい。
08/07/04 12:06:44
つ awk -F:

461:名無しさん@お腹いっぱい。
08/07/04 15:50:34
cut はデリミタの連続を指定できれば使える君に化けるんだがな。

462:名無しさん@お腹いっぱい。
08/07/08 07:58:27
シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが

463:名無しさん@お腹いっぱい。
08/07/08 08:00:46
>>462
インタプリタ型言語だから。
(fork/execが遅いと言うだけが理由ではない。
内部コマンドだけを使ってもCよりも遅いから)

464:名無しさん@お腹いっぱい。
08/07/08 10:52:14
でも一番のボトルネックは fork, exec だと思うぞ

465:名無しさん@お腹いっぱい。
08/07/08 11:29:48
プロファイルしてみると分かるが、文字列処理も結構コストが高い。
stat(2)せずにls -lしてからパターンマッチなど。
shは文字列がグルーになっているから。

466:名無しさん@お腹いっぱい。
08/07/08 14:57:58
パイプとかバッククォートとかガンガン使うから、
それだけでシステムコール連発になっちゃうもんね。
文字列処理なのに write(2) とか使うわけだw

467:名無しさん@お腹いっぱい。
08/07/08 21:54:18
レスありがとう
ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?


468:名無しさん@お腹いっぱい。
08/07/08 21:56:21
>>467
全然合ってない。それは MS-DOSのニセパイプの動作。

469:名無しさん@お腹いっぱい。
08/07/08 22:14:44
>>468
詳しくおしえてください・・・

470:名無しさん@お腹いっぱい。
08/07/08 22:21:27
>>469 シェル pipe dup2 とかで検索してみ。

471:名無しさん@お腹いっぱい。
08/07/08 22:50:12
そんな検索語じゃわかるわけないだろ。
pipe(2)だって無限にバッファがあって、
入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。

472:名無しさん@お腹いっぱい。
08/07/08 23:22:32
無限の記憶装置は存在しないのでそんな可能性はゼロだな。

473:名無しさん@お腹いっぱい。
08/07/08 23:25:31
MS-DOSのパイプ仕様を実装することも不可能だな。

474:名無しさん@お腹いっぱい。
08/07/08 23:36:10
コマンド1 | コマンド2

本来のパイプだと、
コマンド1 の標準出力 = コマンド2の標準入力
になるような操作(dupとか)が裏で行われる。
コマンド1と2は同時に実行される。一時ファイルを介さない。

嘘パイプの場合は、
コマンド1 > 一時ファイル
コマンド2 < 一時ファイル
削除 一時ファイル
なだけ。


475:名無しさん@お腹いっぱい。
08/07/08 23:57:58
例えば
cat ばかでかいファイル | head -1
だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します
そのときcatの処理が途中だったらどうなるんですか?

476:名無しさん@お腹いっぱい。
08/07/09 00:11:11
やってみろよ

477:名無しさん@お腹いっぱい。
08/07/09 00:50:57
>>475
バッファってしってるか?


478:名無しさん@お腹いっぱい。
08/07/09 01:22:00
>>475
catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。

479:名無しさん@お腹いっぱい。
08/07/09 02:16:51
そのshigpipeを発行するのはパイプさん?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch