09/03/18 18:33:49 RWYXndAF
くだ質の763に、du -hの結果をサイズ順にソートしたいってのがあった。
$ df -h
20K ./foo
8.0K ./bar
5.1M ./hoge
元質問者は勘違いってことで解決してるんだけど、これをカッコよく1 linerで実現する方法はあるんだろうか?
置換して~ソートして~とか、泥臭い方法しか思いつかない...
937:login:Penguin
09/03/19 00:49:00 Ex8kaKKQ
>>936
-h外して後で1024の倍数掛ければいい
938:login:Penguin
09/03/19 01:30:46 1vjKEAU9
俺もそう思うけど、
>>936が話題にしているのは、たぶんdfに限らず、単位を接尾辞とした小数数字を如何にsortするかじゃないかな。
939:login:Penguin
09/03/19 01:33:02 VEb9NHr7
そーじゃなくて>>936の出力をソートするスクリプトがあるか、だろう
おれも置換したりしないと出来値
940:login:Penguin
09/03/19 01:34:48 gobNSPAB
>>937
-hは前提条件でお願い。します。
941:login:Penguin
09/03/19 01:36:54 dcED7bZL
しかしdu -h も微妙なコマンドだな
KつきMつきで見たいやつが大半だろうにソートもできるようにしてくれよって気が
942:login:Penguin
09/03/19 03:20:47 yCb470li
bashで引数が0-9の間ならダンプレベルに設定しようとしています
if [ -n $1 ]; then
if [ $1 -ge 0 -a $1 -le 9 ]; then
dlevel=$1
fi
fi
これを実行すると引数が無いときと
引数が数字以外のときにエラーメッセージが出てしまいます
引数が数値かどうかチェックする方法がないでしょうか?
よろしくおねがいします
$ ./dump.sh
./dump.sh: line 22: [: too many arguments
$ ./dump.sh 3
dlevel=3 期待通りの動き
$ ./dump.sh fufufu
./dump.sh: line 22: [: fufufu: integer expression expected
943:login:Penguin
09/03/19 04:02:43 3RRVnfG+
if [ -n "$1" ]; then
if expr "$1" : '[0-9][0-9]*$'; then
944:login:Penguin
09/03/19 04:04:43 M6oJqh1N
case "$1" in
[0-9])
dlevel="$1"
;;
esac
945:login:Penguin
09/03/19 04:57:28 yCb470li
>>943, 944
どうもありがとうございます
caseの方を採用させていただきました
946:login:Penguin
09/03/19 13:59:30 KDP/tv8i
>>937-941
やぱしそれなりに泥臭いやり方しかないですかね? 最初、sortはバッファサイズ変更時に
GBとかMBとか見てくれるんだからきっと、とか思ったのに。
947:login:Penguin
09/03/19 14:48:56 +WS3QA7Q
-h 外せば済む話なのに
苦労してスクリプト書く意味がわからん。
948:login:Penguin
09/03/19 15:44:21 VEb9NHr7
目的が「duの結果をソートしたい」じゃなくて「このテキストを(意味を考えて)ソートしたい」だと何度(ry
949:login:Penguin
09/03/19 15:54:38 QnAt/IUj
>>948
dfかduかはっきりしてくれ。duならxduをつかっとけ。MやGよりも視覚的にサイズを
表現してくれた方が分かりやすい。もちろんソートできる。
950:login:Penguin
09/03/19 19:05:34 KDP/tv8i
>>949
元質問はオレなんだが、>>948のとおり、別にduでもdfでもなく、GとかMとかのサイズ指定で
かつ小数点付きのを、どうソートするか、というのが意図だったわけで。
質問の仕方がまずいのは認める。すまん。
951:login:Penguin
09/03/20 10:34:47 OD1Bm4W7
シェルスクリプトで開発したツールをshcでコンパイルしたとして、
それがシェルスクリプトだとバレることってありますか?
もちろん調べればわかるでしょうけど
一般的なエンドユーザの能力ではどうでしょうか?
952:login:Penguin
09/03/20 11:49:16 vtofDqpI
>>951
つ chmod 311 a.out
953:login:Penguin
09/03/20 21:45:28 Pky/qqR2
tar
954:login:Penguin
09/03/20 21:46:03 Pky/qqR2
tar tvf filename.tar
の結果をファイル名順にソートするにはどうすればいいでしょうか?
955:login:Penguin
09/03/20 21:54:15 vtofDqpI
sort -k 6
956:login:Penguin
09/03/20 22:29:18 Pky/qqR2
>>955
ありがとうございます。以下で出来たと思います。
tar tvf filename.tar | sort -k 6
ファイル名が9番目に来ることがあるのは、OSによるものでしょうか?
957:login:Penguin
09/03/20 22:30:46 vtofDqpI
ロケール依存じゃね?
日付の表示
958:login:Penguin
09/03/20 22:45:25 Pky/qqR2
>>957
なるほど、ありがとうございます。
当初の質問とズレますが
ls -lRのディレクトリ名が
職場の環境では
temp:
となり
自宅では
./temp:
となるのもロケール依存の問題でしょうか?
959:login:Penguin
09/03/20 23:54:41 vtofDqpI
ls -lR temp
ls -lR
の違いって事はない?
960:login:Penguin
09/03/21 10:08:06 /JVnxKfV
>>959
引数にディレクトリを指定せずに>>958の違いがでます。
OSは職場がAIXで、自宅がCentOSです。
結果のリストをテキストファイルに出力してプログラムで利用しているので、
フォーマットが違うと問題があるのですが、
行末に「:」があればディレクトリと認識したり、リストのフォーマットに応じたプログラムを
書けばいいのかなと思います。
親切にありがとうございました。
961:login:Penguin
09/03/21 13:39:10 ZdP11rWE
AIXならコードベースが違うから、細かい書式も違うだろうね。
find . -printあるいはfind . -lsの結果を利用した方がいいかもね。
こっちは加工されることを前提とした出力だから。
ls -lRはそうじゃない。
962:login:Penguin
09/03/24 21:43:58 vhkRQKv/
bash で、複数の戻り値を返すにはどうやる?
func foo()
{
return VAL1 VAL2
}
(VAL1, VAL2)=$(foo)
こんなのがやりたいんだけど。
今まで思いついた例では、
1、ファイル経由で帰す。
echo $VAL1 >/tmp/$PID.val1
echo $VAL2 >/tmp/$PID.val2
可能だけどちょっと無駄。
2、readをつかう。
#!/bin/bash
$(foo) | read VAL1 VAL2
やってみたけど、動かない。なんとかしてくれ!。
963:login:Penguin
09/03/24 22:07:39 fdZEc0lM
returnで返すことにこだわる意味があるん?
VAL1 VAL2 に関数内で値つっこめばいいだけじゃないの?
グローバル変数がどうのとか、シェルで気にする必要ないだろと個人的に思うし。
964:login:Penguin
09/03/24 22:13:47 JcSO3hFa
>>962
URLリンク(www.linux.or.jp)
>関数ローカルの変数は、組み込みコマンド local で宣言できます。
>普通は、変数とその値は関数とその呼び出し側で共有されます。
965:962
09/03/24 23:09:01 vhkRQKv/
グローバル変数で受け渡し?
んまあそうなんですけど、
なんでもグローバルという、BASIC言語みたいなのは生理的にイヤ。
可能な限り普段から全部 local 宣言つけてますので。
なんとか、return VAL_A VAL_B
とかムリっすか?
966:login:Penguin
09/03/24 23:27:22 JcSO3hFa
>>965
無理
> return [n]
> 指定した返り値 n で関数を終了させます。
> n を省略すると、返却ステータスは関数内で最後に実行したコマンドの返却ステータスになります。
スクリプトを分けて標準入出力で受け渡すくらいしか思いつかん
967:login:Penguin
09/03/24 23:31:50 elKnmt6d
俺も昔戻り値二つ返したかったが諦めたことがある。
泣く泣くグローバルにした。
968:login:Penguin
09/03/24 23:32:20 LPmFGK87
>>965
無理矢理だけどこんなことは出来る。
foo ()
{
echo "$VAL1 $VAL2"
}
VALS=(`foo`)
VAL1=${VALS[0]}
VAL2=${VALS[1]}
969:login:Penguin
09/03/25 12:00:35 ZZ2mmRGj
グローバル変数がイヤならばそもそも sh じゃなくて別のスクリプト言語で書け。
そういう言語なんだからあきらめて受け入れろ。
無理に技巧をこらしたところで逆に可読性を落とすだけ。
970:login:Penguin
09/03/25 12:15:44 NaCjRRoe
>>969
そうおもう。perlでもrubyでもgaucheでもいいから。
でも、延長線上で使えるrubyのほうが馴染みやすいかも
971:login:Penguin
09/03/25 12:23:07 uD+uLQB8
>>962
> return VAL1 VAL2
< echo VAL1 VAL2
してreadしる
972:login:Penguin
09/03/25 17:28:54 GtIifwrA
/tmpに書け
973:login:Penguin
09/03/26 15:32:50 3e22XvSN
シェルスクリプトを始めて勉強するのですが、
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界(URLリンク(www.amazon.co.jp))
と
UNIXシェルスクリプトコマンドブック(URLリンク(www.amazon.co.jp))
どちらで勉強するのが良いでしょうか?
974:973
09/03/26 15:33:45 3e22XvSN
×始めて
○初めて
orz
975:login:Penguin
09/03/26 16:30:55 5RpvIQgk
入門bashがオヌヌメ
976:login:Penguin
09/03/27 00:19:45 hx4pY+SP
どれでもいっしょでヌメヌメ
977:login:Penguin
09/03/27 01:38:27 SSuQKmC1
>>976
>>975
ありがとうございます。
まずは>>975さんにヌメヌメして頂いた入門Bashから勉強していきたいと思います。
978:login:Penguin
09/03/27 02:32:52 3RSixa0K
つ「全部」
979:login:Penguin
09/03/29 04:23:46 k6vYgSJE
とあるディレクトリ以下に存在する
特定の拡張子のファイルのみについてファイルサイズの合計を知りたい場合、
最もマシンに負荷を与えずに結果を出すにはどの方法が適しているでしょうか?
・ duコマンドだと除外パターンのパラメータしかない
・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる
という感じで、もっとサクっと結果を軽い処理で出せるような気がするんですが・・・。
980:login:Penguin
09/03/29 05:38:56 RIZc4nP9
findとawkで
981:login:Penguin
09/03/29 07:07:03 HsEQt0tU
>・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる
expr要るのか?
ls -Rl | grep "\.suffix" | awk '{size += $5} END {print "total " size}'
find -name \.suffix -printf "%s\n" | awk '{size += $1} END {print "total " size}'
982:login:Penguin
09/03/29 15:49:16 HhnBqalt
>-name \.suffix
o... rz
983:login:Penguin
09/03/30 08:01:30 4/oTu4d/
10台くらいサーバセットアップする必要があり、
それぞれのapacheの設定ファイルのIP部分だけ変えたいのですが、
何かシンプルで良い方法ってあるでしょうか?
環境変数設定kono_server_no_ipを設定して、
sedあたりで設定ファイルのIP部分をkono_server_no_ipに置換処理、
みたいな感じをぱっと思いついたのですが、
もっとベターな方法ってあるでしょうか?
984:login:Penguin
09/03/30 10:33:16 rBZKWvDE
>>983
まずサーバ毎の環境変数(kono_server_no_ip)の設定はどうやるの?
環境変数の設定をエディタでやったら本末転倒だよね?
「このIP」が自分自身のipアドレスでいいなら、ifconfigで取得してsedで置換。
あと、シンプルじゃなくていいならPuppetとか。