LPIC-1 Exam 101 無料問題 8 / 10 ・ 分野3: GNU and Unix Commands
app.conf の中身は、1行目から順に「# header」「port=80」「 # note」(先頭に空白2つ)「#host=x」「user=www」の5行である。grep -vn '^#' app.conf の出力として正しいのはどれか。
- 1:port=80/2:user=www
- 2:port=80/5:user=www
- 1:port=80/2: # note/3:user=www
- 2:port=80/3: # note/5:user=www
正解と解説を見る
正解: D
正解の理由
^ は行の先頭の空の文字列に一致するアンカーなので、'^#' は「行の1文字目が #」の行だけに一致する。-v は一致を反転して一致しなかった行を選び、-n は出力する各行の前に、入力ファイルの中での行番号を付ける。1行目と4行目は先頭が # なので外れ、2・3・5行目が残る。3行目は # の前に空白があり1文字目が # ではないので、コメントの見た目でも選ばれる。
違う選択肢
「2:port=80/5:user=www」… ^ が行頭の空白を飛ばして最初の文字を見ると考えている。^ は行の本当の先頭だけに一致するので、字下げしたコメントまで外したいなら '^[[:space:]]#' のように空白を許す形にする。
「1:port=80/2: # note/3:user=www」… -n が出力した行を1から数え直すと考えている。付く番号は元のファイルでの行番号なので、飛んだ番号から外れた行が分かる。
「1:port=80/2:user=www」… 空白の読み飛ばしと番号の数え直しの両方を取り違えている。どちらも起きないので、3行が元の行番号つきで出る。
押さえどころ
設定ファイルからコメントを除いて中身を見るときに grep -v '^#' はよく使うが、字下げしたコメントと空行は残る。-c を足せば行の代わりに件数だけが出て、-v と組むと一致しなかった行の数になる。