Linux研修ブログ

5.ファイルや文字の処理とディレクトリ構成

ねぎ -2020-01-20

ペンギン

Linuxのディレクトリ構成について

Linuxのディレクトリ構成は「/(ルート)」を起点としています。

FHSという規格に基づいてディレクトリ構成が決められています。

各ディレクトリで役割りが異なります。 ここで確認しておきましょう

ディレクトリ名 役割り
/ ルート。Linuxディレクトリ構成の最上位にあたります
/boot Linuxカーネルを起動する際に必要なファイルを配置するディレクトリ
/etc システムの設定ファイルが配置されているディレクトリ
/bin システム管理者とユーザーによって利用されるコマンドを配置するディレクトリ
/sbin システム管理者が利用するコマンドが配置されているディレクトリ
/usr システムを利用するユーザーで共有するデータを配置するディレクトリ、「User Serivice and Routine」の略
/var 変わりやすいデータを配置するディレクトリ、ログファイルなど
/dev 特殊ファイル(デバイスファイル)を配置するディレクトリ
/tmp システムが一時的な作業ファイルを配置するときに使用するディレクトリ。 tmpfs という疑似ファイルシステムを使用するのが一般的
/proc Linuxのプロセスを操作したりするディレクトリ「Process File System」の略、システム情報のほかに、全プロセスリストも保持

【ファイルや文字の処理】grepコマンドを詳しく!

Linuxにはフィルタコマンドというファイルから特定の条件の文字列を抽出するコマンドがあります。

そのコマンドこそがgrepです。

Windowsでもfindstrといったフィルタコマンドがありますが

Linuxのgrepはマスターすると大変便利です。

grepコマンドは以下のように実行します。

grep オプション パターン [ファイル]

grepでディレクトリの中を再帰的に検索する

「-r」オプションでディレクトリの中を再帰的に検索することができます。

grep -r ユーザー名 /etc/ | head -n 10

ユーザー名が含まれているファイル内容をディレクトリを再帰的に検索して10件表示する

「-i」オプションで大文字小文字を問わない検索が可能です。

「-v」オプションでマッチする行以外の行を表示します。

grepのオプションまとめ

オプション 説明
-i 大文字と小文字を区別しない
-v マッチしていない文字列
-r フォルダを再帰的に検索
-w 完全一致

grepと正規表現を組み合わせる

正規表現とはご存知かもしれませんがメタ文字と呼ぶ特殊文字列で表現する方法です。

以下が主な正規表現の一覧です

正規表現 意味
. 任意の1文字
^ 行頭にマッチする
$ 行末にマッチする
[ ~ ] ~に指定した1字(たとえば [ 0-9 ] なら0から9)
[^] 「[]」 内に指定した以外の1字(たとえば a-z ならAからZ以外の文字)
{n} 直前のパターンをn回繰り返す
* 直前のパターンを0回以上繰り返す
+ 直前のパターンを1回以上繰り返す
? 直前のパターンを0か1回繰り返す
<> 完全マッチ

?や+を使う際はバックスラッシュ「\」を使用してください

$ grep 'ro\{2,\}t' /etc/passwd

と検索するとrootユーザーについて検索した結果が表示されます。

ファイルをフィルタリングするコマンド一覧

以下がgrepのほかにもテキストをフィルタリングできるコマンドの一覧です

コマンド 説明
head 最初のn行を表示 head -n5 test.txt #最初の5行を表示
tail 最後のn行を表示 tail -100f /var/log/apache2/error.log #Apacheのエラーログの最後の行から100行までを出力
tr 文字の変換、削除を行う。-dオプションで特定の文字列の削除ができる echo "email@test.com" \| tr [:lower:] [:upper:] #メールアドレスを小文字から大文字に置換
cut 指定した範囲を切り出して出力 cut -d ":" -f 1,6 /etc/passwd #/etc/passwdの「:」で区切った1番目と6番目を出力する
sort 行単位で並べ替える sort -r /var/log/apache2/error.log \| head -n 100 #Apacheのエラーログの最後の100行を表示する

フィルタリングに複雑な処理を追加する(sed,awk)

sedは処理する対象行の位置を示す「アドレス」を含めることができます。 また、行の処理内容を支持することもできます。

ファイル内の文字列を全行置換する

$ sed -e "s/test/line/g" /home/user/test.txt

ファイル内の行のレンジで置換する(この場合だと1行目から3行目)

$ sed '1,3 s/unix/linux/' geekfile.txt

「/etc/hosts」ファイルの1~3行目にsコマンドで行頭に「#」を入れる

$ sed -e "1,3s/^/# /" /etc/hosts

行の最初から2番目だけ文字を置き換える(1行のみ)

$ sed 's/unix/linux/2' filename.txt

最後の行だけ削除する

$ sed '$d' filename.txt

awkはパイプコマンド「|」を使うときに便利なコマンドです。 スクリプトのような複雑なコマンドを組むことができます。

例:3列目が1000以上の行について行番号(NRで表します)を先頭につけて表示する

$ awk -F":" '$3 >= 1000 { print NR, $0 }' /etc/passwd

ファイルを検索したり状態を確認するコマンド

コマンド名 説明
locate 定期的に更新されるファイル名データベースを参照し、システムに配置されるファイル名やディレクトリ名を検索する locate *bashr* \| head -n 3 #bashrにマッチするファイルを検索し3行だけ表示する
find ファイルやディレクトリを検索する $ sudo find /etc -name interfaces* #「interfaces」にマッチしたファイルを表示する
stat ファイル状態(ファイルサイズ、ファイルの種類、ファイルのアクセス権限など)を確認する stat /bin/ls #lsコマンドの情報を一覧する

findコマンドについてもっと詳しく

ファイルを検索し削除する

find ./foo -name foo.txt --delete

ファイル権限が「読み、書き、実行(777)」のファイルを検索する

find ./foo -perm 777

ディレクトリのファイル権限をすべて「読み、書き、実行(777)」に変更する

find ./foo -type f -name bar -exec chmod 777 {} \;

確認クイズ

Q. 「$ sudo grep 'lo?[a-z]{0,1}'」の結果として当てはまらないものはどれでしょうか?

  • 1.「sync:x:4:65534:sync:/bin:/bin/sync」
    1. 「mongodb:x:113:123::/var/lib/mongodb:/usr/sbin/nologin」
    1. 「postfix:x:117:120::/var/spool/postfix:/bin/false」
    1. 「_apt:x:106:65534::/nonexistent:/bin/false」