前の記事では、「つながらない」ときに、どこで止まっているかを切り分けました。今回は、調べたログを読みやすく加工する道具、sed と awk を学びます。
サーバーのログを見ていて、「ERROR が今日何回出たか」を知りたくなることがあります。よくあるのが、ログを Excel に貼りつけて、フィルターで数えるやり方です。でも、同じことは awk(=行を列に分けて、集計や取り出しをするコマンド)の1行でできます。手でちまちま数えていた作業が一瞬で終わると、ちょっと感動しますよ。
この記事では、練習用のログファイルを作り、置き換え・削除・列の取り出し・集計を、1行のコマンド(ワンライナー)でやってみます。元のファイルは書きかえず、表示するだけの使い方を中心に進めます。
-
sedで、文字を置き換える・行を選ぶ・行を消す方法(表示だけ) -
sed -i.bakで、バックアップを残してファイルを書きかえる方法 -
awkで、列を取り出す・条件でしぼる方法 -
awkで、種類ごとに数える・合計と平均を出す方法 - CSV ファイルを
awk -F,で集計する方法
-
grepで行を探せる - パイプ(
|)でコマンドをつなげられる -
sort・uniqを見たことがある
まだの方は、前の記事「Linuxで「つながらない」ときの調べ方|ping・ss・curl -v・digで切り分ける【初心者向け】」から読むのがおすすめです。grep については「Linuxのgrep入門|ログや設定ファイルから1行を探し出す【初心者向け】」でくわしく説明しています。
- ワンライナー:1行で書いた、コマンドの組み合わせ(パイプでつなぐことが多い)
- ログ:プログラムが残す「いつ、何が起きたか」の記録
- サーバー:ほかのパソコンやアプリにサービスを提供するコンピューター。24時間動かしておくことが多いです
- トークン:ログインした状態や、使ってよい範囲を表す文字列。APIキーと同じく、パスワードと同じように人に見せてはいけません
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:sed は「行を書きかえる」、awk は「列で考える」
| やりたいこと | コマンドの例 |
|---|---|
| 文字を置き換えて表示 | sed 's/古い/新しい/' ファイル |
| 2〜4行目だけ表示 | sed -n '2,4p' ファイル |
| ある文字を含む行を消して表示 | sed '/DEBUG/d' ファイル |
| 3列目だけ表示 | awk '{print $3}' ファイル |
| 3列目が ERROR の行だけ | awk '$3 == "ERROR"' ファイル |
| 種類ごとに数える | awk '{c[$3]++} END {for (k in c) print k, c[k]}' ファイル |
準備:練習用のログファイルを作る
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
mkdir -p ~/linux-practice/sed-awk-test
cd ~/linux-practice/sed-awk-test
printf '%s\n' \
"2026-09-19 09:00:01 INFO login user=kaito 120" \
"2026-09-19 09:00:05 ERROR db-timeout user=sato 3000" \
"2026-09-19 09:01:10 INFO login user=suzuki 95" \
"2026-09-19 09:02:30 WARN slow-response user=kaito 1500" \
"2026-09-19 09:03:45 ERROR db-timeout user=kaito 3100" \
"2026-09-19 09:04:00 INFO logout user=sato 80" \
"2026-09-19 09:05:12 DEBUG cache-hit user=suzuki 5" > app.log
cat app.logここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
kaito@demo:~/linux-practice/sed-awk-test$ printf '%s\n' \
> "2026-09-19 09:00:01 INFO login user=kaito 120" \
> "2026-09-19 09:00:05 ERROR db-timeout user=sato 3000" \
> "2026-09-19 09:01:10 INFO login user=suzuki 95" \
> "2026-09-19 09:02:30 WARN slow-response user=kaito 1500" \
> "2026-09-19 09:03:45 ERROR db-timeout user=kaito 3100" \
> "2026-09-19 09:04:00 INFO logout user=sato 80" \
> "2026-09-19 09:05:12 DEBUG cache-hit user=suzuki 5" > app.log
kaito@demo:~/linux-practice/sed-awk-test$ cat app.log
2026-09-19 09:00:01 INFO login user=kaito 120
2026-09-19 09:00:05 ERROR db-timeout user=sato 3000
2026-09-19 09:01:10 INFO login user=suzuki 95
2026-09-19 09:02:30 WARN slow-response user=kaito 1500
2026-09-19 09:03:45 ERROR db-timeout user=kaito 3100
2026-09-19 09:04:00 INFO logout user=sato 80
2026-09-19 09:05:12 DEBUG cache-hit user=suzuki 5printf を何行かに分けて打つと、2行目から先頭に > が表示されます。これは「コマンドの続きを待っています」という意味の印で、打つ文字ではありません。
1行は、空白で区切られた6つの部分でできています。左から「日付・時刻・重要度・できごと・ユーザー・かかった時間(ミリ秒)」です。
STEP 1:sed で置き換える・選ぶ・消す
sed(stream editor)は、ファイルを1行ずつ読んで、加工した結果を画面に出します。元のファイルは変わりません。
- 1
- 2
- 3
sed 's/ERROR/エラー/' app.log
sed -n '2,4p' app.log
sed '/DEBUG/d' app.log(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
kaito@demo:~/linux-practice/sed-awk-test$ sed 's/ERROR/エラー/' app.log
2026-09-19 09:00:01 INFO login user=kaito 120
2026-09-19 09:00:05 エラー db-timeout user=sato 3000
2026-09-19 09:01:10 INFO login user=suzuki 95
2026-09-19 09:02:30 WARN slow-response user=kaito 1500
2026-09-19 09:03:45 エラー db-timeout user=kaito 3100
2026-09-19 09:04:00 INFO logout user=sato 80
2026-09-19 09:05:12 DEBUG cache-hit user=suzuki 5
kaito@demo:~/linux-practice/sed-awk-test$ sed -n '2,4p' app.log
2026-09-19 09:00:05 ERROR db-timeout user=sato 3000
2026-09-19 09:01:10 INFO login user=suzuki 95
2026-09-19 09:02:30 WARN slow-response user=kaito 1500
kaito@demo:~/linux-practice/sed-awk-test$ sed '/DEBUG/d' app.log
2026-09-19 09:00:01 INFO login user=kaito 120
2026-09-19 09:00:05 ERROR db-timeout user=sato 3000
2026-09-19 09:01:10 INFO login user=suzuki 95
2026-09-19 09:02:30 WARN slow-response user=kaito 1500
2026-09-19 09:03:45 ERROR db-timeout user=kaito 3100
2026-09-19 09:04:00 INFO logout user=sato 80| 書き方 | 意味 |
|---|---|
s/古い/新しい/ | 各行で最初に見つかった「古い」を「新しい」に置き換える(全部なら最後に g) |
-n '2,4p' | ふつうの表示を止めて(-n)、2〜4行目だけ表示する(p) |
'/DEBUG/d' | DEBUG を含む行を消す(d)。表示の上だけ |
置き換えの便利な使い道が、伏せ字です。ユーザー名を隠してから人に見せたり、AI に貼ったりできます。
- 1
sed 's/user=[a-z]*/user=***/' app.log(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
kaito@demo:~/linux-practice/sed-awk-test$ sed 's/user=[a-z]*/user=***/' app.log
2026-09-19 09:00:01 INFO login user=*** 120
2026-09-19 09:00:05 ERROR db-timeout user=*** 3000
2026-09-19 09:01:10 INFO login user=*** 95
2026-09-19 09:02:30 WARN slow-response user=*** 1500
2026-09-19 09:03:45 ERROR db-timeout user=*** 3100
2026-09-19 09:04:00 INFO logout user=*** 80
2026-09-19 09:05:12 DEBUG cache-hit user=*** 5[a-z]* は「小文字のアルファベットが0文字以上続く」という意味の書き方(正規表現)です。
この練習のログは、ユーザー名がすべて小文字で、1行に1つずつでした。本物のログでは、そうとは限りません。
- 大文字や数字が入った名前:
[a-z]*は小文字だけなので、user=Sato2のような名前はuser=***Sato2となり、名前がそのまま残ります。 - 1行に2つ以上あるとき:
s/…/…/は、1行の中の最初の1つだけを置き換えます。2つ目は残ります。
空白までを全部伏せるなら s/user=[^[:space:]]*/user=***/g のように、「空白以外の文字」([^[:space:]]*)と、全部を置き換える g を使います。[:space:] は「空白(半角スペースやタブなど)」を表す書き方で、[^[:space:]] は「空白以外の1文字」という意味です。どこまでが名前になるかはログの書き方によって変わるので、置き換えの形は、実際のログに合わせて調べてから使いましょう。
置き換えたあとは、grep "user=[^*]" で「user= のすぐあとが伏せ字でない行」が残っていないかを探します。ただし、この探し方では user=***Sato2 のように「伏せ字のうしろに名前が残った行」は見つかりません。grep の結果だけで安心せず、置き換えたあとの行を目でも確かめましょう。下の検証を見てください。
伏せ字が残る例を、実際に試す(検証)
大文字と数字の入った名前(Sato2)と、1行に2つの user= がある練習用のログを作り、置き換え方のちがいを比べました。
- 1
- 2
- 3
- 4
- 5
- 6
printf '%s\n' "2026-09-19 09:00:01 INFO login user=kaito 120" "2026-09-19 09:00:05 ERROR db-timeout user=Sato2 3000" "2026-09-19 09:01:10 INFO share user=Sato2 to=user=kaito 95" > mask.log
cat mask.log
sed 's/user=[a-z]*/user=***/' mask.log
sed 's/user=[^[:space:]]*/user=***/g' mask.log
sed 's/user=[a-z]*/user=***/' mask.log | grep "user=[^*]"
sed 's/user=[^[:space:]]*/user=***/g' mask.log | grep "user=[^*]"; echo $?(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
kaito@demo:~/linux-practice/sed-awk-test$ printf '%s\n' "2026-09-19 09:00:01 INFO login user=kaito 120" "2026-09-19 09:00:05 ERROR db-timeout user=Sato2 3000" "2026-09-19 09:01:10 INFO share user=Sato2 to=user=kaito 95" > mask.log
kaito@demo:~/linux-practice/sed-awk-test$ cat mask.log
2026-09-19 09:00:01 INFO login user=kaito 120
2026-09-19 09:00:05 ERROR db-timeout user=Sato2 3000
2026-09-19 09:01:10 INFO share user=Sato2 to=user=kaito 95
kaito@demo:~/linux-practice/sed-awk-test$ sed 's/user=[a-z]*/user=***/' mask.log
2026-09-19 09:00:01 INFO login user=*** 120
2026-09-19 09:00:05 ERROR db-timeout user=***Sato2 3000
2026-09-19 09:01:10 INFO share user=***Sato2 to=user=kaito 95
kaito@demo:~/linux-practice/sed-awk-test$ sed 's/user=[^[:space:]]*/user=***/g' mask.log
2026-09-19 09:00:01 INFO login user=*** 120
2026-09-19 09:00:05 ERROR db-timeout user=*** 3000
2026-09-19 09:01:10 INFO share user=*** to=user=*** 95
kaito@demo:~/linux-practice/sed-awk-test$ sed 's/user=[a-z]*/user=***/' mask.log | grep "user=[^*]"
2026-09-19 09:01:10 INFO share user=***Sato2 to=user=kaito 95
kaito@demo:~/linux-practice/sed-awk-test$ sed 's/user=[^[:space:]]*/user=***/g' mask.log | grep "user=[^*]"; echo $?
1[a-z]* と g なしの形(3つ目のコマンド)では、2行目と3行目に Sato2 が残り、3行目の2つ目の to=user=kaito もそのままです。[^[:space:]]* と g の形(4つ目)では、全部が *** になりました。
5つ目は、まちがった置き換えのあとに grep "user=[^*]" で探したものです。出てきたのは3行目だけで、user=***Sato2 だけが残った2行目は見つかりませんでした。3行目が見つかったのも、2つ目の to=user=kaito があったからです。正しい置き換えのあとの6つ目は何も出ず、echo $? は 1(見つからなかった)でした。grep で何も出なくても、それだけで「全部伏せた」とは言い切れないので、目でも確かめます。
STEP 2:sed -i でファイルを書きかえる(コピーで練習)
-i をつけると、結果を画面に出すかわりに、ファイルそのものを書きかえます。必ず -i.bak のように書いて、元のファイルを残しましょう。ここでは、コピーしたファイルで練習します。
- 1
- 2
- 3
- 4
- 5
printf '%s\n' "port=8000" "host=127.0.0.1" "mode=test" > config.txt
cp config.txt config-copy.txt
sed -i.bak 's/port=8000/port=8080/' config-copy.txt
ls
diff config-copy.txt.bak config-copy.txt(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
kaito@demo:~/linux-practice/sed-awk-test$ printf '%s\n' "port=8000" "host=127.0.0.1" "mode=test" > config.txt
kaito@demo:~/linux-practice/sed-awk-test$ cp config.txt config-copy.txt
kaito@demo:~/linux-practice/sed-awk-test$ sed -i.bak 's/port=8000/port=8080/' config-copy.txt
kaito@demo:~/linux-practice/sed-awk-test$ ls
app.log config-copy.txt config-copy.txt.bak config.txt
kaito@demo:~/linux-practice/sed-awk-test$ diff config-copy.txt.bak config-copy.txt
1c1
< port=8000
---
> port=80801c1 は「1行目が変わった(change)」という意味です。< が元のファイル(.bak)、> が書きかえたあとのファイルの行です。
diff で、何が変わったかを必ず確かめるのがコツです。うまくいかなかったら、.bak のファイルを元の名前に戻せば、やり直せます。
sudo sed -i で /etc の中の設定ファイル(たとえば SSH の設定)を、バックアップなしで直接書きかえるのは危険です。置き換えの書き方を1文字まちがえるだけで、設定が壊れて、サーバーに入れなくなることがあります。find … -exec sed -i … のように、たくさんのファイルを一度に書きかえる方法もネットに出てきますが、元に戻すのがとても大変です。まずは -i なしで表示して確かめ、次にコピーで試し、最後に .bak を残して本番、の順番を守りましょう。
STEP 3:awk で列を取り出す・しぼり込む
awk は、1行を空白で区切って、左から $1・$2・$3… と番号で呼べるようにしてくれます。
- 1
- 2
- 3
- 4
awk '{print $3}' app.log
awk '{print $2, $3, $4}' app.log
awk '$3 == "ERROR"' app.log
awk '$6 > 1000 {print $2, $4, $6 "ms"}' app.log(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
kaito@demo:~/linux-practice/sed-awk-test$ awk '{print $3}' app.log
INFO
ERROR
INFO
WARN
ERROR
INFO
DEBUG
kaito@demo:~/linux-practice/sed-awk-test$ awk '{print $2, $3, $4}' app.log
09:00:01 INFO login
09:00:05 ERROR db-timeout
09:01:10 INFO login
09:02:30 WARN slow-response
09:03:45 ERROR db-timeout
09:04:00 INFO logout
09:05:12 DEBUG cache-hit
kaito@demo:~/linux-practice/sed-awk-test$ awk '$3 == "ERROR"' app.log
2026-09-19 09:00:05 ERROR db-timeout user=sato 3000
2026-09-19 09:03:45 ERROR db-timeout user=kaito 3100
kaito@demo:~/linux-practice/sed-awk-test$ awk '$6 > 1000 {print $2, $4, $6 "ms"}' app.log
09:00:05 db-timeout 3000ms
09:02:30 slow-response 1500ms
09:03:45 db-timeout 3100ms検証環境(Debian 13)の awk は、最初から入っている mawk です。この記事の書き方は、gawk でも同じように動きます。
'条件 {やること}' の形で書きます。条件だけなら「その行を表示」、やることだけなら「全部の行でやる」という意味になります。$6 > 1000 は「6列目の数字が1000より大きい」、つまり1秒以上かかった処理です。
STEP 4:awk で数える・合計する
- 1
- 2
awk '{count[$3]++} END {for (k in count) print k, count[k]}' app.log | sort
awk '{sum += $6} END {print "合計:", sum, "平均:", sum/NR}' app.log(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
kaito@demo:~/linux-practice/sed-awk-test$ awk '{count[$3]++} END {for (k in count) print k, count[k]}' app.log | sort
DEBUG 1
ERROR 2
INFO 3
WARN 1
kaito@demo:~/linux-practice/sed-awk-test$ awk '{sum += $6} END {print "合計:", sum, "平均:", sum/NR}' app.log
合計: 7900 平均: 1128.57for (k in count) が表示する順番は決まっていないので、| sort で並べています。
count[$3]++ は「3列目の文字ごとに、数を1つ増やす」、END { … } は「全部の行を読み終わったら1回だけやる」という意味です。NR は、読んだ行の数です。
同じ数え方は、sort と uniq -c を組み合わせてもできます。多い順に並べたいときは、こちらが手軽です。
- 1
awk '{print $3}' app.log | sort | uniq -c | sort -rn(例)
- 1
- 2
- 3
- 4
- 5
kaito@demo:~/linux-practice/sed-awk-test$ awk '{print $3}' app.log | sort | uniq -c | sort -rn
3 INFO
2 ERROR
1 WARN
1 DEBUGSTEP 5:CSV を集計する・本物のログで試す
区切りが空白ではなく ,(カンマ)のときは、-F, で区切り文字を指定します。
- 1
- 2
printf '%s\n' "date,item,price" "2026-09-01,ノート,300" "2026-09-01,ペン,120" "2026-09-02,ノート,300" > sales.csv
awk -F, 'NR > 1 {sum[$2] += $3} END {for (k in sum) print k, sum[k]}' sales.csv(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/sed-awk-test$ printf '%s\n' "date,item,price" "2026-09-01,ノート,300" "2026-09-01,ペン,120" "2026-09-02,ノート,300" > sales.csv
kaito@demo:~/linux-practice/sed-awk-test$ awk -F, 'NR > 1 {sum[$2] += $3} END {for (k in sum) print k, sum[k]}' sales.csv
ノート 600
ペン 120NR > 1 は「1行目(見出し)を飛ばす」という意味です。
最後に、本物のログで試します。apt(=Debian・Ubuntu で、ソフトを入れる・更新する・消すための道具)でソフトを入れたり更新したりした日ごとに、回数を数えます。ログは読むだけです。
- 1
grep "^Start-Date" /var/log/apt/history.log | awk '{print $2}' | sort | uniq -c(例)
- 1
- 2
- 3
kaito@demo:~/linux-practice/sed-awk-test$ grep "^Start-Date" /var/log/apt/history.log | awk '{print $2}' | sort | uniq -c
9 2026-10-31
15 2026-11-01/var/log/apt/history.log は、sudo(=許可されたユーザーが、コマンドの前につけて、そのコマンドだけを管理者の権限で実行するしくみ)なしで読めました。数字と日付は、パソコンごとにちがいます。検証環境では、このシリーズの練習で apt を何度も使ったため、回数が多めになっています。
🤖 詰まったらAIに聞こう:sed・awk の書き方がわからない
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Linuxの初心者です。ログを sed か awk で加工したいです。
次のログの形と、やりたいことから、ワンライナーを作ってください。
それぞれの記号が何をしているかも、1つずつ説明してください。
元のファイルは書きかえない書き方でお願いします。
【ログの例(3〜5行。個人情報は伏せる)】ここに貼る
【やりたいこと】例:ERRORの行だけ、時刻とできごとを表示したい/ユーザーごとに回数を数えたい
【試したコマンドとエラー】ここに貼るログを AI に見せるときは、数行の見本だけにしましょう。ユーザー名・メールアドレス・IP アドレス・トークンは、この記事の STEP 1 のように sed で「***」に置き換えてから貼ると安心です。置き換えたあとに、本当に消えたかを目で確かめることも忘れないでください。
後片づけ
- 1
- 2
- 3
cd ~/linux-practice
rm -r sed-awk-test
ls(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/sed-awk-test$ cd ~/linux-practice
kaito@demo:~/linux-practice$ rm -r sed-awk-test
kaito@demo:~/linux-practice$ ls
archive-test chmod-test edit-test find-test grep-test link-test perm-test redirect-testsed-awk-test がなくなりました。ほかのフォルダは、これまでの記事の練習で作ったものです。
よくある質問
Q. sed で unterminated という言葉が入ったエラーが出ました。
s/前/後/ の最後の / が足りないなど、置き換えの書き方が途中で終わっているときのエラーです。検証では、最後の / を忘れた echo a | sed 's/a/b' で、次のように出ました(char 5 は「5文字目で終わってしまった」という意味です)。
- 1
- 2
kaito@demo:~/linux-practice/sed-awk-test$ echo a | sed 's/a/b'
sed: -e expression #1, char 5: unterminated `s' command/ が3つそろっているか、' で全体を囲んでいるかを確かめましょう。置き換える文字の中に / が入るときは、s|前|後| のように区切りを | に変えると書きやすくなります。
Q. CSV の数字に「1,000」のようなカンマが入っていると、集計がずれます。
awk -F, は、" で囲まれた中のカンマも区切りとして数えるので、列がずれます。検証で、" の中にカンマが入った CSV を作って比べました。
- 1
- 2
- 3
- 4
printf '%s\n' 'name,price' '"pen, blue",120' 'notebook,"1,000"' > comma.csv
cat comma.csv
awk -F, '{print NF, $2}' comma.csv
python3 -c 'import csv; [print(len(r), r) for r in csv.reader(open("comma.csv"))]'(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
kaito@demo:~/linux-practice/sed-awk-test$ printf '%s\n' 'name,price' '"pen, blue",120' 'notebook,"1,000"' > comma.csv
kaito@demo:~/linux-practice/sed-awk-test$ cat comma.csv
name,price
"pen, blue",120
notebook,"1,000"
kaito@demo:~/linux-practice/sed-awk-test$ awk -F, '{print NF, $2}' comma.csv
2 price
3 blue"
3 "1
kaito@demo:~/linux-practice/sed-awk-test$ python3 -c 'import csv; [print(len(r), r) for r in csv.reader(open("comma.csv"))]'
2 ['name', 'price']
2 ['pen, blue', '120']
2 ['notebook', '1,000']awk では、2行目と3行目の列の数(NF)が 3 になり、2列目も blue" や "1 のようにずれました。Python に最初から入っている csv で読むと、どの行も 2 列で、'1,000' もひとまとまりのまま読めました。そういう CSV は、Python で読むほうが確実です(検証で確かめたのは、Python に最初から入っている csv だけです。関連する記事の pandas でも読めますが、ここでは試していません)。
この記事の sales.csv のように、値の中にカンマがない CSV なら awk -F, で十分です。
Q. Mac のターミナルで sed -i.bak を使っても大丈夫ですか?
Mac に最初から入っている sed は、Linux(GNU sed)と少しちがう種類です。-i.bak のように拡張子(=ファイル名の最後の .txt や .py の部分)をくっつけて書く形なら、多くの場合そのまま使えますが、ほかのオプションの書き方がちがうことがあります。環境により異なります。
まとめ
-
sedは行を加工する。s/古い/新しい/・-n '2,4p'・'/文字/d'の3つを覚える -
sedもawkも、ふつうは表示するだけ。元のファイルは変わらない - ファイルを書きかえるときは
sed -i.bakでバックアップを残し、diffで確かめる -
awkは列で考える。$3で3列目、'条件 {やること}'の形 - 数えるのは
count[$3]++とEND、またはsort | uniq -c - CSV は
awk -F,。ログを人に見せる前の伏せ字にもsedが使える
次の記事では、サーバーのセキュリティの基礎を学びます。最小権限(=人やプログラムに、必要なぶんだけの権限しか渡さないという考え方)・更新・fail2ban・ログ確認で、サーバーを守る考え方を整理します。
次に読む記事
- 前の記事:Linuxで「つながらない」ときの調べ方|ping・ss・curl -v・digで切り分ける【初心者向け】
- 次の記事:Linuxサーバーのセキュリティ基礎|最小権限・更新・fail2ban・ログ確認【初心者向け】
関連する記事
- Excel・CSVを毎回手で結合していませんか?Pythonで1分にする方法(重複削除・列名ゆれ対応):awk より複雑な CSV の加工をしたい方に
- Pythonで毎朝のCSV集計を自動化する(pandas+定期実行):集計を毎日自動で動かしたい方に
- Pythonで毎日の作業を自動化する入門|ダウンロードフォルダを自動で整理しよう:ファイルの整理を自動化したい方に