シェルスクリプト総合@LINUX Part4at LINUX
シェルスクリプト総合@LINUX Part4 - 暇つぶし2ch895:login:Penguin
09/03/01 14:21:53 b0tpnlkt
"A B C D E F"を
"B A D C F E"にしたり、

A
B
C
D
E
F



B
A
D
C
F
E

にしたりできますか?

つまり、AとBを入れ替え、CとDを入れ替え・・・ってな具合です。

896:login:Penguin
09/03/01 14:54:34 yaPGqr8Y
>>895
宿題乙。

一行タイプのやつ
sed -e 's/ /\
/g' | sed -e '1~2{h;d};1~2!G' | xargs

複数行タイプのやつ
sed -e '1~2{h;d};1~2!G'

897:login:Penguin
09/03/01 15:06:32 ClVN3cK/
>>895

echo 'A B C D E F' | tr 'ABCDEF' 'BADCFE'

898:login:Penguin
09/03/01 16:12:08 jusYIGdM
bash3 とbash4 って互換性大丈夫でしょ。

899:login:Penguin
09/03/01 16:45:01 b0tpnlkt
>>896>>897
素晴らしい!!
吹雪の最中に神が現れて、いきなり春になったような心境です。
ありがとうございました。

900:login:Penguin
09/03/05 13:25:03 k1KCKSK5
原子番号を元素記号に変換してください。
例)
8  → O
26 → Fe
92 → U





901:login:Penguin
09/03/05 15:44:08 7EIm6RPk
>>900
宿題は自分でやれ。

902:login:Penguin
09/03/05 15:55:50 3/9eCgJO
まず原子番号とそれに対応する元素記号の
テーブルを作成するところからはじめよう。

903:login:Penguin
09/03/05 23:21:24 BnKU6WpI
水素なら
w3m -dump URLリンク(ja.wikipedia.org) | awk '$1 ~ /^1$/{print $3}

ヘリウムなら/^1$/を/^2$/に変える。

904:login:Penguin
09/03/05 23:24:25 feEdgCm8
echo O > 8
echo Fe > 26
echo U > 92

cat %1




俺天才かもしれん。

905:login:Penguin
09/03/05 23:25:16 feEdgCm8
間違えた。。。


cat $1だ。

906:login:Penguin
09/03/05 23:35:39 BnKU6WpI
#!/bin/bash
#grepバージョン
w3m -dump URLリンク(ja.wikipedia.org) | grep "^"$1"[[:space:]]"



907:login:Penguin
09/03/06 00:15:22 4E0LodKQ
>>903
つ awk -v x=番号 '$1 ~ "^" x "$" { print $3 }'

908:login:Penguin
09/03/06 02:41:09 0+Otyqrv
全部if文でやれ。

909:login:Penguin
09/03/06 11:10:42 Es9Fr0vK
w3m -dump URLリンク(ja.wikipedia.org) | perl -ane 'for (1..118) { print "$_: $F[2]\n" if $F[0]=~/^$_$/;}'

910:login:Penguin
09/03/06 19:13:45 m/0+PDHQ
一覧表示でいいなら、これが楽だろ
w3m -dump URLリンク(ja.wikipedia.org) | awk '/^[0-9]/{print $1,$3}'


911:login:Penguin
09/03/06 20:23:52 +R69oXB9
こんなの波動だ

#!/bin/bash
echo 原子番号は
syuuki=~/syuuki
w3m -dump URLリンク(ja.wikipedia.org) |awk '/^[0-9]/{print $1,$3}' - >$syuuki
read genso
echo 原子番号$gensoの元素記号は`grep $genso ~/syuuki`です。


grepが未完成 記号だけにしたい。

912:login:Penguin
09/03/06 22:47:09 tq3ZQvrP
echo 原子番号$gensoの元素記号は`ruby -ane 'BEGIN{genso = ARGV[1]}; if $F[0] == genso; p $F[1]; break; end' ~/syuuki $genso`です。


913:login:Penguin
09/03/07 09:01:58 Qelg+V+C
「原子番号」「の元素記号は」などと書かんでいいから、
改行を入れて見やすくしろ、カス。

914:login:Penguin
09/03/07 20:47:19 zmyZifQf
というかレポートに出すんだからさ
もっと初心者っぽく書いてください
期限は明日までです



915:login:Penguin
09/03/07 21:07:11 cObxxbWz
よし!
やっぱり自分でやろう!

みなさんすいませんでした。忘れてください

916:login:Penguin
09/03/07 21:41:55 pgHRyspE
>>914>>915
w3m -dump URLリンク(d.hatena.ne.jp) | grep "^.ね.*に$"


917:login:Penguin
09/03/08 16:51:10 xQcHQnf7
Perlがあればシェルスクリプトなんて要らない
Perlのほうが高機能だから

918:login:Penguin
09/03/08 17:20:38 J6Fw6OuS
Perl は外部コマンド一つ呼ぶのにいちいち system() とか書かなきゃいけない時点で問題外でしょ。
シェルスクリプトは外部コマンドの呼び出しがとても多いんだから、文法レベルでサポートされてないとやってられない。

