Linuxでのテキストの効率的な処理
1 はじめに
テキスト処理とは、テキストの検索、置換、削除、並べ替えのことです。linuxでは、テキスト処理のための優れたツールが多数提供されており、linuxでのテキスト処理が非常に簡単になります。
ログ解析やテキスト抽出など、業務でテキスト処理を使うことが多いので、テキスト処理をしっかり把握しておくと、業務でとても役に立ちますね。
2 入力について
Linuxの思想では、コマンドを組み合わせて大きな力を発揮するために、ほとんどのテキスト処理コマンドは、入力としてファイルか標準入力があり、入力ファイルを指定しない場合は、デフォルトで標準入力から読み込むようになっています。出力は標準出力で、パイプラインの次のコマンドに渡されるか、ファイルに出力したい場合はリダイレクトされます。以下のコマンドは、特に指定がない限り、ファイルまたは標準入力から読み込むことができます。
<スパン 3 テキスト出力
<スパン 3.1 出力全体
-
エコー
Enter as command line arguments
非常に一般的なコマンドで、主に出力文字列として使用されます。パイプラインの次のコマンドに入力を渡すだけであれば、Here Stringを使用することができます。
echo xxx | md5sum md5sum <<< xxx
後者の方が、パイプを通さずに高速に処理できるはずです。
-
-n
改行を出力しない(デフォルトでは改行が出力されます)
-
-e
エスケープ記号の説明、よく使われるエスケープ記号 \t , \n このコマンドのもう一つの最も一般的な使用法は、次のように出力することです。 ANSIカラー :echo -e '\033[1;31mHello, \033[0m\033[1;33mworld!\033[0m'
こんにちは。 world!
このツール を使えば、簡単にANSIカラーを出力することができます。
-
-E
エスケープ文字を説明しない
-
-n
-
プリントフ
Enter as command line arguments
C言語のprintfに似た、欲しいテキストを出力する、より強力なコマンド
<プレprintf '\033[1;31m%s, \033[0m\033[1;33m%d\033[0m and \u4e2d\u6587!\n' "Hello" 34
こんにちは。 34 と中国語!
しかし、このコマンドはechoよりもずっと使用頻度が低く、ほとんどの場合、echoで事足りるのです。
-
yes [STRING] (はい)
Enter as command line argument
文字列 STRING を連続的に出力します。デフォルトは y です。このコマンドはあまり有用ではありませんが、例えば テール コマンドを使用します。
-
cat (連結)
このコマンドの最大の用途は特殊文字の表示でしょうが、パイプラインの次のコマンドに入力を渡すためによく使うと言われれば、もったいない話です。cat file | grep xxx grep xxx file
前者は後者より1つ多くプロセスを起動し、パイプラインを経由する。ファイルが大きければ、性能差は一目瞭然です。
-
-E
行末に$を表示する、行末にスペースやTABがあって行末がわからなくなることがあるが、このオプションを追加するとわかるようになる
-
-T
出力中のTAB記号を^Iに置き換えることで、空白の山の中で誰がTABなのかが簡単にわかるようになります
-
-v
印字不可能な文字を ^ と M- 表現で出力する。taoshanwen@taoshanwen-laptop ~$ echo -e '\r' | cat -v ^M
-
-e
vEと同等
-
-t
vTと同等
-
-A
vET と同等で、一般にこのオプションが最もよく使われます。
-
-n
行番号を表示することで、学生の興味を引くはずです。
-
-b
空白行以外の行番号だけを表示する、どなたか興味ありませんか?
-
-s
連続した空白行を1行だけ出力するために、このような要件を持つ学生を多く見かけます。
-
-E
-
タック
この名前から、cat の逆で、まず最終行を出力し、次に前後の行を出力し、最後に最初の行を出力することがわかります-
-s, -separator=STRING
テキストを分割するために、separatorを設定します。
-
-s, -separator=STRING
-
rev(リバース)
このコマンドもcatの逆バージョンですが、tacとは異なり、catと同じ順番で行を出力しますが、各行について、最後の文字が最初に出力され、その次に前の文字、そして最初の文字となり、次のコマンドは入力を反転させるコマンドです。tac | rev
-
nl(ナンバーライン)
行番号を表示するための、より強力なツールで、行番号の形式と幅を制御します。特別な必要はなく、cat -nを使用するだけです。
3.2 部分的な出力
-
ヘッド
テキストの最初の数行だけを表示する。例:head - 2 は最初の2行だけを表示する。
-
テール
headとは対照的に、このコマンドの最も一般的な使い方は、ファイルの最新の内容を表示し続けることです(tail -f)。-
-n, -K, -lines=K
末尾K行を表示、-n +KはK行目からテキスト末尾までを表示
-
-f, -follow[={name|descriptor}].
このオプションは、ファイルの末尾に新しいデータが追加された場合、そのデータも表示されることを意味します。このオプションは、ファイル名と記述子に基づいて、ファイルの更新を監視することができます。デフォルトはdescriptorです。
-
-リトライ
ファイルにアクセスできないときに再試行します。このオプションは -follow=name と組み合わせると便利です。
-
-F
follow=名前 -retryに相当します。
-
-n, -K, -lines=K
<スパン 4 テキスト検索
4.1 grep (グローバル正規表現プリント)
テキスト中のパターンにマッチした行を表示する非常に一般的なコマンドで、以下のオプションはすべて揃えておくとよいでしょう。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-
-E, -extended-regexp
拡張正規表現 (ERE) では、デフォルトは基本正規表現 (BRE) であり、メタキャラクタの ? , +, {, |, (, ) は特別な意味を失います (grep "a|b" が a や b を含む行を出力しないことはありませんか?) 特別な意味を表現したい場合は、エスケープ文字として、( \), (|), (|) を使用する必要があります。や "perl"、"perl+"などのエスケープ文字が必要です。
-
-F, -fixed-strings
パターンを固定文字列として扱い、正規のパース処理を行わない。このオプションは非正規の固定文字列(正規のメタキャラクタを含むこともある)を検索したいときに便利で、正規のパースをする必要がないため高速である。
-
-P, -perl-regexp
Perlのregular(PCRE)にパターンをパースします。perlのregularは強力で簡潔なので、このオプションを頻繁に使ってみてください。
-
-i, -ignore-case
パターン検索の際、大文字と小文字を無視します。このオプションが使えない場合は、例えばPCREを使用します。grep -P "(?i)AB"
-
-v, -invert-match
パターンに一致しない行を表示する
-
-e パターン
複数の検索パターンを指定したい場合や、マイナス(-)記号で始まるパターンを検索したい場合(パターンを直接grepするとgrepオプションとして解析される)などに使用します。
-
-f FILE, -file=FILE
ファイルからパターンを取得、1行に1つのパターン
-
-x, -line-regexp
pattern は行全体にマッチしなければなりません。このオプションは "^pattern$" と同じです。
-
-w、-word-regexp
このオプションは "\bpatternb" と等価です。
-
-c, -count
マッチした行を表示せず、マッチした行の数だけを表示します、 grep pattern | wc -l と同じです。
-
カラー[=WHEN], -カラー[=WHEN], -カラー[=WHEN], -カラー[=WHEN]の3種類。
一致するものを色で強調表示します。(require 'coding-settings) ("C-x U" revert-buffer-with-coding-system-no-confirm-sb))) ("C-x M-C" set-buffer-file-coding-system))) (set-buffer-file-coding-system 'unix)) (set-buffer-file-coding-system 'dos))
-
-m NUM, -max-count=NUM
NUM行が見つかったら、テキストの残りの部分のスキャンを停止します。
-
-q, -quiet, -silent
このオプションは、テキスト全体に一致するものがあるかどうかだけを確認したい場合に非常に便利で、より高速に実行できます。
-
-o, -only-matching
パターンにマッチする文字列のみを表示し、マッチする行の残りを表示しない
-
-n, -行番号
一致する行の前に行番号を表示するマッチした行の周囲に何があるかを見たいときがありますが、これらのオプションは非常に便利です。
-
-A NUM, -after-context=NUM
一致する行の後に続くNUM行を表示する
-
-B NUM, -before-context=NUM
一致する行の前のNUM行を表示する
-
-C NUM, -NUM, -context=NUM
一致する行の周囲にあるNUM行を表示する
-
-a, -text
この場合、grep はパターンがマッチするかどうかの情報のみを出力し、マッチしたすべての行を出力しません。このオプションは、grep にファイルをテキストファイルとして扱わせます。
-
-R, -r, -recursive
フォルダ以下のすべてのファイルを再帰的に処理する
-
-l, -files-with-matches
一致する行を表示せず、一致するファイルのみを表示します。
-
-L, -files-without-match(マッチしないファイル)
対照的に、-l は一致する行を表示せず、一致しないファイルのみを表示します。
-
-h, -ファイル名なし
複数のファイルを検索する場合、各行の前にファイル名が出力されますが、それが嫌な場合は、このオプションを使用してください。
4.2 fgrep
grep -F
4.3 イグレップ
grep -E
4.4 rgrep
grep -r
<スパン 4.5 agrep (近似グレップ)
grep のファジーマッチ版
<スパン 4.6 ズグレップ
圧縮ファイルを grep する。grep と全く同じオプションを受け付ける。
<スパン 4.7 sgrep (構造化グレップ)
SGML、XML、HTMLなどの構造化されたテキストを検索・抽出します。
<スパン 4.8 nrgrep (非決定的逆引きグレップ)
agrepに類似するプログラム
<スパン 5 テキスト概要
<スパン 5.1 wc(ワードカウント)
主な用途は行数のカウントです
-
-l, -lines
最も一般的なオプション(行数をカウントしています
-
-L, -最大行数
最も長い行の長さを出力する
-
-w, -words
出力語数
-
-m, -chars
文字数を出力する
-
-c, -bytes
出力バイト
5.2 md5sum
主にファイルの検証のために、ファイル転送時のエラーや改ざんを防ぐために、テキストのmd5を表示します。cオプションは、md5が正しいかどうかをチェックする。
<スパン 6 ソートと重複排除
6.1 ソート
非常に一般的なコマンドで、あらゆるものをソートすることができます。
-
-r, -reverse
逆順、デフォルトは小さいものから大きいものへ、-rは大きいものから小さいものへ
-
-c, -check, -check=diagnose-first (最初に診断)
入力ファイルが順番に並んでいるかどうかをチェックし、並んでいない場合はどの行が最初に順番に並んでいないのかを表示する
-
-C, -check=quiet, -check=silent
c と似ていますが、エラーメッセージを表示する代わりに、エラーコード 1 のみを返します。
-
-k, -key=POS1[,POS2]です。
これは、ソートされるオブジェクトを正確に制御することができる、ソートのnbest部分であるべきです。POSはこのような形をしています。F[.C][OPTS]
ここで、Fはフィールド番号、Cは単語記号、OPTSはソートオプションで、フィールドごとに異なる規則を持つことができる。F、Cはともに1から始まる
sort -t ' ' -k1,1d -k2.2,2n <<-EOF bb 113 aa 224 cc 323 dd 444 cc 513 EOF aa 224 bb 113 cc 513 cc 323 dd 444
-
-u, -unique
出力の重複を解消し、重複する行のうち最初の行だけを出力します。
-
-m, -merge
このオプションは、マルチコアマシン上で大規模なデータセットのソートを最適化することができます。
-
-s, -stable
ソートを安定ソートにする
-
-T, -temporary-directory=DIR。
指定したテンポラリフォルダを中間データの格納場所として設定します。このオプションは、非常に大きなファイルを仕分けする際に、/tmp があるパーティションに十分な空き容量がない場合に使用されます
-
-n, -数値ソート
入力を整数でソートし、負の数を含むが、プラス記号 (+) を含む正の数はないため、この入力には -g を使用します。
-
-g, -general-numeric-sort(一般的な数値ソート)。
入力を数値でソートすれば、浮動小数点数の数値も可能です。入力が整数の場合は、-nを使えばいい、その方がパフォーマンスが高い。
-
-h, -人為的な数値ソート
2Kや1Gなど、単位を持った数字を並べ替えることができるので、かっこいいし、すべてのファイルやフォルダー内のファイルのサイズを並べ替えたい。du -sh * | sort -h
-
-M, -月ソート
月別に並べ替え、`JAN' < `FEB' < ... < `DEC'
-
-d、-dictionary-order
アルファベット、数字、空白文字以外のすべての文字を無視して、辞書順に並べ替える。
-
-V, -バージョンソート
多くのバージョンを開発されましたか?バージョン番号で分類してください。
-
-t, -field-separator=SEP
フィールドセパレータを設定します。デフォルトは空白文字です。残念ながら、このフィールドセパレーターは1文字しか使用できません。
-
-b, -ignore-leading-blanks
先頭の空白を無視する
-
-f, -ignore-case
ケースを無視する
-
-i, -ignore-nonprinting
印字されない文字を無視する
-
-R, -random-sort
ランダムソート、必要だと思いますよ、私もとりあえず何度か使ったことがあります。しかし、ソートは完全にランダムではありません。ソートはまず各行のハッシュを行い、次にハッシュ値をソートするので、同じ行が一緒になるように縛られています。でも、たぶん、それがあなたの欲しいものなのでしょう。もし、もっとゴチャゴチャしたものや強力なものをお望みなら、以下をご覧ください。 こちら
-
トラップ
中国語のファイルをソートしても、正しい結果が得られないことがよくあるのではないでしょうか?その通り、ロケールが設定されていない可能性がありますので、LC_ALL=C sortを試してみてください。ソートは、入力されたテキストをロケールに従って並べ替えます。LC_ALL=Cは、バイト値でソートすることを意味します。LANG=C sortなんてよく見るよと言われそうですが、bash infoにあるLANGとLC_ALLの説明を見てみましょう。LANG Used to determine the locale category for any category not specifically selected with a variable starting with LC_. LC_ALL This variable overrides the value of LANG and any other LC_ variable specifying a locale category. LC_COLLATE This variable determines the collation order used when sorting the results of pathname expansion, and determines the LC_COLLATE This variable determines the collation order used when sorting the results of pathname expansion, and determines the behavior of range expressions, equivalence classes, and collating sequences within pathname expansion and pattern matching.
-
LANG
LC_を使用してロケールを設定しない場合、LANGはカテゴリのロケールを決定するために使用されます -
LC_ALL
この変数はLANGとLC_の両方をオーバーライドします。 -
LC_COLLATE
この変数は、ソートする際のロケールを設定する。
そのため、ソートする場合はLC_ALLを設定するのが最も安全です。
-
LANG
6.2 tsort (トポロジカルソート)
トポロジカルソート、これはおそらくあまり使われないでしょう
tsort <<EOF
a b c
d
e f
b c d e
EOF
出力します。
a
b
c
d
e
f
6.3 ユニック
これも非常によく使われるコマンドです。このコマンドは主に順序配列の重複排除に使われるので、sortと組み合わせて使われることが多いのですが、sort -u自体が重複排除の機能を持っているので、単に重複排除をしたいときにはsort -uが役に立ちます(入力テキストが巨大なときはawkの連想配列などhashで高性能に重複排除できます)、重複データを数える必要があるときは、uniqを使うことになるでしょう。もちろん、重複データの処理には、実はsort -uよりもuniqの方が強力です
-
-c, -count
各テキスト行の前に繰り返し回数を出力する
-
-d、-repeated
重複行のみ表示、重複行は一行のみ表示
-
-D、-all-repeated[=delimit-method]です。
繰り返される行をすべて表示する。このオプションと -d オプションの違いに注意。
-
-u, -unique
重複していない行のみを印刷する
-
-i, -ignore-case
比較は大文字と小文字を区別しない
-
-f, -skip-fields=N
最初のN個のフィールドを比較しない、フィールドセパレータは空白文字である
-
-s, -skip-chars=N
最初のN文字を比較しない
-
-w, -check-chars=N
1行に最大N個の先行文字を比較する
-
インスタンスデモ
以上のuniqの選択肢を読んで、uniqはあまり使えないと感じたことはありませんか?これは錯覚で、uniqの賢い応用として集合演算(統計学では応用範囲が広い)を紹介します。-
連結
sort A B | uniq
-
交差点
ソート A B|uniq -d
-
差分セット(A-B)
ソート A B B|uniq -u
-
連結
-
不具合
- フィールドセパレータを制御できない
- sort -k のように、比較するオブジェクトを正確に制御することはできません。
<スパン 6.4 コマンド
並べられた2つのファイルを1行ずつ比較し、ファイル1に固有の行、ファイル2に固有の行、ファイル12に共通の行を3列で出力する。
$ cat ab
ax
by
cz
$ cat ac
ax
bd
by cz
$ comm ab ac
ax
bd
by
cz
-
-1
最初の列(ファイル1に固有の行)を出力しない
-
-2
2列目(ファイル2固有の行)を出力しない
-
-3
ファイル3に固有の行の3列目を出力しない
-
-チェック順序
入力ファイルが順番に並んでいることを確認する
-
-nocheck-order
入力ファイルの順序をチェックしない
-
-出力デリミタ=STR
出力区切り文字を設定、デフォルトはTAB
-
デモの例
-
交差点
comm -12 <(Aソート) <(Bソート)
-
差分セット(A-B)
comm -23 <(Aソート) <(Bソート)
-
交差点
<スパン 7 オペレーション分野
7.1 カット
フィールドを取るのが非常に簡単になる、かなり一般的なコマンドです。
-
-f, -fields=LIST
出力するフィールドを選択します
-
-c, -文字列=LIST
出力する文字を選択する
-
-b, -bytes=LIST
出力するバイトを選択する
-
-d, -delimiter=DELIM
フィールドセパレータを設定します。デフォルトはTABです。残念ながら、このセパレータも1文字しか使えない。
-
-補完
セット選択の補数を取る LIST
-
-s、-only-delimited です。
区切り文字を含まない行は無視し、行全体を出力するのがデフォルトの動作です
-
-出力デリミタ=STRING
出力デリミターの設定
-
リスト
f, -c, -b オプションはリストで使用され、次のような形式をとることができる。-
N
N番目のフィールド/バイト/文字 -
N -
第Nから第Lまで -
M-N
月~金 -
-M
第1位から第n位まで
カンマで区切って複数のリストが存在することもあります。
cut -f1-3,4-7
-
N
7.2 ペースト
これは面白いコマンドで、2つのファイルを1行で貼り合わせます。かつて私はこれを行うプログラムを自分で書きたいと思ったのですが、linuxにはすでにこれがあることを知りました(linuxはいつも驚きを与えてくれます)。
$ cat num2
1
2
$ cat let3
a
b
c
$ paste num2 let3
1 a
2 b
c
-
-d, -delimiters=LIST
2つのファイルを貼り付ける場合、デフォルトではTABで分割されます。このオプションはセパレータを設定しますが、残念ながら1文字しか使えません(主に、pasteは複数のファイルを貼り付けることができ、このオプションの2文字目が2番目と3番目のファイルを分割するために使われるからです)。
-
-s、-serial
デフォルトでは縦方向に貼り付けられますが、このオプションを追加すると横方向に貼り付けられます。$ paste -s num2 let3 1 2 a b c
7.3 参加
これは少し高度なコマンドで、入力ファイルをキーと値のペアとして扱い、例えば同じキーに対するすべての値を1つにまとめて貼り付ける。
$ cat file1
a 1
b 2
c 3
$ cat file2
a 4
c 6
$ join file1 file2
a 1 4
c 3 6
デフォルトでは、joinは最初のフィールドをキーとして扱い、フィールドはスペースで区切られ、キーとなるフィールドは順序付けされている必要があります。
-
-i, -ignore-case
フィールドを比較する場合、大文字小文字を無視する
-
-t CHAR
CHARをフィールドの区切り文字として使う、これも1文字だけ(ガラクタ...)
-
-1 フィールド
最初のファイルのキーをFIELDフィールドに設定する
-
-2 FIELD
2つ目のファイルのキーをFIELDフィールドに設定する
-
-j FIELD
-1フィールド -2フィールド
-
-a FILENUM
デフォルトでは、joinは同じキーを持つ行のみを表示します。このオプションは、最初のFILENUMファイル内の一致しない行を表示します。
-
-v FILENUM
このオプションは-aオプションに似ていますが、最初のFILENUMファイル中の一致しない行だけを表示し、一致する行は表示しません。
-
-チェックオーダー
入力ファイルのキーとなるフィールドが順番に並んでいることを確認する
-
-nocheck-order
注文のキーフィールドとして入力ファイルをチェックしない
-
-o フィールドリスト
出力オブジェクトを制御するための高度なオプションで、FIELD-LISTの各要素は次のような形式になっています。-
0
キーとして使用するフィールドを示す。 -
M.N
Mはファイル番号、値は0または1、Nはフィールド番号、M.NはM番目のファイル、N番目のフィールド
各要素はカンマまたはスペースで区切られる
-
0
-
-e EMPTY
oオプションは、ファイルMのフィールドNがない場合があり、出力ではEMPTYに置換されます。
<スパン 8 文字を操作する
8.1 tr (翻訳)
主にテキスト中の文字の置き換え、削除を行います。
- このコマンドは、標準入力にのみ対応しています。 ファイルからの入力はサポートしていません .
- tr は半角文字のみをサポートしています。
tr [OPTION]... SET1 [SET2]
文字セットは、一連の文字で構成される場合と、次のような形式の場合があります。
-
CHAR1-CHAR2
CHAR1 から CHAR2 までのすべての文字 -
[CHAR*]です。
このフォームはSET2にしか表示されないので、SET2とSET1の長さが等しくなるまでCHARをコピーしてください。 -
[CHAR*REPEAT】(チャールリピート]
REPEAT a CHAR -
[:alnum:]です。
すべての文字と数字 -
[:アルファ:]です。
すべての文字 -
[=CHAR=]です。
CHARと同じ文字クラスに属するすべての文字
2文字のセットが提供された場合、例えばSET1の文字をSET2の対応する文字に置き換えることを意味します。
tr a A < file # Replace all lowercase a's in the file with uppercase A's
tr '[:lower:]' '[:upper:]' < file # Make the file file all uppercase
-
-d、-delete
コレクション1に登場する文字をすべて削除します。次のコマンドは、ファイルファイル内のすべての行を1行に連結します。tr -d "\r\n" < file
-
-s, -squeeze-repeats
SET1 の連続するすべての文字を 1 文字に置換し、SET2 もある場合は、まず連続する文字の削除を行い、次に置換を行います。
関連
-
LinuxでのPythonとpipのインストールと "AttributeError: module 'pip.__main__' has no attribute '_main'エラー"
-
mvn -v error: main class not found or couldn't be loaded org.codehaus.plexus.classworlds.launcher.
-
psycopgのアセンブルはエラーになります。Error: pg_config 実行ファイルが見つかりません。
-
変数 `xxx' の解は、初期化子を持っているが型が不完全である。
-
VNC mesg を開くとき: ttyname に失敗しました。デバイスに不適切な ioctl
-
警告について:互換性のないポインタ型からの初期化【デフォルトで有効
-
プログラム下部の2つのスイスアーミーナイフをこじ開ける
-
ImportError: Flaskという名前のモジュールがなく、パッケージのインポートに失敗しました。
-
gdbが実行可能なファイル形式でない ファイル形式が認識できない
-
pow関数に対する解決策 gcc compile prompt undefined reference to `power'
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedmakefile:n: *** セパレータがありません。
-
undefinedlinuxでは127.0.0.1、 : では0.0.0.0です。
-
MongoDBインストール+解決エラー。mongod.service の起動に失敗しました:until not found
-
警告: 組み込み関数 'exit' の非互換な暗黙の宣言
-
を作ってください。*** ターゲット `menuconfig' を作成するためのルールがありません。 停止.問題解決-Linux (3)
-
これを知らなければ、おそらくLinuxを使い始めてもいないでしょう
-
シェルスクリプトに$0, $? , $! , $$, $*, $#, $@ などのシェルスクリプトとlinuxコマンド実行時の戻り値の意味
-
Linux "std::bad_allocのインスタンスを投げた後に呼び出されたterminate what(): std::bad_alloc Aborted "
-
cp: 通常のファイル `/usr/local/bin/orange' を作成できません。テキストファイルがビジー状態
-
Linuxでよくあるパーミッション関連のエラーとその解決法