こんにちは、インフラエンジニアのryuです。
grep はよく使うけれど、sed や awk になると急に自信がなくなる。LPIC-1の勉強をしていて、そんなふうに感じたことはないでしょうか。
この3つは、どれもテキストを1行ずつ読んで処理するコマンドです。 ただ、オプションの意味や正規表現の書き方が少しずつ違うので、問題で並べて出されると迷いやすい分野でもあります。
この記事では、grep・sed・awkに絞った練習問題を10問用意しました。 すべてオリジナルの問題で、1問ずつ正解と解説を付けています。
コマンドの使い方を先に確認したい方は、『grepコマンドの使い方』や『awkコマンドの使い方』を読んでから解いてみてください。
grep・sed・awkはLPIC-1のどこで出題される?¶
問題に入る前に、試験のなかでの位置づけを確認しておきます。
LPIC-1は、LPI(Linux Professional Institute)が認定しているLinuxの資格です。
現在の試験はバージョン5.0で、101試験(101-500)と102試験(102-500)の両方に合格すると認定されます。
テキスト処理は、101試験の主題103「GNUとUnixのコマンド」のなかで出題されます。 LPIが公開している出題範囲のうち、今回の3つのコマンドに関係するのは次の2つです。
| 主題 | 内容 | 重要度 | 関係するコマンドの例 |
|---|---|---|---|
| 103.2 | フィルタを使ったテキストストリームの処理 | 2 | sed、cut、sort、uniq、tr、wc など |
| 103.7 | 正規表現を使ったテキストファイルの検索 | 3 | grep、egrep、fgrep、sed、regex(7) |
重要度は、その主題の問題がどれくらいの割合で出るかの目安です。数字が大きいほど、出題数が多くなります。
見てのとおり、sed は両方の主題に入っています。一方で、awk は103.2と103.7の用語一覧には入っていません。
とはいえ、awk は実務で grep や sed と組み合わせて使うことが多いコマンドです。
そこでこの記事では、試験の中心になる grep と sed を8問、実務でよく使う awk を2問という配分にしました。
基本正規表現と拡張正規表現の違い¶
103.7では、基本正規表現(BRE)と拡張正規表現(ERE)の違いがよく問われます。
基本正規表現と拡張正規表現:
grepはオプションを付けないと基本正規表現として解釈します。grep -E(またはegrep)を使うと拡張正規表現になり、+、?、|、()を特別な記号として使えます。
よく使う記号を表にまとめておきます。「AまたはB」を表す縦棒の記号は、表の外で説明します。
| 記号 | 意味 | 基本正規表現での書き方 | 拡張正規表現での書き方 |
|---|---|---|---|
^ |
行の先頭 | ^ |
^ |
$ |
行の末尾 | $ |
$ |
. |
任意の1文字 | . |
. |
* |
直前の文字の0回以上のくり返し | * |
* |
+ |
直前の文字の1回以上のくり返し | \+(GNUの拡張) |
+ |
[ ] |
かっこ内のいずれか1文字 | [abc] |
[abc] |
「AまたはB」は、拡張正規表現では cat|dog のように縦棒で書きます。基本正規表現の縦棒はただの文字として扱われ、GNU grepでは cat\|dog のようにバックスラッシュを付けると同じ意味になります。
なお、GNU grepの3.8以降では、egrep と fgrep を実行すると、古い書き方であることを知らせる警告が出るようになりました。今の環境では grep -E と grep -F を使うのが基本です。
正規表現そのものの考え方は、『正規表現とは?』でも解説しています。
3つのコマンドの使い分け¶
grep・sed・awkは、どれも行ごとにテキストを読むコマンドですが、得意なことが違います。 問題を解くときも、まず「この問題は探したいのか、書き換えたいのか、列を取り出したいのか」を考えると、選択肢を絞りやすくなります。
| コマンド | 得意なこと | よく使う場面 |
|---|---|---|
| grep | 条件に合う行を探して表示する | ログからエラーの行だけを探す |
| sed | 行の中の文字を置換する、行を削除する | 設定ファイルの値をまとめて書き換える |
| awk | 列(フィールド)に分けて取り出す・計算する | ログの特定の列だけを集計する |
たとえば、ログファイルからエラーの行だけを見たいなら grep、設定ファイルのホスト名をまとめて書き換えたいなら sed、アクセスログからIPアドレスの列だけを抜き出したいなら awk、という使い分けになります。
実際には1つのコマンドで複数のことができてしまうので、どれを使っても同じ結果になる場面もあります。ただ、試験ではそれぞれのコマンドの基本的な書き方が問われるので、まずは得意なことを押さえておくのが近道です。
問題で使うファイル¶
いくつかの問題では、次の sample.txt を使います。
INFO 2026-10-20 server started
error 2026-10-20 disk full
WARN 2026-10-20 memory high
ERROR 2026-10-20 connection refused
12345
INFO 2026-10-20 job done
5行目は何も書かれていない空行です。それでは、問題を解いてみましょう。
grepの練習問題¶
まずは、grepの問題を5問です。
問題1:大文字と小文字を区別せずに検索する¶
sample.txt から、error と ERROR のどちらの行も表示したいとき、grep に付けるオプションとして正しいものはどれでしょうか。
- A.
-v - B.
-c - C.
-i - D.
-n
正解:C
-iは、大文字と小文字を区別せずに検索するオプションです。grep -i error sample.txtで、2行目と4行目の両方が表示されます。-vは一致しない行を表示、-cは一致した行数を表示、-nは行番号を付けて表示するオプションです。
問題2:一致した行の数を数える¶
/var/log/secure のなかで、Failed という文字列を含む行の数だけを表示したいとき、正しいコマンドはどれでしょうか。
- A.
grep -l Failed /var/log/secure - B.
grep -c Failed /var/log/secure - C.
grep -o Failed /var/log/secure - D.
grep -n Failed /var/log/secure
正解:B
-cは、一致した行の数を表示します。1行のなかにFailedが2回出てきても、数えるのは1行です。-lは一致したファイル名だけを表示し、-oは一致した部分だけを1つずつ表示します。-nは行番号付きで一致した行を表示します。
問題3:「または」を正規表現で書く¶
cat か dog のどちらかを含む行を表示したいとき、正しいコマンドはどれでしょうか。
- A.
grep 'cat|dog' animals.txt - B.
grep -E 'cat|dog' animals.txt - C.
grep -F 'cat|dog' animals.txt - D.
grep '[cat|dog]' animals.txt
正解:B
|は拡張正規表現の記号なので、grep -Eを使います。A は基本正規表現として解釈されるため、|はただの文字になり、cat|dogという文字列そのものを探します。C の-Fは正規表現を使わない固定文字列の検索なので、A と同じく文字列そのものを探します。D の[ ]は、かっこ内のどれか1文字という意味なので、cやaを1文字でも含む行がすべて表示されてしまいます。
問題4:数字だけの行を探す¶
sample.txt から、1文字以上の数字だけでできている行(12345 の行)を表示したいとき、正しいコマンドはどれでしょうか。
- A.
grep -E '[0-9]+' sample.txt - B.
grep -E '^[0-9]+$' sample.txt - C.
grep -E '^[0-9]*$' sample.txt - D.
grep -E '[^0-9]' sample.txt
正解:B
^で行の先頭、$で行の末尾を指定し、そのあいだを[0-9]+(数字が1文字以上)にすると、数字だけの行に一致します。A は数字を1文字でも含む行すべてに一致するので、日付の入った行も表示されます。C は*(0回以上)なので、空行にも一致してしまいます。D の[^0-9]は数字以外の1文字という意味です。
問題5:文字列を含むファイルの名前を探す¶
/etc 配下のすべてのファイルから、PermitRootLogin という文字列を含むファイルの名前だけを一覧で表示したいとき、正しいコマンドはどれでしょうか。
- A.
grep -rl PermitRootLogin /etc - B.
grep -rc PermitRootLogin /etc - C.
grep -rn PermitRootLogin /etc - D.
grep -rv PermitRootLogin /etc
正解:A
-rはディレクトリの中を再帰的に検索するオプションで、-lと組み合わせると、一致したファイルの名前だけが表示されます。B の-cは、一致しなかったファイルも含めて、ファイルごとに件数を表示します。C は一致した行を行番号付きで表示し、D は一致しない行を表示します。
ここまでの grep の問題で間違えたところは、オプションの意味を表にして覚え直すと整理しやすいです。
sedの練習問題¶
次は、sedの問題を3問です。sedは、置換・削除・特定の行の表示が問われることが多いコマンドです。
問題6:行の中のすべてを置換する¶
env.txt の中身は dev dev dev の1行だけです。この行を prod prod prod に変えて表示したいとき、正しいコマンドはどれでしょうか。
- A.
sed 's/dev/prod/' env.txt - B.
sed 's/dev/prod/g' env.txt - C.
sed 'y/dev/prod/' env.txt - D.
sed '/dev/prod/' env.txt
正解:B
s/置換前/置換後/は、各行で最初に見つかった1か所だけを置換します。行の中のすべてを置換するには、最後にgを付けます。A を実行するとprod dev devになります。C のyは1文字ずつ置き換えるコマンドで、置換前と置換後の文字数が同じでないとエラーになります。D は書き方が正しくないのでエラーになります。
sedの置換は、標準出力に結果を出すだけで、元のファイルは変わりません。ファイルを直接書き換えたいときは -i オプションを使います。
# 元のファイルを直接書き換える
sed -i 's/dev/prod/g' env.txt
# 書き換える前のファイルを env.txt.bak として残す
sed -i.bak 's/dev/prod/g' env.txt
本番のサーバーで設定ファイルを書き換えるときは、-i.bak のようにバックアップを残しておくと安心です。
問題7:特定の範囲の行だけを表示する¶
sample.txt の3行目から5行目だけを表示したいとき、正しいコマンドはどれでしょうか。
- A.
sed '3,5p' sample.txt - B.
sed -n '3,5p' sample.txt - C.
sed '3,5d' sample.txt - D.
sed -n '3p;5p' sample.txt
正解:B
sedは、何も指定しないと読み込んだ行をすべて表示します。
-nで自動の表示を止め、3,5pで3〜5行目だけを表示させるのが正しい書き方です。A は全行が表示されたうえで、3〜5行目がもう一度表示されます。C は3〜5行目を削除した残りを表示し、D は3行目と5行目の2行だけを表示します。
問題8:空行を削除する¶
sample.txt から空行を取り除いて表示したいとき、正しいコマンドはどれでしょうか。
- A.
sed 's/^$//' sample.txt - B.
sed '/^$/d' sample.txt - C.
sed '/$/d' sample.txt - D.
sed -n '/^$/p' sample.txt
正解:B
^$は、行の先頭のすぐあとに行の末尾が来る、つまり何も書かれていない行を表します。この行をdで削除すると、空行だけが取り除かれます。A は空行を空文字に置換するだけなので、行は残ります。C の$はすべての行の末尾に一致するので、全行が削除されます。D は逆に空行だけを表示します。
設定ファイルを読むときは、問題8の空行の削除と、コメント行の削除を組み合わせることがよくあります。コメント行の扱いは『LPIC 101試験(101-500)の練習問題』でも出題しているので、あわせて解いてみてください。
awkの練習問題¶
最後に、awkの問題を2問です。awkは、空白や区切り文字で分けた列(フィールド)を扱うのが得意なコマンドです。
問題9:区切り文字を指定して列を取り出す¶
/etc/passwd から、1列目のユーザー名だけを表示したいとき、正しいコマンドはどれでしょうか。/etc/passwd は、:(コロン)で区切られたファイルです。
- A.
awk '{print $1}' /etc/passwd - B.
awk -F: '{print $1}' /etc/passwd - C.
awk -F: '{print $0}' /etc/passwd - D.
awk -F: '{print $7}' /etc/passwd
正解:B
-Fで区切り文字を指定し、$1で1列目を表示します。A は区切り文字が空白のままなので、ユーザー名だけを取り出せません。C の$0は行全体、D の$7は7列目のログインシェルを表します。同じことは、103.2の範囲に入っているcut -d: -f1 /etc/passwdでもできます。
問題10:条件に合う行の列だけを表示する¶
/etc/passwd の3列目はUID(ユーザーID)です。UIDが 1000 以上のユーザー名だけを表示したいとき、正しいコマンドはどれでしょうか。
- A.
awk -F: '$3 >= 1000 {print $1}' /etc/passwd - B.
awk -F: '$1 >= 1000 {print $3}' /etc/passwd - C.
awk -F: '{print $1 >= 1000}' /etc/passwd - D.
awk -F: '$3 >= 1000' /etc/passwd
正解:A
awkは
条件 {処理}の形で書くと、条件に合う行だけに処理を実行します。A は3列目が1000以上の行で、1列目を表示します。B は条件の列と表示する列が逆です。C は比較の結果(1か0)を表示します。D は処理を省略しているので、条件に合う行の全体が表示されます。
多くのLinuxディストリビューションでは、一般ユーザーのUIDは1000から割り当てられます。サーバーに作られた一般ユーザーを確認したいときに、実務でもよく使う書き方です。
間違えやすいポイントのまとめ¶
10問を解いてみて、迷った問題はあったでしょうか。間違えやすいところを表にまとめておきます。
| ポイント | 覚え方 |
|---|---|
grep -c と grep -o |
-c は行の数、-o は一致した部分そのもの |
grep と grep -E |
+、?、()、縦棒の「または」を使うなら -E |
grep -F |
正規表現を使わず、文字列そのものを探す |
[abc] |
「abc」ではなく、a・b・cのどれか1文字 |
s/// と s///g |
g がないと、各行の最初の1か所だけ |
sed -n と p |
-n を付けないと、全行が表示されたうえで重複する |
^$ |
空行。$ だけだと全行に一致する |
awk -F |
区切り文字の指定。省略すると空白で区切る |
正規表現の記号は、基本正規表現と拡張正規表現のどちらで解釈されるかをセットで覚えるのが、103.7の問題を落とさないコツです。
また、grep・sed・awkは、パイプでつないで使うことがほとんどです。たとえば次のような使い方は、ログの確認でよく見かけます。
# ERRORを含む行から、日付の列だけを取り出して、日付ごとの件数を数える
grep -i error /var/log/app.log | awk '{print $2}' | sort | uniq -c
パイプやリダイレクトの考え方は、『リダイレクトの意味とは?』で解説しています。
InfraAcademyで続きの問題を解いてみよう¶
テキスト処理の問題は、コマンドの結果を頭の中で想像できるかどうかがポイントです。 問題を解いたら、実際にLinuxの環境で同じコマンドを打って、結果を確かめてみるのがおすすめです。
InfraAcademyでは「(無料)LPICの練習問題で毎日トレーニング300問」を用意していて、テキスト処理以外の101試験・102試験の範囲も無料で解くことができます。
続きは『InfraAcademy の資格模擬問題』から解いてみてください。
Linuxを基礎から順番に学びたい方は、『Linuxのロードマップ』もあわせて活用してみてください。コマンドの基本から、サーバーの構築までを順番に学べます。
パーミッションの問題も解きたい方は『Linuxのパーミッション練習問題10問』、LPICの勉強の進め方を知りたい方は『LPICの勉強方法』も参考にしてみてください。
まとめ¶
最後に、この記事の内容を振り返ります。
- grepとsedは、101試験の主題103.2と103.7で出題される
grep -Eを使うと拡張正規表現になり、|や+が使える- sedの置換は
gの有無、行の表示は-nの有無で結果が変わる ^$は空行を表し、sedのdと組み合わせると空行を削除できる- awkは
-Fで区切り文字を指定し、条件 {処理}の形で列を取り出せる
テキスト処理のコマンドは、試験のためだけでなく、ログの調査や設定ファイルの確認で毎日のように使います。 問題で覚えた書き方を、ぜひ実際のサーバーでも使ってみてください。



