895 :
login:Penguin :
2009/03/01(日) 14:21:53 ID: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を入れ替え・・・ってな具合です。
>>895 宿題乙。
一行タイプのやつ
sed -e 's/ /\
/g' | sed -e '1~2{h;d};1~2!G' | xargs
複数行タイプのやつ
sed -e '1~2{h;d};1~2!G'
>>895 echo 'A B C D E F' | tr 'ABCDEF' 'BADCFE'
bash3 とbash4 って互換性大丈夫でしょ。
>>896 >>897 素晴らしい!!
吹雪の最中に神が現れて、いきなり春になったような心境です。
ありがとうございました。
900 :
login:Penguin :2009/03/05(木) 13:25:03 ID:k1KCKSK5
原子番号を元素記号に変換してください。 例) 8 → O 26 → Fe 92 → U
902 :
login:Penguin :2009/03/05(木) 15:55:50 ID:3/9eCgJO
まず原子番号とそれに対応する元素記号の テーブルを作成するところからはじめよう。
903 :
login:Penguin :2009/03/05(木) 23:21:24 ID:BnKU6WpI
echo O > 8 echo Fe > 26 echo U > 92 cat %1 俺天才かもしれん。
間違えた。。。 cat $1だ。
>>903 つ awk -v x=番号 '$1 ~ "^" x "$" { print $3 }'
全部if文でやれ。
911 :
login:Penguin :2009/03/06(金) 20:23:52 ID:+R69oXB9
echo 原子番号$gensoの元素記号は`ruby -ane 'BEGIN{genso = ARGV[1]}; if $F[0] == genso; p $F[1]; break; end' ~/syuuki $genso`です。
「原子番号」「の元素記号は」などと書かんでいいから、 改行を入れて見やすくしろ、カス。
というかレポートに出すんだからさ もっと初心者っぽく書いてください 期限は明日までです ↓
よし! やっぱり自分でやろう! みなさんすいませんでした。忘れてください
917 :
login:Penguin :2009/03/08(日) 16:51:10 ID:xQcHQnf7
Perlがあればシェルスクリプトなんて要らない Perlのほうが高機能だから
Perl は外部コマンド一つ呼ぶのにいちいち system() とか書かなきゃいけない時点で問題外でしょ。 シェルスクリプトは外部コマンドの呼び出しがとても多いんだから、文法レベルでサポートされてないとやってられない。
$date = `date`;
ごめん、見直した。
921 :
login:Penguin :2009/03/10(火) 18:06:25 ID:IwU0KhJ5
シェルスクリプトってOOじゃないんでしょ? ダサっ Perl使えない落ちこぼれが使う言語、それがシェルスクリプト
xargsとsedで文字列加工をしようとしたがうまくいきません コマンド|xargs -n 1 sed 〜 だとコマンドの出力内容がファイル名として解釈されるし コマンド|xargs -n 1 echo|sed 〜 だとxargsがない場合と同じ動作になります 別にシェルスクリプトを echo ${1}|sed 〜 と作って コマンド|xargs -n 1 スクリプト とすると sed -e "s/〜 の s が未定義と怒られる 他に方法はありますか?
>>921 OO という観点で議論するなら perl じゃなくて
もっとまともな言語と比較しろよ。
>>921 よりによって最も汚いOOを持つ言語を引っ張り出してきたな。。。
317 名前:名無しさん@お腹いっぱい。 []: 2009/03/10(火) 18:05:12 シェルスクリプトってOOじゃないんでしょ? ダサっ
927 :
login:Penguin :2009/03/10(火) 23:13:24 ID:21j8Lv5u
そもそも、ほとんどの処理を外部のコマンドに投げているのに OOはどういうことなのだろうか?
>>922 同僚に聞いてみたんだが、xargs なしだとだめなの?
たとえば、ファイル名の置換なら
$ find . -print|sed -e "s/〜
になると思うんだけど。
(for i in `find .`〜 のほうが使いやすいと思うが)
それか
$ コマンド|xargs -i echo {}|sed -e "s/〜
とか?
コマンドのところとか、sed で何をしたいのかを明確に
してもらえればもうちょっと回答のしようがあると思う。
929 :
922 :2009/03/10(火) 23:39:56 ID: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 "{} 文字列" と認識された?
>>929 xargs -iの後の{}は'{}'みたくエスケープしないとダメなんじゃないの?
931 :
login:Penguin :2009/03/11(水) 08:59:36 ID:DFgGOxJ9
Windows PowerShellはOOなのに シェルスクリプトはOOじゃないんだよね 時代遅れだね
>>931 死ぬほど使いにくいけどな。WindowsPowerShell。
つか、オブジェクト指向が反省されている今になって、何を時代錯誤な事を言ってる人なんだ。
c++やjavaのoopはあまり良いものではないからね。 特にjavaでしかoopを知らない人って、なんでもかんでもオブジェクト にしてしまうだろうし、あれは非効率的なんだよね。 oopも使えるというならそれはそれでいいけどシェルスクリプトの延長線上 にrubyやperlがあるから、oopに拘るならばそっちを使えばいいだけのはなしだよね。
くだ質の763に、du -hの結果をサイズ順にソートしたいってのがあった。 $ df -h 20K ./foo 8.0K ./bar 5.1M ./hoge 元質問者は勘違いってことで解決してるんだけど、これをカッコよく1 linerで実現する方法はあるんだろうか? 置換して〜ソートして〜とか、泥臭い方法しか思いつかない...
>>936 -h外して後で1024の倍数掛ければいい
俺もそう思うけど、
>>936 が話題にしているのは、たぶんdfに限らず、単位を接尾辞とした小数数字を如何にsortするかじゃないかな。
そーじゃなくて
>>936 の出力をソートするスクリプトがあるか、だろう
おれも置換したりしないと出来値
しかしdu -h も微妙なコマンドだな KつきMつきで見たいやつが大半だろうにソートもできるようにしてくれよって気が
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
if [ -n "$1" ]; then if expr "$1" : '[0-9][0-9]*$'; then
case "$1" in [0-9]) dlevel="$1" ;; esac
>>943 , 944
どうもありがとうございます
caseの方を採用させていただきました
>>937-941 やぱしそれなりに泥臭いやり方しかないですかね? 最初、sortはバッファサイズ変更時に
GBとかMBとか見てくれるんだからきっと、とか思ったのに。
-h 外せば済む話なのに 苦労してスクリプト書く意味がわからん。
目的が「duの結果をソートしたい」じゃなくて「このテキストを(意味を考えて)ソートしたい」だと何度(ry
>>948 dfかduかはっきりしてくれ。duならxduをつかっとけ。MやGよりも視覚的にサイズを
表現してくれた方が分かりやすい。もちろんソートできる。
>>949 元質問はオレなんだが、
>>948 のとおり、別にduでもdfでもなく、GとかMとかのサイズ指定で
かつ小数点付きのを、どうソートするか、というのが意図だったわけで。
質問の仕方がまずいのは認める。すまん。
951 :
login:Penguin :2009/03/20(金) 10:34:47 ID:OD1Bm4W7
シェルスクリプトで開発したツールをshcでコンパイルしたとして、 それがシェルスクリプトだとバレることってありますか? もちろん調べればわかるでしょうけど 一般的なエンドユーザの能力ではどうでしょうか?
tar
tar tvf filename.tar の結果をファイル名順にソートするにはどうすればいいでしょうか?
sort -k 6
>>955 ありがとうございます。以下で出来たと思います。
tar tvf filename.tar | sort -k 6
ファイル名が9番目に来ることがあるのは、OSによるものでしょうか?
ロケール依存じゃね? 日付の表示
>>957 なるほど、ありがとうございます。
当初の質問とズレますが
ls -lRのディレクトリ名が
職場の環境では
temp:
となり
自宅では
./temp:
となるのもロケール依存の問題でしょうか?
ls -lR temp ls -lR の違いって事はない?
>>959 引数にディレクトリを指定せずに
>>958 の違いがでます。
OSは職場がAIXで、自宅がCentOSです。
結果のリストをテキストファイルに出力してプログラムで利用しているので、
フォーマットが違うと問題があるのですが、
行末に「:」があればディレクトリと認識したり、リストのフォーマットに応じたプログラムを
書けばいいのかなと思います。
親切にありがとうございました。
AIXならコードベースが違うから、細かい書式も違うだろうね。 find . -printあるいはfind . -lsの結果を利用した方がいいかもね。 こっちは加工されることを前提とした出力だから。 ls -lRはそうじゃない。
962 :
login:Penguin :2009/03/24(火) 21:43:58 ID: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 やってみたけど、動かない。なんとかしてくれ!。
returnで返すことにこだわる意味があるん? VAL1 VAL2 に関数内で値つっこめばいいだけじゃないの? グローバル変数がどうのとか、シェルで気にする必要ないだろと個人的に思うし。
965 :
962 :2009/03/24(火) 23:09:01 ID:vhkRQKv/
グローバル変数で受け渡し? んまあそうなんですけど、 なんでもグローバルという、BASIC言語みたいなのは生理的にイヤ。 可能な限り普段から全部 local 宣言つけてますので。 なんとか、return VAL_A VAL_B とかムリっすか?
966 :
login:Penguin :2009/03/24(火) 23:27:22 ID:JcSO3hFa
>>965 無理
> return [n]
> 指定した返り値 n で関数を終了させます。
> n を省略すると、返却ステータスは関数内で最後に実行したコマンドの返却ステータスになります。
スクリプトを分けて標準入出力で受け渡すくらいしか思いつかん
俺も昔戻り値二つ返したかったが諦めたことがある。 泣く泣くグローバルにした。
>>965 無理矢理だけどこんなことは出来る。
foo ()
{
echo "$VAL1 $VAL2"
}
VALS=(`foo`)
VAL1=${VALS[0]}
VAL2=${VALS[1]}
グローバル変数がイヤならばそもそも sh じゃなくて別のスクリプト言語で書け。 そういう言語なんだからあきらめて受け入れろ。 無理に技巧をこらしたところで逆に可読性を落とすだけ。
>>969 そうおもう。perlでもrubyでもgaucheでもいいから。
でも、延長線上で使えるrubyのほうが馴染みやすいかも
>>962 > return VAL1 VAL2
< echo VAL1 VAL2
してreadしる
/tmpに書け
974 :
973 :2009/03/26(木) 15:33:45 ID:3e22XvSN
×始めて ○初めて orz
入門bashがオヌヌメ
どれでもいっしょでヌメヌメ
つ「全部」
とあるディレクトリ以下に存在する 特定の拡張子のファイルのみについてファイルサイズの合計を知りたい場合、 最もマシンに負荷を与えずに結果を出すにはどの方法が適しているでしょうか? ・ duコマンドだと除外パターンのパラメータしかない ・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる という感じで、もっとサクっと結果を軽い処理で出せるような気がするんですが・・・。
findとawkで
>・ 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}'
>-name \.suffix o... rz
10台くらいサーバセットアップする必要があり、 それぞれのapacheの設定ファイルのIP部分だけ変えたいのですが、 何かシンプルで良い方法ってあるでしょうか? 環境変数設定kono_server_no_ipを設定して、 sedあたりで設定ファイルのIP部分をkono_server_no_ipに置換処理、 みたいな感じをぱっと思いついたのですが、 もっとベターな方法ってあるでしょうか?
>>983 まずサーバ毎の環境変数(kono_server_no_ip)の設定はどうやるの?
環境変数の設定をエディタでやったら本末転倒だよね?
「このIP」が自分自身のipアドレスでいいなら、ifconfigで取得してsedで置換。
あと、シンプルじゃなくていいならPuppetとか。
985 :
983 :2009/03/30(月) 20:43:17 ID:4/oTu4d/
>>984 なるほど
ありがとうございます
参考になりました
987 :
login:Penguin :
2009/03/30(月) 22:50:45 ID:sUoQYkDF VirtualHostといっても名前ベースとは限らないしな。 きっと金持ちなんだろう。