GNUとUnixのコマンド(テキスト処理・パイプ)
フィルタ(sort/uniq/cut/tr/sed/grep)の既定動作と主要オプション、パイプ・リダイレクト(特に2>&1の記述位置)を正確に押さえ、定型パイプラインの入出力を1段ずつ追えることが本章攻略の鍵である。
本章はLinuCレベル1 101試験(バージョン10.0)の主題1.03「GNUとUnixのコマンド」のうち、副主題1.03.2「フィルタを使ったテキストストリームの処理」、1.03.3「ストリーム、パイプ、リダイレクトの使用」、1.03.6「正規表現を使用したテキストファイルの検索」を扱う。前提となるのが標準ストリームの概念である。Linuxのプロセスは起動時に3つの入出力チャネルを持つ。標準入力(stdin、ファイルディスクリプタ0)、標準出力(stdout、同1)、標準エラー出力(stderr、同2)である。フィルタコマンドとは、標準入力からテキストを受け取り、加工して標準出力へ書き出すコマンドの総称であり、パイプで連結することで複雑な処理を1行で構成できる。この「小さな道具を組み合わせる」設計思想がUnixの核心であり、本章の全コマンドはこの枠組みの上で理解すべきである。
まずファイル内容の表示系フィルタを押さえる。catはファイルを連結して標準出力に書き出し、-nで全行に行番号を付ける。tacは行の順序を逆にして出力する。headはファイルの先頭を、tailは末尾を表示し、いずれも行数指定がなければデフォルトで10行を出力する(-n 20のように変更可能)。特にtail -fはファイルに追記される内容を継続的に監視表示するオプションで、ログ監視の文脈で出題実績が高い。wcは行数(-l)、単語数(-w)、バイト数(-c)を数え、オプションなしでは3つすべてを表示する。nlは行番号を付けて出力するが、デフォルトでは空行に番号を付けない点がcat -nとの相違点である。odはファイルを8進数などでダンプ表示し、バイナリ確認に使う。splitは-lで指定行数ごとにファイルを分割する。こうした既定動作(10行、空行の扱い)の数値まで問われるのが本試験の特徴である。
列の抽出と並べ替えは最頻出領域である。cutは-cで文字位置、-fでフィールド番号を指定して列を切り出す。-fを使う場合、区切り文字のデフォルトはタブであり、CSVでは-d ','のように-dで区切り文字を明示する必要がある。pasteは複数ファイルを行単位で水平に連結し、joinは共通フィールドをキーに2ファイルを結合する。sortはデフォルトで辞書順に並べ、-nで数値順、-rで降順、-kでキーとなるフィールドの指定、-tで区切り文字の指定、-uで重複排除を行う。uniqは連続する重複行のみをまとめるため、事前に並べ替えて「sort file | uniq」の形で使うのが定石である。-cで出現回数を行頭に付け、-dで重複行のみ、-uで重複しない行のみを出力する。trは文字集合単位の変換・削除(-d)・連続文字の圧縮(-s)を行うが、引数にファイル名を取れず標準入力からのみ読む点がひっかけとして頻出する。expand/unexpandはタブとスペースを相互変換する。
sedは非対話型のストリームエディタであり、入力を1行ずつ読み込み、指定した編集コマンドを適用して標準出力へ書き出す。最重要は置換命令sで、「sed 's/old/new/' file」は各行の最初のoldのみをnewに置換し、行内のすべてを置換するには末尾にgフラグを付けて「s/old/new/g」とする。dは行の削除(sed '1,3d'で1〜3行目を削除)、pは行の表示であり、pは自動出力を抑止する-nオプションと組み合わせて「sed -n '5,10p' file」のように特定行の抽出に使う。アドレスには行番号のほか/正規表現/も指定でき、-eで複数の編集コマンドを連ねられる。y命令は文字を1対1で変換する命令で、文字列を置換するsとは動作が異なる。-iはファイル自体を直接書き換えるため「標準出力に表示する」問題では誤答肢になる。gフラグの有無、-nとpの組み合わせは繰り返し問われる論点である。
リダイレクトとパイプは副主題1.03.3の中核である。>は標準出力をファイルへ上書き、>>は追記、2>は標準エラー出力のリダイレクト、<は標準入力の切り替えである。<<はヒアドキュメントで、指定した終端文字列までの入力を標準入力として渡す。標準出力と標準エラー出力を同じファイルへまとめるには「command > file 2>&1」と書き、2>&1を> fileより後に置く必要がある。リダイレクトは左から右へ評価されるため、順序を逆にすると標準エラー出力は元の標準出力(端末)へ向いたままになる。bashでは&> fileという短縮記法もある。パイプ|は前のコマンドの標準出力を次のコマンドの標準入力へ接続する。teeは標準入力を標準出力とファイルの両方へ書き出し(-aで追記)、パイプラインの途中結果を保存するのに使う。xargsは標準入力から読んだデータをコマンドの引数に変換して実行するもので、「find … | xargs rm」の形が典型である。
副主題1.03.6の正規表現は、基本正規表現(BRE)と拡張正規表現(ERE)の差異を軸に整理する。BREでは^(行頭)、$(行末)、.(任意の1文字)、*(直前要素の0回以上の繰り返し)、[](文字クラス)が使え、EREではさらに+(1回以上)、?(0または1回)、|(選択)、()(グループ化)がエスケープなしで使える。grepはデフォルトでBREを解釈し、-EオプションでEREを有効にする(旧来のegrepに相当)。-Fは正規表現を使わない固定文字列検索でfgrepに相当する。grepの主要オプションとして、-iは大文字小文字の無視、-vは一致しない行の表示、-nは行番号付き表示、-cは一致した行数の表示、-lは一致したファイル名のみの表示、-rはディレクトリの再帰検索である。-vと-lの意味の取り違えや、BREのgrepで+や?がそのまま使えるかのように見せる選択肢が定番のひっかけである。
本試験はCBT形式で、コマンドラインの穴埋めや「この出力を得るコマンドはどれか」という実務直結の形式で問われる。したがってオプションの丸暗記ではなく、実機で入力して出力を確認する学習が最短経路である。特に、sort file | uniq -cによる頻度集計、cut -d ':' -f 1 /etc/passwdによるユーザー名一覧の抽出、grep -v '^#'によるコメント行の除去、tail -f /var/log/以下によるログ監視といった定型パイプラインは、部品の順序やオプションを入れ替えた選択肢が並ぶため、各コマンドの入力と出力を1段ずつ追える状態にしておくこと。また、既定値(head/tailの10行、cutのタブ区切り、grepのBRE解釈)と、uniqの隣接行限定、trのファイル引数不可、2>&1の記述位置という4大ひっかけは合否を分ける頻出論点であり、本章の章末問題でも重点的に確認する。
この章の問題から3問
uniqコマンドはファイル全体を走査し、離れた位置にある重複行もすべてまとめて処理するため、事前にsortコマンドで並べ替えておく必要はない。
正解 ×(誤り)
誤り。GNU coreutilsのuniqは「連続する(隣接した)」重複行のみを検出・集約する仕様であり、離れた位置にある重複行は処理できない。そのため「sort file | uniq」のように事前にsortで並べ替えるのが定石である(sort -uでも同等の重複排除が可能)。「ファイル全体を走査して重複をまとめる」という動作説明の部分がひっかけ。公式シラバス副主題1.03.2「フィルタを使ったテキストストリームの処理」の対象コマンド。
「command > file.txt 2>&1」と実行すると、commandの標準出力と標準エラー出力の両方がfile.txtに書き込まれる。
正解 ○(正しい)
正しい。リダイレクトは左から右へ順に評価される。まず「> file.txt」でファイルディスクリプタ1(標準出力)がfile.txtに向き、次に「2>&1」でファイルディスクリプタ2(標準エラー出力)がその時点のFD1の複製、すなわちfile.txtに向く。ひっかけは順序を逆にした「command 2>&1 > file.txt」で、この場合2>&1の時点でFD1はまだ端末を指しているため、標準エラー出力は端末に表示されたままになる。公式シラバス副主題1.03.3「ストリーム、パイプ、リダイレクトの使用」。
headコマンドとtailコマンドは、行数を指定しない場合、それぞれファイルの先頭・末尾から20行を表示する。
正解 ×(誤り)
誤り。GNU coreutilsのhead/tailのデフォルト表示行数は20行ではなく10行である。行数を変えるには「head -n 20 file」「tail -n 20 file」のように-nオプションで指定する。既定値の数字を差し替えるのは本試験の典型的なひっかけパターン。公式シラバス副主題1.03.2の対象コマンド。
登録不要 ・ 採点と解説はその場 ・ 進捗は端末に保存
LinuC レベル1(101試験)の他の章
- Linuxのインストールと仮想マシン・コンテナ
- ファイル・ディレクトリの操作と管理(パーミッション)
- プロセス管理とシェルスクリプトの基礎
- ハードウェアとデバイス・ファイルシステム
- ネットワークの基礎とセキュリティ管理
本ページの講義ノートと問題は、各試験の出題範囲に基づきAIが作成し、法令・基準に照らして別のAIレンズで敵対的に検証したものです(検証プロセス)。法改正等で誤りが見つかった場合は随時修正します。合格を保証するものではありません。