トップページunix
1001コメント301KB

シェルスクリプト総合 その7

■ このスレッドは過去ログ倉庫に格納されています
0001ミスターシェル2006/09/07(木) 13:00:11
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0778名無しさん@お腹いっぱい。2007/01/26(金) 14:06:56
>>777
その理由は?
0779名無しさん@お腹いっぱい。2007/01/26(金) 14:11:34
毎日同じ時間に何やってんだ。宣伝か?
0780名無しさん@お腹いっぱい。2007/01/26(金) 17:33:13
漢ならtwm一本で行けよ!fvwm2でもいいけどw
0781名無しさん@お腹いっぱい。2007/01/26(金) 17:38:48
つuwm
0782名無しさん@お腹いっぱい。2007/01/28(日) 05:14:10
「変数$listに格納された5個の小数点のついた数字」
の中で、「20以上である」という条件を満たしたものが
いくつあるのかを数えたいです。
例えば、変数$listの中身が
10.4
30.2
15.4
5.2
20.2
だった場合には、答えは2と出るようにしたいのです。

n=1
sum=0

while [ $n -le 5 ]
do
s=`echo "$list" | sed -n "$n p"`
y=`trunc("$s")`
if test "$y" -ge 20
then sum=`echo "scale=0; $sum + 1" | bc`
else
exit 1
fi
n=`expr $n + 1`
done

echo $sum
07837822007/01/28(日) 05:15:34
上記のbash scriptでいいのかな、と思ったのですが、
エラーになります。
変数$sに数値がひとつひとつ代入されて行くのは確認できたのですが、
小数点を切り捨てるためのtruncコマンドのところでエラーになります。
command substitution: line 1: syntax error near unexpected token `"$s"'
command substitution: line 1: `trunc("$s")'

