「Unixコマンド生活実践」課題の解答
解答をすっかり忘れていました。
1 入力(ファイルなど)から空行を除いた出力をする方法
grep -v '^$'
2 空白文字(とりあえずスペース文字とタブ文字だけでもよい)だけの行も空行と見なして、空行を除いた出力をする方法
grep -v '^ *$'
タブ文字は、とツッコミが入りそうですが、grepでやるなら
grep -v '^[[:space:]]*$'
こういうのは覚えていないので、awkでやるかもしれません。
awk '!/^[ \t]*$/{print}'
3 あるディレクトリの下の全てのファイルに書かれた Linux の文字列を GNU/Linux に置き換える方法(ただし既存のGNU/Linuxはそのまま)
for f in `find . -type f`; do mv $f $f.bak; sed 's|Linux|GNU/Linux|g' $f.bak > $f; done してから.bakファイルを削除
bakファイルが元からある、後で間違って削除するかもしれない、というツッコミがあるかもしれません。拡張子変えてもいいですし、forの中で$f.bakを消してもいいです。その辺は状況を見て臨機応変にやります。
もっと深刻なのは上のスクリプトでは、GNU/LinuxがGNU/GNU/Linuxになることです。
sed 's|GNU/GNU/Linux|GNU/Linux|g'
とでもすればよいでしょう。手抜きですが、考える前に手を動かすのがシェルスクリプトです。
4 これから行う操作で変更されるファイル一覧を知る方法 (date(1)コマンドで現在時刻を調べるより簡易な方法があります)
以下のような答えを想定して作った問題でした。
touch /tmp/now find . -newer /tmp/now
5 apacheの標準的なアクセスログから、最もアクセス数が多いリクエストURLを求める方法
awk '{print $7}' access_log |sort|uniq -c|sort -rn の出力を適当なページャに渡す
6 apacheの標準的なアクセスログから、レスポンスのバイト数の平均を求める方法
awk '{sum+=$10}END{print sum/NR}' access_log
ログの中でカラムの番号を数えるのが一番時間がかかります。
7 /etc/passwdファイルに重複ユーザがいないかを確認する方法
awk -F: '{print $1}' /etc/passwd|sort|uniq -c|sort -n で目grep
重複ユーザがあまりいない前提なので、ページャに渡すまでもありません。出力の最後だけ目grepします。
8 CSVフォーマットのユーザ名簿の先頭カラムにメールアドレスがある時、/etc/passwdに存在しないユーザを求める方法
{ awk -F: '{print $1}' /etc/passwd; awk '{print $1}' /tmp/input.csv; } |sort|uniq -c|sort -n
後半、awkばっかりでした。
おまけ問題は変だったので削除しました。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/unix-operation2-answer/tbping