More from: awk

ユーザー設定の移行(備忘録)

仕事で使っているサーバの負担が大きくなってきたので、処理を分散させるために仮想でもう一台作った。
新しいサーバに一部の処理を移行させるのだけど、やっているのがメールの代理受信なので、ユーザーデータも移行しなければならない。
スプールの中身は移さずに全て受信後に新しいサーバに移行して貰うつもり。
なので新しいサーバでユーザーを新たに登録する作業が必要で、いちいち手作業でやっていてはミスが出るので元のサーバのユーザー情報を元に登録用のスクリプトを作った。
最初に旧サーバから/etc/passwdファイルを新サーバにコピーしておく(実際には/etc/alisesや/etc/groupファイルもコピー)。
# ”awk -F : ‘{print “/usr/sbin/useradd -u ” $3 ” -g ” $4 ” -d ” $6 ” ” $1}’ passwd > hoge”
そうして上のコマンドを実行するとファイル”hoge”の中に
/usr/sbin/useradd -u 501 -g 501 -d /home/user1 user1
のような登録用のコマンドが作られるので、後はこれを実行すればユーザーの登録が出来る(移行させたくないユーザーの分は行を削除するかマスクしておけばOK)。
問題はパスワードの設定で、一つ一つ手で入力していたら大変(ユーザー数が三桁あるので)。
これをなんとかバッチで流し込めないか現在考え中・・・
これも旧サーバの/etc/shadowファイルから切り出して流し込めれば楽なんだけどなぁ・・・
一度
useradd -u 501 -g 501 -d /home/user1 -p ”切り出したパスワード文字列(暗号化済み)” user1
でやってみたらユーザーは登録出来るけどパスワードは正しく設定されなかったorz

さて、どうしたものか???

←クリックしてくれると嬉しいです。

たまにしか書かないと忘れるなぁ(汗)

サーバーのログの中から特定の文字列を探すのにコマンドラインから
”grep ほげ げしょ | awk ‘{print $8}’ | uniq
と書くところを、最初は
”grep ほげ げしょ | sed ‘{print $8}’ | uniq
と書いてしまい
”sed: -e 表現 #1, 文字数 3: コマンドの後ろに余計な文字があります”
というエラーを返されてしまった(汗)。
それを見ておかしいな?と思って直したのが
”grep ほげ げしょ | sed {print $8} | uniq
で、これでも同じエラーが出る(当たり前)。
そもそも”sed”を使うつもりは無く”awk”と書いているつもりなので、そこが間違っているとは気付かなかった。
2回目のエラーでようやくawkではなくてsedと書いていることに気付いて直したと言う(汗)。
いやぁ、しばらくぶりに書くと忘れてるねぇ・・・

←クリックしてくれると嬉しいです。

スクリプトは動くようになった

先日から作っていたファイルフォーマット及び文字コード変換用のスクリプトがようやく形になった(汗)。
元のファイルの中に複数の形式のレコードが混在していたので面倒だったけど、そこはなんとか力技で押さえ込んだ。
てこずったのが特定の文字(全角の長音記号)が元のコード(SJIS)から他のコード(EUC,UTF-8)に変換できなかったこと。
いろいろ調べてみたけど皆さん苦労していらっしゃるようで上手い解決策が見つからなかった。
仕方が無いのでテキストエディターで開いて全角のハイフンに一括変換をかけることで対処した。
元のファイルが三十数個程度だったのでこんな荒業が使えたけど、これがファイル数が三桁だったらやりたくないよなぁ・・・
どうにかして自動で変換できないものか・・・

←クリックしてくれると嬉しいです。

久々にスクリプトを書いたら(汗)

先日仕事でスクリプトを書いた。
簡単なcsvファイルのフォーマット変換用のスクリプトだったんだけど、久々にawkを使ったら構文をすっかり忘れていた(汗)。
基本的な書き方は覚えていたんだけど、ifやらwhileの使い方があやふやだったのでネットで検索。
こういう時はネットはありがたいな。

←クリックしてくれると嬉しいです。

awkのメモ

linuxサーバーのmaillogから下記の項目を抜き出す必要が出来た。
・端末のIPアドレス
・ユーザーアカウント
・端末名(名前解決が出来たもののみ)
しかも特定のネットワークからのアクセス分だけという条件付。

で、まずは/var/log/maillog*から特定のネットワークからの分だけを
#grep “ネットワークアドレス(xxx.yyy.zzz)” maillog* > hoge
でhogeというファイルに吐き出した。
次に
#cat hoge | grep pop | awk ‘NF=14{print $12,$13,$7}’ | sort +1 | uniq > hoge2.txt
を実行して結果をhoge2.txtというファイルに書き出した。

#grep “ネットワークアドレス(xxx.yyy.zzz)” maillog* | grep pop | awk ‘NF=14{print $12,$13,$7}’ | sort +1 | uniq > hoge2.txt
のように全部を一度に書いても同じ結果が得られたはず。

awkの中でやっているのは
フィールド数が14ならば(NF=14)12番目と13番目と7番目の項目を書き出す。
ということ。
これで(ほぼ)望みどおりの結果が得られ、数万行にのぼるログファイルから10行少々を切り出すことが出来た。

←クリックしてくれると嬉しいです。