919:login:Penguin
09/03/08 18:43:54 4ovvgVHR
$date = `date`;

920:login:Penguin
09/03/08 19:34:58 J6Fw6OuS
ごめん、見直した。

921:login:Penguin
09/03/10 18:06:25 IwU0KhJ5
シェルスクリプトってOOじゃないんでしょ?
ダサっ

Perl使えない落ちこぼれが使う言語、それがシェルスクリプト

922:login:Penguin
09/03/10 19:16:49 ZRv0wOpe
xargsとsedで文字列加工をしようとしたがうまくいきません
コマンド|xargs -n 1 sed ~ だとコマンドの出力内容がファイル名として解釈されるし
コマンド|xargs -n 1 echo|sed ~ だとxargsがない場合と同じ動作になります
別にシェルスクリプトを
echo ${1}|sed ~ と作って
コマンド|xargs -n 1 スクリプト とすると sed -e "s/~ の s が未定義と怒られる
他に方法はありますか?

923:login:Penguin
09/03/10 21:34:04 t8WYWXe4
>>921
OO という観点で議論するなら perl じゃなくて
もっとまともな言語と比較しろよ。

924:login:Penguin
09/03/10 21:51:10 hrcV3cEG
>>922
sed ~ `コマンド`

とか?

925:login:Penguin
09/03/10 22:33:24 HaCEu7vE
>>921
よりによって最も汚いOOを持つ言語を引っ張り出してきたな。。。

926:login:Penguin
09/03/10 23:10:33 XmHUdl+t
317 名前:名無しさん@お腹いっぱい。 []: 2009/03/10(火) 18:05:12
シェルスクリプトってOOじゃないんでしょ?
ダサっ

927:login:Penguin
09/03/10 23:13:24 21j8Lv5u
そもそも、ほとんどの処理を外部のコマンドに投げているのに
OOはどういうことなのだろうか?

928:login:Penguin
09/03/10 23:17:44 wgUyESoz
>>922
同僚に聞いてみたんだが、xargs なしだとだめなの?
たとえば、ファイル名の置換なら
 $ find . -print|sed -e "s/~
になると思うんだけど。
(for i in `find .`~ のほうが使いやすいと思うが)

それか
 $ コマンド|xargs -i echo {}|sed -e "s/~
とか?
コマンドのところとか、sed で何をしたいのかを明確に
してもらえればもうちょっと回答のしようがあると思う。

929:922
09/03/10 23:39:56 ZRv0wOpe
>>924
コマンドの結果がファイル名として認識されました。

>>928
xargsなしで今はやっています。
メイク時の出力内容をVC方式に変換するために文字列を以下のように変換しています。
make debug 2>&1 | sed -e "s/:\([0-9][0-9]*\):/(\1):/g" | sed "s/[/]/\\\/g" | sed "s/^/c:\\\cygwin\\\home\\\\${USER}\\\\${PROJNAME}\\\source\\\/g"
ただし、今の状態だとメイクが完了するまで出力がされないため、
メイクがどの程度進んでいるかの確認や、エラー/ワーニングにすぐ対応できないのです。

また、できれば2の出力だけをパイプに流したいのですが、方法はありますか?
(1は普通に画面表示)
イメージは make debug 2>( xargs -n 1 echo|sed ~) です。

ちなみに コマンド|xargs -i echo {}|sed -e "s/~ は
c:\cygwin\home\ユーザ名\プロジェクト名\source\{} 出力された文字列
となり、うまくいきませんでした。
# echo "{} 文字列" と認識された?

930:login:Penguin
09/03/11 02:34:25 LOMFWb0Z
>>929
xargs -iの後の{}は'{}'みたくエスケープしないとダメなんじゃないの?

931:login:Penguin
09/03/11 08:59:36 DFgGOxJ9
Windows PowerShellはOOなのに
シェルスクリプトはOOじゃないんだよね

時代遅れだね

932:login:Penguin
09/03/11 14:33:02 Z5TO7Bpy
>>929
>211
sed -u ~

933:login:Penguin
09/03/11 21:43:30 bm/c4JTk
>>931
死ぬほど使いにくいけどな。WindowsPowerShell。


934:login:Penguin
09/03/11 22:32:39 q2e6tqEw
つか、オブジェクト指向が反省されている今になって、何を時代錯誤な事を言ってる人なんだ。

935:login:Penguin
09/03/13 11:15:15 6BZk1deA
c++やjavaのoopはあまり良いものではないからね。
特にjavaでしかoopを知らない人って、なんでもかんでもオブジェクト
にしてしまうだろうし、あれは非効率的なんだよね。
oopも使えるというならそれはそれでいいけどシェルスクリプトの延長線上
にrubyやperlがあるから、oopに拘るならばそっちを使えばいいだけのはなしだよね。

936:login:Penguin
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とか。


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