アカウント名:
パスワード:
若いシステム管理者がサーバメンテナンスのスクリプトを書いていたので肩越しに覗いてみましたよ。
テキストエディタ(Windowsの)の機能をフルに活用し、大量のコマンドをコピペコピペ、置換置換…というように並べて作ってましたね。
萎えた。
そこは、あーしてこーして、awkをちょちょいと振りかければ10行で書けるだろ?その方が作るのも早いし簡単。
せめてエディタはviでやったほうが、編集も早いよ。マウスでドラッグして選択とかやってられんだろ。
というわけで、プログラムとまでは行かないにしろ、スクリプト言語くらいはシステム管理者は使えた方がいいと思う。
シェルスクリプトを書けるか書けないかで、仕事の効率は10倍くらい違うことも。ていか、シェルスクリプトも書けないのにシステム管理者をさせてるのが悪い。
Windowsサーバの管理者も、Power Shellとか使えたほうがいいんじゃないかな。
プログラミングに肝心なのは、格好良く書くことではない。解りやすく、確実に動作することである。その意味からすれば、可能ならば書き並べてループや複雑な手続きを使わない方が優れたプログラミンなのである。まあ、私は昔8ビットのアセンブラーでグラフィックの描画を作っていたけど100命令程度ならループのオーバーヘッドを避けるため書き並べていたのでそう思うのかもしれないが。
プログラマーとしてはプロでも、システム管理者としてはド素人とお見受けする。
>プログラミングに肝心なのは、格好良く書くことではない。>解りやすく、確実に動作することである。
格好良く書けと主張した覚えはないけど?でも、ソースコードを格好よく書くというのは、解りやすく確実に動作するにはとても重要で肝心なところ(二重に強調させてもらうが)。ちゃんと動いているように見えるからと言って、ぐちゃぐちゃなソースコードは、ちゃんと動くかすらわからない。
となると、それを知らないあなたはプログラマーとしても素人なのかもしれないな。
>その意味からすれば、可能なら
1回しか実行しないプログラムやクエリであれば、Excelで作ってしまうのが楽で確実です。
その手のものなら、UNIXではbashなどのシェル、WindowsならPowerShellを使う方が楽。コピペすら必要ない。例えば、bashなら
for user in $(cat users.txt); do echo "command_for_user -option1 -option2 $user"; done
とか。伝統的には、awkを使って、
awk '{print "command_for_user -option1 -option2 ",$1}' users.txt
とか。結果を一旦バッチファイルに保存して実行しても良いし、パイプで/bin/shに食わせてもいいね。もちろん、もっと現代的な言語で書いてもいい。PowerShellなら、
Get-Content .\users.txt | ForEach-Object {"command_for_user -option1 -option2 $_"}
私はawkとかperlも使いますが、Excelもよく使ってます。
shとかawkを使う欠点はデータフォーマットですね。元データが単純なテキストとは限らないんですよ。1カラム中に空白が入ったりする場合もあるのでshのforは無理。場合によっては改行を含むデータもあったりするし。
改行がないデータなら、CSVにして awk 'BEGIN{FS="\",\""}… とする手抜きも出来るけど、先頭と末尾の"は残るし、ダブルクオート有りと無しが混在するCSVには無力。それをマジメに処理しようとしたらもはやワンライナーは無理。
そういったデータの元はExcelだったりする場合が多いので、下手に「スクリプト系で
まず。
僕は、できる限りマウス操作は避けるようにしてる。
Excelの大半の操作はキーボードでも可能ですし
まったくExcelを使わない、って言っているわけではないです。キーボードショートカットは、Excelに限らず、よく使ってますよ。TeraTermにコピペするときだって、キーボードショートカットですし。
1カラム中に空白が入ったりする場合もあるのでshのforは無理。
その程度なら、「無理」は言い過ぎだと思いますよ。デリミタが決まってるんだったら、なんとで
> デリミタが決まってるんだったら、なんとでもなりますから。awkの「-Fデリミタ文字 」オプションとかあるんだし。
そのあたりは元コメントでも書いてますが、デリミタに何を使うかが問題。定番のCSV(コンマ区切り)の場合、"a","b","c"のような、各カラムがダブルクオートされてる場合、FS='","'にしておけば、とりあえず分割できますが、最初が「"a」、最後が「c"」になってしまいます。さらに、ExcelなんかのCSV出力はクオートが必要なときだけクオートするので、a,"b,c",dみたいなデータになっちゃいますから、もはやawkでワンライナーなんて不可能です。
#ま、データをどうにでも選べるときは、CSVなんかではなく、TSV(タブ区切り)を使いますけど。こっちなら改行とかタブが入らない限りは簡単に処理できますし。でも、ExcelのTSV出力はそれはそれでトラブルが多いんだよなぁ。
で、私はどうしてもそんなデータを扱うときは、Perlで Text::CSVを使ったりしますが、はっきりいって、Excelで直接扱うより手間がかかります。定例処理として長期的な再利用がわかってる時ぐらいしか、そこまでやる気にはなれません。
> > 改行を含むデータもあったりするし。> そう言う場合だと、Excelでコマンド列を生成するのも結構大変
改行を含むカラムはコマンド列では使わない場合が多いですね。そういう場合に、「スクリプト処理用の、改行を削除したデータ」を生成するというワンクッションを入れるぐらいなら、Excelのままで処理、って感じで。
あと、元コメではコマンド列の生成だけでなくSQLの生成も例にあげてますけど、SQLの生成時には、改行を含むデータをそのまま出力させる必要がある場合も多いです。
みたいなデータになっちゃいますから、もはやawkでワンライナーなんて不可能です。
まあ、それは無理でしょうねえ。できる方法でやればいいじゃないですか。
しかし、私の経験から言うと、システム管理や構築の仕事では、そう言う難しいデータを元に作業することよりは、MS-Excelの入っていない環境で仕事することが多いです。
echo '"a","b","c"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
> echo '"a","b","c"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
echo '"a","b,c","d"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
で破綻しますね。
自分はpythonを使っていますが、CSV形式のファイルの扱いで困った事は無いですね。pythonのcsvモジュールは下記の特徴があり使いやすいです。・標準モジュールのため別途インストールする必要はない・SJIS、改行、"の有無など問題なく読み書きできる(excelとの相互運用が楽)・通常のファイルの読み書きと近しいコードで利用でき、難しくない
pythonはその特性上ワンライナーは苦手ですが、インタラクティブにコードが実行可能なので、ワンライナーのような試行錯誤や、そこそこの長さの手元のコードをサーバ上にスクリプトを置かず端末からのコピペで実行できたりします。
RHEL/CentOS系ならばyumでpythonが必要なため、perl/rubyがインストールされていない程の最小限な構成でも利用できます。また別の使い方としてはtelnetコマンドがインストールされていない状況で簡単にHTTPサーバやSMTPサーバとの疎通確認ができます。
$ python>>> import urllib>>> urllib.urlopen('http://www.example.com/')>>> import smtplib>>> smtplib.SMTP('mx.example.com')
# 最近はtelnetコマンドは標準でインストールされませんねぇ。
echo '"a","b,c","d"'|awk -F \,\" '{print $1,$2,$3}'|tr -d \"
これはどう?
また別の使い方としてはtelnetコマンドがインストールされていない状況
だから、そこはnc [blogspot.jp]だって。
> echo '"a","b,c","d"'|awk -F \,\" '{print $1,$2,$3}'|tr -d \"> これはどう?
CSVには・全てのカラムがクオートされているとは限らない・ダブルクオート文字そのものは、ダブルクオート二つで表現されるといった変態さがありますので。
「a,"b,""c",d」という行を処理して、「a」「b,"c」「d」という3カラムの抽出が期待されます。awkのFS指定とtrで処理するのは無謀です。
awkとtrのパイプ実行に比べて可読性は低くなるけどsedでガッチリ書けということですね。 orz
シェルスクリプトレベルで、処理が難しいCSVがあるのは、よく解るんだけど、いずれにせよ、そう言う難しいデータをCSVで処理しようってのが間違ってる気もするね。XMLやYAML、JSONとか(S式とか(笑))、他に扱いやすいフォーマットもあるんだから、そっちの方向で考えた方がいいんじゃないかなあ。MS-Excelの入っていない環境も珍しくは無いことを考えると、実機で作業する前にどう段取りするかが重要になってくるから、他にもっと便利なツールがあるんじゃない?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家
システム管理者プログラミング (スコア:1)
若いシステム管理者がサーバメンテナンスのスクリプトを書いていたので
肩越しに覗いてみましたよ。
テキストエディタ(Windowsの)の機能をフルに活用し、大量のコマンドを
コピペコピペ、置換置換…というように並べて作ってましたね。
萎えた。
そこは、あーしてこーして、awkをちょちょいと振りかければ10行で書けるだろ?
その方が作るのも早いし簡単。
せめてエディタはviでやったほうが、編集も早いよ。
マウスでドラッグして選択とかやってられんだろ。
というわけで、プログラムとまでは行かないにしろ、スクリプト言語くらいは
システム管理者は使えた方がいいと思う。
シェルスクリプトを書けるか書けないかで、仕事の効率は10倍くらい違うことも。
ていか、シェルスクリプトも書けないのにシステム管理者をさせてるのが悪い。
Windowsサーバの管理者も、Power Shellとか使えたほうがいいんじゃないかな。
素人は君だよ (スコア:0)
プログラミングに肝心なのは、格好良く書くことではない。
解りやすく、確実に動作することである。
その意味からすれば、可能ならば書き並べてループや複雑な手続きを使わない方が
優れたプログラミンなのである。
まあ、私は昔8ビットのアセンブラーでグラフィックの描画を作っていたけど
100命令程度ならループのオーバーヘッドを避けるため書き並べていたのでそう思うのかもしれないが。
Re: (スコア:1)
プログラマーとしてはプロでも、システム管理者としてはド素人とお見受けする。
>プログラミングに肝心なのは、格好良く書くことではない。
>解りやすく、確実に動作することである。
格好良く書けと主張した覚えはないけど?
でも、ソースコードを格好よく書くというのは、解りやすく確実に動作するにはとても重要で肝心なところ(二重に強調させてもらうが)。
ちゃんと動いているように見えるからと言って、ぐちゃぐちゃなソースコードは、ちゃんと動くかすらわからない。
となると、それを知らないあなたはプログラマーとしても素人なのかもしれないな。
>その意味からすれば、可能なら
Re: (スコア:0)
> 1人のユーザの設定変更のコマンドを何行か書き、それを4999回コピーし、ユーザ固有の部分を目視しながらマウス操作でコピーして編集していく。
>
> 単純だけど、これは質の悪いプログラムだ。
> ちゃんと動くとは思えない。
> 5000人分のコマンドを手作業でなおしていくと、絶対にミスをする。
> これはとても優れているとは言えない。
> 時間もかなり大きくなる。
>
> それよりも、じっくりしっかりきれいに10行で書いたスクリプトを書き、それを使ったほうが圧倒的に速いし確実だし優れている。
1回しか実行しないプログラムやクエリであれば、Excelで作ってしまうのが楽で確実です。
例えばユーザIDをA列に格納し、A列を参照するコマンド(クエリ)をB列に書いてオートフィル。
あとはB列をコピペすれば完成。
Re: (スコア:2)
1回しか実行しないプログラムやクエリであれば、Excelで作ってしまうのが楽で確実です。
その手のものなら、UNIXではbashなどのシェル、WindowsならPowerShellを使う方が楽。コピペすら必要ない。例えば、bashなら
とか。伝統的には、awkを使って、
とか。結果を一旦バッチファイルに保存して実行しても良いし、パイプで/bin/shに食わせてもいいね。もちろん、もっと現代的な言語で書いてもいい。
PowerShellなら、
Re: (スコア:1)
私はawkとかperlも使いますが、Excelもよく使ってます。
shとかawkを使う欠点はデータフォーマットですね。
元データが単純なテキストとは限らないんですよ。
1カラム中に空白が入ったりする場合もあるのでshのforは無理。
場合によっては改行を含むデータもあったりするし。
改行がないデータなら、CSVにして awk 'BEGIN{FS="\",\""}… とする手抜きも出来るけど、先頭と末尾の"は残るし、ダブルクオート有りと無しが混在するCSVには無力。それをマジメに処理しようとしたらもはやワンライナーは無理。
そういったデータの元はExcelだったりする場合が多いので、下手に「スクリプト系で
Re: (スコア:1)
まず。
僕は、できる限りマウス操作は避けるようにしてる。
Excelの大半の操作はキーボードでも可能ですし
まったくExcelを使わない、って言っているわけではないです。キーボードショートカットは、Excelに限らず、よく使ってますよ。TeraTermにコピペするときだって、キーボードショートカットですし。
1カラム中に空白が入ったりする場合もあるのでshのforは無理。
その程度なら、「無理」は言い過ぎだと思いますよ。デリミタが決まってるんだったら、なんとで
Re:素人は君だよ (スコア:1)
> デリミタが決まってるんだったら、なんとでもなりますから。awkの「-Fデリミタ文字 」オプションとかあるんだし。
そのあたりは元コメントでも書いてますが、デリミタに何を使うかが問題。定番のCSV(コンマ区切り)の場合、
"a","b","c"
のような、各カラムがダブルクオートされてる場合、
FS='","'にしておけば、とりあえず分割できますが、最初が「"a」、最後が「c"」になってしまいます。
さらに、ExcelなんかのCSV出力はクオートが必要なときだけクオートするので、
a,"b,c",d
みたいなデータになっちゃいますから、もはやawkでワンライナーなんて不可能です。
#ま、データをどうにでも選べるときは、CSVなんかではなく、TSV(タブ区切り)を使いますけど。こっちなら改行とかタブが入らない限りは簡単に処理できますし。でも、ExcelのTSV出力はそれはそれでトラブルが多いんだよなぁ。
で、私はどうしてもそんなデータを扱うときは、Perlで Text::CSVを使ったりしますが、はっきりいって、Excelで直接扱うより手間がかかります。定例処理として長期的な再利用がわかってる時ぐらいしか、そこまでやる気にはなれません。
> > 改行を含むデータもあったりするし。
> そう言う場合だと、Excelでコマンド列を生成するのも結構大変
改行を含むカラムはコマンド列では使わない場合が多いですね。
そういう場合に、「スクリプト処理用の、改行を削除したデータ」を生成するというワンクッションを入れるぐらいなら、Excelのままで処理、って感じで。
あと、元コメではコマンド列の生成だけでなくSQLの生成も例にあげてますけど、SQLの生成時には、改行を含むデータをそのまま出力させる必要がある場合も多いです。
Re:素人は君だよ (スコア:1)
みたいなデータになっちゃいますから、もはやawkでワンライナーなんて不可能です。
まあ、それは無理でしょうねえ。できる方法でやればいいじゃないですか。
しかし、私の経験から言うと、システム管理や構築の仕事では、そう言う難しいデータを元に作業することよりは、MS-Excelの入っていない環境で仕事することが多いです。
"a","b","c" (スコア:0)
echo '"a","b","c"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
Re: (スコア:0)
> echo '"a","b","c"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
echo '"a","b,c","d"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
で破綻しますね。
Re:素人は君だよ (スコア:2)
自分はpythonを使っていますが、CSV形式のファイルの扱いで困った事は無いですね。
pythonのcsvモジュールは下記の特徴があり使いやすいです。
・標準モジュールのため別途インストールする必要はない
・SJIS、改行、"の有無など問題なく読み書きできる(excelとの相互運用が楽)
・通常のファイルの読み書きと近しいコードで利用でき、難しくない
pythonはその特性上ワンライナーは苦手ですが、インタラクティブにコードが実行可能なので、ワンライナーのような試行錯誤や、そこそこの長さの手元のコードをサーバ上にスクリプトを置かず端末からのコピペで実行できたりします。
RHEL/CentOS系ならばyumでpythonが必要なため、perl/rubyがインストールされていない程の最小限な構成でも利用できます。また別の使い方としてはtelnetコマンドがインストールされていない状況で簡単にHTTPサーバやSMTPサーバとの疎通確認ができます。
$ python
>>> import urllib
>>> urllib.urlopen('http://www.example.com/')
>>> import smtplib
>>> smtplib.SMTP('mx.example.com')
# 最近はtelnetコマンドは標準でインストールされませんねぇ。
Re: (スコア:0)
> echo '"a","b","c"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
echo '"a","b,c","d"'|tr -d \"|awk -F \, '{print $1, $2, $3}'
で破綻しますね。
echo '"a","b,c","d"'|awk -F \,\" '{print $1,$2,$3}'|tr -d \"
これはどう?
Re: (スコア:0)
また別の使い方としてはtelnetコマンドがインストールされていない状況
だから、そこはnc [blogspot.jp]だって。
Re:"a","b","c" (スコア:1)
> echo '"a","b,c","d"'|awk -F \,\" '{print $1,$2,$3}'|tr -d \"
> これはどう?
CSVには
・全てのカラムがクオートされているとは限らない
・ダブルクオート文字そのものは、ダブルクオート二つで表現される
といった変態さがありますので。
「a,"b,""c",d」という行を処理して、「a」「b,"c」「d」という3カラムの抽出が期待されます。
awkのFS指定とtrで処理するのは無謀です。
Re:"a","b","c" (スコア:1)
awkとtrのパイプ実行に比べて可読性は低くなるけどsedでガッチリ書けということですね。 orz
Re:"a","b","c" (スコア:1)
シェルスクリプトレベルで、処理が難しいCSVがあるのは、よく解るんだけど、いずれにせよ、そう言う難しいデータをCSVで処理しようってのが間違ってる気もするね。XMLやYAML、JSONとか(S式とか(笑))、他に扱いやすいフォーマットもあるんだから、そっちの方向で考えた方がいいんじゃないかなあ。
MS-Excelの入っていない環境も珍しくは無いことを考えると、実機で作業する前にどう段取りするかが重要になってくるから、他にもっと便利なツールがあるんじゃない?