テキスト処理には Linux コマンドの cut を使用します。このコマンドを使用して、列を選択してファイルからテキストの一部を抽出できます。
このチュートリアルでは、日常のコマンド ライン アクティビティで使用できるカット コマンドの実用的な例をいくつか紹介します。
ほとんどの例では、次のテスト ファイルを使用します。
$ cat test.txt cat command for file oriented operations. cp command for copy files or directories. ls command to list out files and directories with its attributes.
1.文字の列を選択
ファイルから目的の列のみを抽出するには、-c オプションを使用します。次の例は、ファイル test.txt の各行の 2 番目の文字を表示します
$ cut -c2 test.txt a p s
上記のように、文字 a、p、s は、test.txt ファイルの各行の 2 番目の文字です。
2.範囲を使用して文字列を選択
- で区切られた開始位置と終了位置を指定することにより、ファイルから文字の範囲を抽出することもできます。次の例では、test.txt というファイルから各行の最初の 3 文字を抽出します
$ cut -c1-3 test.txt cat cp ls
3.開始位置または終了位置を使用して文字列を選択
-c オプションを使用して、開始位置または終了位置をカット コマンドに渡すことができます。
以下は、'-' の前の開始位置のみを指定します。この例では、test.txt ファイルから 3 文字目から各行の末尾までを抽出します。
$ cut -c3- test.txt t command for file oriented operations. command for copy files or directories. command to list out files and directories with its attributes.
以下は、'-' の後の終了位置のみを指定します。この例では、test.txt ファイルから各行の先頭から 8 文字を抽出します。
$ cut -c-8 test.txt cat comm cp comma ls comma
以下に示すように、「-」の前後に数字を指定しないと、行全体が出力されます。
$ cut -c- test.txt cat command for file oriented operations. cp command for copy files or directories. ls command to list out files and directories with its attributes.
4.ファイルから特定のフィールドを選択
x 個の文字を選択する代わりに、フィールド全体を抽出したい場合は、オプション -f と -d を組み合わせることができます。オプション -f は抽出するフィールドを指定し、オプション -d は入力ファイルで使用されるフィールド区切り文字を指定します。
次の例では、フィールド区切り文字 (コロン) を使用して、/etc/passwd ファイルの各行の最初のフィールドのみを表示します。この場合、最初のフィールドはユーザー名です。ファイル
$ cut -d':' -f1 /etc/passwd root daemon bin sys sync games bala
5.ファイルから複数のフィールドを選択
ファイルまたは stdout から複数のフィールドを抽出することもできます。以下の例では、ログイン シェルが「/bin/bash」であるユーザーのユーザー名とホーム ディレクトリが表示されます。
$ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6 root:/root bala:/home/bala
フィールドの範囲を表示するには、次のように開始フィールドと終了フィールドを指定します。この例では、フィールド 1 から 4、6、および 7 を選択しています
$ grep "/bin/bash" /etc/passwd | cut -d':' -f1-4,6,7 root:x:0:0:/root:/bin/bash bala:x:1000:1000:/home/bala:/bin/bash
6.行に区切り記号が含まれている場合にのみフィールドを選択
この /etc/passwd の例では、:(コロン) 以外の別の区切り文字を渡すと、cut は行全体を表示するだけです。
次の例では、区切り文字を | として指定しています。 (パイプ) であり、cut コマンドは、| を含む行が見つからない場合でも、単に行全体を表示します。 (パイプ) 区切り記号として。
$ grep "/bin/bash" /etc/passwd | cut -d'|' -f1 root:x:0:0:root:/root:/bin/bash bala:x:1000:1000:bala,,,:/home/bala:/bin/bash
ただし、-s オプションを使用して、指定した区切り文字を含む行のみをフィルタリングして表示することは可能です。
次の例では、cut コマンドで | を含む行が見つからなかったため、出力は表示されません。 (パイプ) /etc/passwd ファイルの区切り文字として。
$ grep "/bin/bash" /etc/passwd | cut -d'|' -s -f1
7.指定されたフィールド以外のすべてのフィールドを選択
選択フィールド リストを補完するには、オプション –complement を使用します。
次の例では、フィールド 7 を除く /etc/passwd ファイルのすべてのフィールドを表示します
$ grep "/bin/bash" /etc/passwd | cut -d':' --complement -s -f7 root:x:0:0:root:/root bala:x:1000:1000:bala,,,:/home/bala
8.表示用の出力区切り文字を変更
デフォルトでは、出力区切り文字は、cut -d オプションで指定した入力区切り文字と同じです。
出力区切り文字を変更するには、以下に示すようにオプション –output-delimiter を使用します。この例では、入力区切り文字は :(コロン) ですが、出力区切り文字は # (ハッシュ) です。
$ grep "/bin/bash" /etc/passwd | cut -d':' -s -f1,6,7 --output-delimiter='#' root#/root#/bin/bash bala#/home/bala#/bin/bash
9.出力区切り文字を改行に変更
この例では、cut コマンド出力のすべてのフィールドが個別の行に表示されます。 –output-delimiter を引き続き使用しましたが、値は $'\n' であり、出力区切り文字として改行を追加する必要があることを示しています。
$ grep bala /etc/passwd | cut -d':' -f1,6,7 --output-delimiter=$'\n' bala /home/bala /bin/bash
10. Cut を他の Unix コマンド出力と組み合わせる
cut コマンドの威力は、他の Unix コマンドの stdout と組み合わせると実現できます。
上記で説明したカット コマンドの基本的な使用方法を習得したら、カット コマンドを賢く使用して、多くのテキスト操作要件を解決できます。
次の例は、ps コマンドの出力から有用な情報のみを抽出する方法を示しています。また、最終出力が cut コマンドに与えられる前に、grep と sed を使用して ps コマンドの出力をフィルタリングする方法も示しました。ここでは、上記の例で説明したカット オプション -d と -f を使用しています。
$ ps axu | grep python | sed 's/\s\+/ /g' | cut -d' ' -f2,11- 2231 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-video 2311 /usr/bin/python /usr/lib/unity-scope-video-remote/unity-scope-video-remote 2414 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon 2463 /usr/bin/python /usr/lib/system-service/system-service-d 3274 grep --color=auto python