どこがおかしいのか教えていただけませんか?
0784名無しさん@お腹いっぱい。2007/01/28(日) 06:18:11
最近のbashはtruncなんてあるのか。
0785名無しさん@お腹いっぱい。2007/01/28(日) 06:47:50
関数にしろコマンドにしろ、呼び出しは trunc "$s" の形になるはずだろ。
というか、小数扱うなら awk 使っとけ
0786名無しさん@お腹いっぱい。2007/01/28(日) 09:00:04
>>782
nn=0; for aa in $list; do if [ ${aa%.*} -ge 20 ]; then nn=$((nn + 1)); fi; done; echo $nn;
0787名無しさん@お腹いっぱい。2007/01/28(日) 09:14:30
bash依存しまくりスクリプトは犬板逝け
07887822007/01/28(日) 09:15:01
>>784
>>785
man truncしたらこんなのが出てきましたが。
つまり、truncはたぶんtrunc(数字)とかいう形で使うのかな、
と思ったのです。実際trunc "数字"ではうまくいきませんでした。
しかし、trunc()の形にしたところで
$ trunc(23.4)
-bash: syntax error near unexpected token `23.4'
こんな感じでエラーになり、たぶん正しい文法になっていないのが
ネックになっているような雰囲気です。

NAME
trunc -- truncate to integer value
SYNOPSIS
#include <math.h>
double
trunc(double x);
long double
truncl(long double x);
float
truncf(float x);
DESCRIPTION
The trunc() functions return the integral value nearest to but no larger
in magnitude than x.
SPECIAL VALUES
trunc(+-0) returns +-0.
trunc(+-infinity) returns +-infinity.
SEE ALSO
ceil(3), rint(3), math(3)
STANDARDS
The trunc() functions conform to ISO/IEC 9899:1999(E).
BSD January 29, 2003 BSD
07897822007/01/28(日) 09:19:35
>>786
ありがとうございます。
これはなんの言語でしょうか。これがawk?
実際にこれでやってみましたがうまくいきません。
そもそも
${aa%.*}
この意味がわかりません。
けど、これを使うとtruncを使わずに済むので
便利そうですね。
いろいろと勉強してみます。

>>787
今はたまたまbashの勉強をしているので、
別にbashに依存しているわけではありません。
excelとか使った方が速いのはわかってますが、
無理やりbashでやろうとすることで
「 ( ・∀・)つ〃∩ ヘェーヘェーヘェー truncなんて関数があるんだ!」
という発見があるので、おもしろいのですよw
0790名無しさん@お腹いっぱい。2007/01/28(日) 09:30:33
man bashを一通り読めと。
0791名無しさん@お腹いっぱい。2007/01/28(日) 10:23:58
>>788
それ、マニュアルページの一番上に trunc(3) て書いてるんじゃない?

マニュアルのセクション3は、Cのライブラリ関数。
07927822007/01/28(日) 17:54:08
>>791
!!!!
全くその通りです!
bashでは使えないのですね・・・orz
bashの中でCのライブラリ関数を使う方法か、
他に小数点切り捨てによい方法はありませんか?
0793名無しさん@お腹いっぱい。2007/01/28(日) 22:07:05
切り捨てる必要があるのかと
0794名無しさん@お腹いっぱい。2007/01/28(日) 22:17:42
>>793

[ は切り捨てないと使えないyo
0795名無しさん@お腹いっぱい。2007/01/28(日) 22:32:23
>>789
本当にbash使ってるなら、>>786 で合ってるよ。awkは関係ない。
これ自体がbashのスクリプト。

bashじゃない普通の shでも動くように >>786 を書き直してみた。
↓ (ちなみに俺は >>786 とは別人)

nn=0
for aa in $list
do
if [ `expr $aa : '\(.*\)\..*'` -ge 20 ]; then
nn=`expr $nn + 1`
fi
done
echo $nn
0796名無しさん@お腹いっぱい。2007/01/28(日) 22:34:34
単なるshで書ける奴って強いよな。
0797名無しさん@お腹いっぱい。2007/01/29(月) 14:38:20
若干スレ違い気味な気もしますが

ttp://x68000.q-e-d.net/~68user/unix/pickup?iconv

> 入力ファイルに無効な文字 (-f で指定した文字コードと矛盾するようなデータ) が
> 含まれていた場合、iconv はエラーとして終了する。FreeBSD の iconv では
> -c オプションを指定することで、無効な文字を無視して無視して続行することができる。
> 他の iconv では必ずエラーで終了してしまうようだ。

Linux で、変な文字を無視しつつ文字コードの変換をしたいときにはどうするのがベストでしょうか。
(個人的に馴染のある言語の) php で iconv//IGNORE をする、という手は思いついたのですが。
0798名無しさん@お腹いっぱい。2007/01/29(月) 14:50:35
スレ違いじゃなく板違い
Linuxでどうするのかを聞くなら
Linux板がいいでしょう。
07997822007/01/29(月) 21:06:29
>>795
か、神!!!!
おかげさまでついにできました!
実はやりたかったことは、
「猛暑日(最高気温が35度以上の日)が2006年8月に何日あったか」
を各都市ごとに数えてみたかったのです。
そうすれば、熊本、佐賀、京都がいかに暑いところか
理解してもらえるかなと思って。

こんな感じでできました!!
ttp://sheel.mydns.jp/~sheel/moushobilastaugust.shtml
bashスクリプトファイルはここに置いておきますのね。
ttp://sheel.mydns.jp/~sheel/moushobilastaugust.sh

またいろいろと教えてください。by 皮先くん
08007822007/01/29(月) 21:09:19
>>799
ちなみにshtmlの方は、12個の都市について
その場で気象庁からデータをとりにいって解析するので
クリックしてから表示されるまで1分弱ほど時間がかかりますので
辛抱強くお待ちくださいね。
0801名無しさん@お腹いっぱい。2007/01/30(火) 09:09:26
>>800
なかなかおもしろいね。
色々応用が利きそう。
0802名無しさん@お腹いっぱい。2007/01/31(水) 09:39:22
>>782
まだやってたんだね。
Mac板でのやりとりがなつかしいぜ…
08037822007/01/31(水) 16:57:24
冬日(=最低気温が0度を下回った日)が2007年1月に何日あったかを
13の都市について気象庁から一気にデータを取得して
自動計算するシェルスクリプトもつくってみました。
<13の都市とは>
東京、大阪、京都、静岡、浜松、
熊本、鹿児島、枕崎、福岡、佐賀、大分、宮崎、長崎

「冬日が何日あったかを計算して表示する」
(13の都市のデータを取得するため1分弱ほど時間がかかります)
ttp://sheel.mydns.jp/~sheel/fuyubi200701.shtml
ソースはこちらです。
ttp://sheel.mydns.jp/~sheel/fuyubi200701.sh
0804名無しさん@お腹いっぱい。2007/02/01(木) 12:23:44
>>802
オレも気付いた
のでスルーしといた
0805名無しさん@お腹いっぱい。2007/02/01(木) 14:41:45
そのリンクを踏んだら気象庁にと〜つげきよ〜
0806名無しさん@お腹いっぱい。2007/02/01(木) 21:39:01
>>802
俺も気がついた
ので教えてやった。
皮先のスクリプトはよく利用させてもらってて重宝してるし。
0807名無しさん@お腹いっぱい。2007/02/02(金) 20:25:38
リモートホスト上の任意のディレクトリが存在するかチェックしたいのですが

remsh $リモホ名 -n "find $ディレクトリ名 -type d -name $ディレクトリ名 -print"
で値が取得できるかどうかでディレクトリがあるかチェックしようと思っているのですが
もうちょっとスマートなやりかたがありますでしょうか?・・
0808名無しさん@お腹いっぱい。2007/02/02(金) 20:30:16
findじゃなくtest -d $directoryでいいんじゃない?
0809名無しさん@お腹いっぱい。2007/02/03(土) 16:34:40
太郎 84
花子 83
裕子 98
尚美 91

という生徒のテストの点数を記載したデータがあったとき、
これを点数の高い順番でソートしたいのですが、
いろいろ調べるとawkがこういうのを得意にしているような気がしました。
この処理を簡単に行うにはawkが最も適していますか?
他に適している言語はありますか?

といいますのも、awkについて調べてみたのですが、
点数を加算する、とかはわかったのですが
点数の高い順番でソート、は無理なような気がしましたので・・・。

awkが最も適している、ということであればもうちょっとがんばってみたいと思いますが。
0810名無しさん@お腹いっぱい。2007/02/03(土) 16:53:29
>>809
ソートはsortでいいじゃん。

キーとするフィールド位置の指定だとか、アルファベット順じゃなく数の大小でのソートだとか、
そういうオプションもあるので、後はsortのmanみてみるとよいです。
0811名無しさん@お腹いっぱい。2007/02/03(土) 16:54:59
区切りが809の通りならsort +1 -nr でいいんじゃないかな。
08128092007/02/03(土) 18:17:50
>>810
>>811
sort!!!!!
そ、そんな普段から自分でもよく使ってるやつで可能だったんですね!
さっそく>>811さんのようにやってみたらうまくいきました!

ありがとうございました。
0813名無しさん@お腹いっぱい。2007/02/03(土) 18:31:44
whileやfor構文で繰り返されて出力される結果を
>>out.txt
を使ってどんどんファイルに書き加えていくのはわかりました。
では、ファイルに出力するのではなく、
(変数として?)メモリ上に出力していく方法はありますか?
例えば、

1回目の繰り返し文によって、変数$ssの値が5になりました。
変数$yyの中身は
5
となりました。

2回目の繰り返し文によって、変数$ssの値が2になったので、
変数$yyの中身は
5
2
となりました。

3回目の繰り返し文によって、変数$ssの値が7になったので
変数$yyの中身は
5
2
7
となりました。

こんな$ssに対して$yyのように出力が可能な方法はありますか?
0814名無しさん@お腹いっぱい。2007/02/03(土) 18:39:33
while ...; do
 # ...
 yy="$yy
$sss"
 # ...
done

echo "$yy"


単純にこうやるとyyの中身の1行目に空の行が出来ちゃうから、
yyが空かどうかチェックしたほうがいいか。
0815名無しさん@お腹いっぱい。2007/02/03(土) 18:48:28
set -
while ...; do
set "$@" "$yy"
done

for a in "$@";do
echo "$a"
done
0816しまった2007/02/03(土) 18:50:23
set --
while ...; do
set "$@" "$yy"
done

for a in "$@";do
echo "$a"
done
0817名無しさん@お腹いっぱい。2007/02/03(土) 19:04:22
>>814
なるほど。言われてみると簡単ですね・・・。
実際に自分でやってみたら、確かにできました。
最初の空白行は
yyが殻かどうかチェックするより
最後にsedとかで削除した方が簡単なのでそうしようと思います。
sed '/^$/d'
これをパイプしようと思います。
ありがとうございました。

>>815
よく意味がわからないのですが、
とりあえず814さんの方法でできましたので
お気持ちだけいただいておきます。
ありがとうございました。
0818名無しさん@お腹いっぱい。2007/02/03(土) 19:21:52
815の方法は、setで $1, $2, ... に追加していって最後に
それら全体である$@をループで回すことで取り出してる。
0819名無しさん@お腹いっぱい。2007/02/03(土) 19:35:54
>>818
なるほど、意味がわかりました!
ありがとうございます。
0820名無しさん@お腹いっぱい。2007/02/03(土) 19:49:44
$echo test.txt
太郎 84 25
花子 83 21
裕子 98 24
尚美 91 23
冬美 84 21

このように名前 点数 出席日数があったとき、
第一ソートは点数で、第二ソートは出席日数でソートし、
裕子 98 24
尚美 91 23
太郎 84 25
冬美 84 21
花子 83 21
こういうふうに出力したいのですが、
$echo test.txt | sort +2 -nr | sort +1 -nr
こうして二段階のsortでいいのかな?と思ったけど、
むしろ必ず
冬美 84 21
太郎 84 25
と、逆になってしまいます。そこで、
$echo test.txt | sort +2 -n | sort +1 -nr
-rオプションを外してやってみても同じ結果でした・・・orz

なにか別のコツなどがあるのでしょうか?
0821名無しさん@お腹いっぱい。2007/02/03(土) 19:51:09
終了
08228202007/02/03(土) 20:08:12
自己解決しましたが、回答を書いておきます。
sortは一度に複数のオプションを指定可能なので
第1フィールドを昇順でソートし、
第2フィールドは降順でソート、
ということが可能のようです。
この場合、具体的には以下のようにします。

$echo "text.txt" | sort +1nr +2n

ちなみに>>819のようなことがやりたい場合は

$echo "text.txt" | sort +1nr +2nr
ですね。

参考
ttp://biking.taiiku.tsukuba.ac.jp/~takai/Unix/Unix-text.html
0823名無しさん@お腹いっぱい。2007/02/03(土) 20:12:13
echoじゃなくcatじゃないの?
というか、cat使うと「catイラナイ」と言われるけどさ。
0824名無しさん@お腹いっぱい。2007/02/03(土) 20:13:37
ここでは、「ぬるぽ」「ガッ」と同じくらい定番だもんなw
0825名無しさん@お腹いっぱい。2007/02/03(土) 20:17:10
ネコイラズとな
08268202007/02/03(土) 20:19:07
>>823
あ・・・、マジでごめソ・・・orz
cat text.txt
が正解。

というか初心者がパイプを覚えるには最も分かりやすい例だと思うけどね。
cat hoge.txt | sort
0827名無しさん@お腹いっぱい。2007/02/03(土) 20:23:03
初心者にそういう使い方教えると、>>820のようなダメ人間ができあがる。
0828名無しさん@お腹いっぱい。2007/02/03(土) 20:25:49
んまー、sortコマンドって難しいべ。
0829名無しさん@お腹いっぱい。2007/02/03(土) 20:27:31
>>827
べつにそういう使いかた教えたせいじゃないだろう
08308202007/02/03(土) 21:14:27
みなさまのおかげでついに完成しました。
「全国の都道府県庁所在地の中で
 2007年1月に冬日が多かった順に並び替えます」
その結果です。
http://sheel.mydns.jp/~sheel/fuyubikencho0701.txt
スクリプトはこちらです。
http://sheel.mydns.jp/~sheel/fuyubikencho0701.sh

「全国の都道府県庁所在地の中で
 2006年8月に猛暑日が多かった順に並び替えます」
その結果です。
http://sheel.mydns.jp/~sheel/moushobikencho0608.txt
スクリプトはこちらです。
http://sheel.mydns.jp/~sheel/moushobikencho0608.sh

これを見ると、
佐賀、熊本、京都、名古屋は
夏場は日本一暑い割に冬場も不相応に寒いことがわかりますね。
0831名無しさん@お腹いっぱい。2007/02/04(日) 01:24:10
awkを使って
変数$hogeaと変数$hogebを連結しようと思います。
$hogeaの中身は
1
3
5
4
8
7
3

$hogebの中身は
1023
1032
1001
1002
1003
1009
1018

これをこんなふうにしたいのですが、
1 1023
3 1032
5 1001
4 1002
8 1003
7 1009
3 1018

ちょっと勉強して感じではよくわかりませんでした。
もうちょっと勉強してみます。
0832名無しさん@お腹いっぱい。2007/02/04(日) 03:20:35
paste
08338312007/02/04(日) 04:33:44
>>832
できました!!!
変数が20個くらいあったのですが、
echo "$hogehoge1" | paste file1.txt - >file2.txt
echo "$hogehoge2" | paste file2.txt - >file3.txt
・・・・・
echo "$hogehoge20" | paste file20.txt - >out.txt

とやることでなんとかなりました。
これが47x12x47=26,508回繰り返さないと行けない処理で、
ハードディスクは痛めつけるますがこれ一回だけやればいいので
これでがまんすることにします。
もっとメモリ内のみで済む方法ってないんでしょうね・・・。
0834名無しさん@お腹いっぱい。2007/02/04(日) 07:57:23
echoを使うのはネタなのか、そうなのか!?
0835名無しさん@お腹いっぱい。2007/02/04(日) 07:58:30
スマソ、ほんとにそういう中身なのね。
0836名無しさん@お腹いっぱい。2007/02/04(日) 16:11:52
シェルスクリプト以外の方法でやればいいのに。
08378312007/02/04(日) 19:45:16
>>836
例えばどういう方法がありますか?
わたしがやりたいのは、
気象庁のWebサイトから各都道府県庁所在地の
1961年以降の毎日のデータを2007年1月まで
一気に取得し、
例えば2007年1月の熊本(47814)のデータを
あとでとりだしやすいように加工した後に
「20070147814」
というファイル名で保存していく、ということです。
今朝から一括ダウンロードを始めましたがまだまだ終わりそうにありません。
24時間くらいかかりそうです・・・orz

こういう一回だけやれば済む使い捨てスクリプトをかくのに
シェルスクリプト以外になにかいい方法がありますか?
08388312007/02/04(日) 19:59:03
ちなみに>>837の気象庁から一括ダウンロード(curl)する
シェルスクリプトはこんな感じ。
ttp://sheel.mydns.jp/~sheel/alldataget.sh.txt
使い捨てだね。
そのダウンロードの結果が例えばこれ。
ttp://sheel.mydns.jp/~sheel/19920147819.txt

2年ほど前もこのスレで言われてたんだけど、
毎回毎回気象庁にデータを取りに行くより
一回だけ一括ダウンロードしておいて
ローカルで参照した方がスクリプト自体も高速化する、ってことと
自分自身が一括ダウンロードをするだけのスキルが可能になったので
ついに念願の一括ダウンロードをやっています。

試しにダウンロードが終わった部分だけで
ある連続した5年間の1月の47都市の冬日の日数の平均値を計算し
その平均値の大きい順に並べ替えてみました。
こういうのをダウンロードでやろうとすると小一時間以上?かかるのだけど
ローカルに保存しておくと1〜2分くらいで終わりますね。
0839名無しさん@お腹いっぱい。2007/02/04(日) 20:17:39
>>837
PerlやRubyは考慮しないのかな、ということではないかと。

シェルスクリプトにはパズル的なおもしろさはあるけど、
若干の無理矢理感はあるし、外部コマンド使いまくりでモタモタするし。
08408312007/02/04(日) 20:36:39
>>839
なるほど。
モタモタして時間がかかるのは確かだしね。
つか、俺的にはPerlもRubyもシェルスクリプトの1コマンド、という認識。
Rubyはよく知らんけど
Perlはシェルスクリプトと比べて意味がわかりづらいので
なかなか重い腰が上がらないんだよね。

あと、こういうデータを元にして動的なWebコンテンツをつくるには
やっぱphpでつか?
0841名無しさん@お腹いっぱい。2007/02/04(日) 20:52:56
>>840
なんでもええよ。
シェルスクリプトでもいいし。
ある程度アクセス数が多くなるなら、シェルスクリプトではきついけどね。
0842名無しさん@お腹いっぱい。2007/02/04(日) 23:39:23
>>840
そんなあなたにはRubyお薦め。
Perl挫折した俺が言うんだからまちがいない。
0843名無しさん@お腹いっぱい。2007/02/05(月) 00:30:47
俺の知合いにはコマンドラインのちょっとしたスクリプトにもphpを使う奴がいるし、
その一方でウェブサービスをC++で書いたCGIで実現している奴もいる。
言語自体の得意分野や不得意分野があるのはその通りかも知れんが、
慣れた言語で適当にやるのも重要であるのだと思うぜ。所詮スクリプト。

そんな俺はPHPをおすすめしておこうかな
0844名無しさん@お腹いっぱい。2007/02/05(月) 00:40:44
bash最強、次点tcsh
0845名無しさん@お腹いっぱい。2007/02/05(月) 01:23:19
>>840
動的なWebコンテンツというなら、テキスト処理に長けていることが条件かな。
PHPでもPerlでもRubyでも、あるいは他のものでもいいと思う。
慣れているものを選べばいいのでは。
どれも初めてトライというなら、適当に情報を拾って見比べてみて、
自分に合いそうだと思ったものにすればいんじゃね?

シェルスクリプトは、テキスト処理能力に関しては
長けた言語と比べるとかなり見劣りする。
ちょっと凝ったものになると素のシェルスクリプトではとても苦しい。
>>837ぐらいの処理なら、シェルスクリプト(+awkやsed)でもどうにかなるだろうけど。
0846名無しさん@お腹いっぱい。2007/02/05(月) 16:28:42
cat hoge.txt | sort って何でcat要らんの??
0847名無しさん@お腹いっぱい。2007/02/05(月) 16:37:56
cat -sとか cat -nとかするなら意味があるけど、ふつうは
sort < hoge.txt
で済むから。
08488312007/02/05(月) 16:59:15
>>841
そうですか。ありがとう。
>>843
phpも挑戦したことはあるけど
なんかやっぱPerlほどではないけど小難しい感じがしました・・。

>>842
Rubyですか。
使ったことないけど今確認したら
ちゃんとMacOSXにもプリインストールされてるみたいなので、
Perlに挫折した俺としてもRubyに挑戦してみようかな。
日本人が作ったみたいだしね。
0849名無しさん@お腹いっぱい。2007/02/05(月) 17:08:42
>>847
非常に解りやすい説明をありがとう。
0850名無しさん@お腹いっぱい。2007/02/06(火) 22:48:39
>>847
sort hoge.txt
の方が1文字少ない
0851名無しさん@お腹いっぱい。2007/02/06(火) 22:53:30
>>850
sort hoge.txt だと、もしhoge.txtが存在しないか、またはpermission deniedの場合
にも、一旦sortコマンドが起動された後でエラーになるため、ちょっと無駄になる。
sort < hoge.txtだと、hoge.txtが読めない場合はシェルのレベルでエラーになり、
sortコマンド自体起動されないので無駄がない。
0852名無しさん@お腹いっぱい。2007/02/06(火) 23:27:58
というより、質問がsortだったから引数に書けたってだけの話だな。
trみたいなファイルを引数に取らないのもあるわけで。

cat hoge.txt | tr a-z A-Z → tr a-z A-Z < hoge.txt
0853名無しさん@お腹いっぱい。2007/02/06(火) 23:30:26
なるほどね
0854名無しさん@お腹いっぱい。2007/02/06(火) 23:46:29
cat hoge.txt | tr a-z A-Z
確かに、こっちの方がcat以外でも同じ書き方になるから、ぱっと見わかりやすいか。
0855名無しさん@お腹いっぱい。2007/02/06(火) 23:56:45
そんなあなたに
< hoge.txt tr a-z A-Z
0856名無しさん@お腹いっぱい。2007/02/07(水) 00:08:15
>>855
知らなかった
0857名無しさん@お腹いっぱい。2007/02/07(水) 00:36:54
tr < hoge.txt a-z A-Z
なんてのも可だったり。
08588312007/02/07(水) 03:53:44
普通にcat hoge.txt | tr a-z A-Zに一票。

理由
・初心者がパイプの意味を理解するのに適している
・ < を使う方法と大差ない
・後ろから < で入力とか気持ち悪い
0859名無しさん@お腹いっぱい。2007/02/07(水) 04:18:00
>>858
理由の一つ目は、リダイレクトなら
「初心者がリダイレクトの意味を理解するのに適している」
と言い換えられるな。

理由の二つ目は、全然「catの方がいい」理由にはなってないな。
あんたにとって「大差ない」かもしれないが、少なくとも
タイプ量が多いし、無駄なプロセスも増える。

理由の三つ目は、もはや意味不明だな。何だそりゃ。
シェルのシンタクスが非常に美的であるとは俺も言わないが、
リダイレクトはシェルの基本だろ。
0860名無しさん@お腹いっぱい。2007/02/07(水) 09:15:44
初心者にそういう使い方教えると、>>858のようなダメ人間ができあがる。
0861名無しさん@お腹いっぱい。2007/02/07(水) 09:44:29
まあ、両方わかるようにしておけばいいじゃない
0862名無しさん@お腹いっぱい。2007/02/07(水) 11:15:52
>>860
アンカ間違ってるぞ。 正しくは >>859 だろう。
0863名無しさん@お腹いっぱい。2007/02/07(水) 11:22:45
>>862
自演乙。
ダメ人間は >>858
0864名無しさん@お腹いっぱい。2007/02/07(水) 11:22:46
>>850
sort<hoge.txt
で文字数いっしょだ。
0865名無しさん@お腹いっぱい。2007/02/07(水) 11:29:17
自演じゃないし >>859 は間違いなくダメ人間だ。
0866名無しさん@お腹いっぱい。2007/02/07(水) 11:38:54
まあ、両方できるようにしておけばいいじゃない
0867名無しさん@お腹いっぱい。2007/02/07(水) 11:39:58
次の方どうぞ〜
0868名無しさん@お腹いっぱい。2007/02/07(水) 12:56:56
パイプで処理結果をつなげていくっていうのがわかりやすいってことだろ
cat hoge して中身を見て,その結果を | で別のコマンドに流し込んで...
という部分を省略できるようになると冗長と感じるわけで

オレはコマンドライン編集を使いながら書いていく方が多いから
いまだに cat hoge | から始まるよ

% cat hoge
...出力...
% cat hoge | awk -F: '{print $1, $8}'
...出力...
% ...

そりゃ後から見ながら最適化すれば < hoge とか
コマンドの引数に hoge 指定とかになるんだが
0869名無しさん@お腹いっぱい。2007/02/07(水) 12:59:13
>>868
初心者ですが、catの左側にある % というのは何のコマンドですか?
うちでは % を付けるとエラーになるのですが・・
0870名無しさん@お腹いっぱい。2007/02/07(水) 13:08:30
中身見るのにcat使う習慣はないなぁ。
英語のテキストならless、日本語ならlv、構文のあるテキストファイルならvim、バイナリならbvi。
よってcatは本当に結合したい時にしか使わんが、人それぞれか。
0871名無しさん@お腹いっぱい。2007/02/07(水) 13:09:09
一般ユーザのシェルのプロンプト。$とおなじ。
Bourneシェルのデフォルトが$、Cシェル系は%なので両方が見られる。
0872名無しさん@お腹いっぱい。2007/02/07(水) 13:13:10
マジレスはご遠慮ください。
0873名無しさん@お腹いっぱい。2007/02/07(水) 13:13:55
マジレス上等
ゴマエー
0874名無しさん@お腹いっぱい。2007/02/07(水) 13:22:21
>>859がダメ人間(かどうかは知らん)という命題と、>>858がダメ人間(これは確実)
という命題はは排他ではない。
0875名無しさん@お腹いっぱい。2007/02/07(水) 13:27:51
ははは 可愛い奴だなぁ
08768312007/02/07(水) 15:31:42
>>868
そうそう、まさにそのとおり。
俺もそんなやり方でやっている。
viとかpicoとかでは>>868のような処理はできんだろ。

意味分かる?w
0877名無しさん@お腹いっぱい。2007/02/07(水) 15:55:26
$ < hoge cat
...出力...
$ < hoge cat ← ここで Ctrl-Wを押す
$ < hoge ← catが消える
$ < hoge awk -F: '{print $1, $8}'
...出力...


↑こうすれば無問題。無駄なcatやパイプは要らない。
■ このスレッドは過去ログ倉庫に格納されています