GNU/Linux >> Linux の 問題 >  >> Linux

4LinuxでのCutコマンドの基本的かつ実用的な使用法

cutコマンドは、テキストファイルから「列」を削除するための標準的なツールです。このコンテキストでは、「列」は、行上の物理的な位置によって識別される文字またはバイトの範囲、または区切り文字で区切られたフィールドの範囲として定義できます。

以前、AWKコマンドの使用について書きました。この詳細なガイドでは、Linuxでのcutコマンドの4つの重要で実用的な例を説明します。これは、非常に役立ちます。

4LinuxでのCutコマンドの実用例

必要に応じて、この記事でリストしたのと同じカットコマンドの実際的な例を説明するこのビデオを見ることができます。

1。文字範囲の操作

-cで呼び出された場合 コマンドラインオプションの場合、cutコマンドは文字を削除します 範囲。

他のフィルターと同様に、cutコマンドは入力ファイルを変更しませんが、変更されたデータを標準出力にコピーします。コマンド出力をファイルにリダイレクトして結果を保存するか、パイプを使用して別のコマンドへの入力として送信するのはユーザーの責任です。

上のビデオで使用されているサンプルテストファイルをダウンロードした場合は、BALANCE.txtを見ることができます。 妻が仕事で使用している会計ソフトウェアから直接取得したデータファイル:

sh$ head BALANCE.txt
ACCDOC    ACCDOCDATE    ACCOUNTNUM ACCOUNTLIB              ACCDOCLIB                        DEBIT          CREDIT
4         1012017       623477     TIDE SCHEDULE           ALNEENRE-4701-LOC                00000001615,00
4         1012017       445452     VAT BS/ENC              ALNEENRE-4701-LOC                00000000323,00
4         1012017       4356       PAYABLES                ALNEENRE-4701-LOC                               00000001938,00
5         1012017       623372     ACCOMODATION GUIDE      ALNEENRE-4771-LOC                00000001333,00
5         1012017       445452     VAT BS/ENC              ALNEENRE-4771-LOC                00000000266,60
5         1012017       4356       PAYABLES                ALNEENRE-4771-LOC                               00000001599,60
6         1012017       4356       PAYABLES                FACT FA00006253 - BIT QUIROBEN                  00000001837,20
6         1012017       445452     VAT BS/ENC              FACT FA00006253 - BIT QUIROBEN   00000000306,20
6         1012017       623795     TOURIST GUIDE BOOK      FACT FA00006253 - BIT QUIROBEN   00000001531,00

これは固定幅のテキストファイルです。データフィールドには可変数のスペースが埋め込まれているため、適切に配置されたテーブルとして表示されます。

当然の結果として、データ列は常に各行の同じ文字位置で開始および終了します。ただし、ちょっとした落とし穴があります。その名前にもかかわらず、cut コマンドでは、実際には、保持するデータの範囲を指定する必要があります 、削除する範囲ではありません 。したがって、のみが必要な場合 ACCOUNTNUM およびACCOUNTLIB 上記のデータファイルの列には、次のように記述します。

sh$ cut -c 25-59 BALANCE.txt | head
ACCOUNTNUM ACCOUNTLIB
623477     TIDE SCHEDULE
445452     VAT BS/ENC
4356       /accountPAYABLES
623372     ACCOMODATION GUIDE
445452     VAT BS/ENC
4356       PAYABLES
4356       PAYABLES
445452     VAT BS/ENC
623795     TOURIST GUIDE BOOK

範囲とは何ですか?

これまで見てきたように、cutコマンドでは rangeを指定する必要があります。 保持したいデータのそれでは、範囲とは何かをより正式に紹介しましょう。cutの場合 コマンドでは、範囲はハイフンで区切られた開始位置と終了位置によって定義されます。範囲は1から始まります。つまり、行の最初の項目は項目番号1であり、0ではありません。範囲は包括的です。開始と終了、およびそれらの間のすべての文字が出力に保持されます。終了位置が開始位置より前(「下」)にある範囲を指定するとエラーになります。ショートカットとして、開始またはを省略できます。 以下の表で説明されている終了値:

  • a-b :aとbの間の範囲(両端を含む)
  • a :範囲a-aに相当
  • -b1-aと同等
  • b-b-∞と同等

cutコマンドを使用すると、いくつかの範囲をコンマで区切って指定できます。次にいくつかの例を示します。

# Keep characters from 1 to 24 (inclusive)
cut -c -24 BALANCE.txt

# Keep characters from 1 to 24 and 36 to 59 (inclusive)
cut -c -24,36-59 BALANCE.txt

# Keep characters from 1 to 24, 36 to 59 and 93 to the end of the line (inclusive)
cut -c -24,36-59,93- BALANCE.txt

cutの1つの制限(または表示方法によっては機能) コマンドは、データを並べ替えることはありませんということです。 。したがって、次のコマンドは、範囲が異なる順序で指定されているにもかかわらず、前のコマンドとまったく同じ結果を生成します。

cut -c 93-,-24,36-59 BALANCE.txt

diffを使用して簡単に確認できます コマンド:

diff -s <(cut -c -24,36-59,93- BALANCE.txt) \
              <(cut -c 93-,-24,36-59 BALANCE.txt)
Files /dev/fd/63 and /dev/fd/62 are identical

同様に、cut コマンドデータを複製しない

# One might expect that could be a way to repeat
# the first column three times, but no...
cut -c -10,-10,-10 BALANCE.txt | head -5
ACCDOC
4
4
4
5

-oの提案があったことは言及する価値があります cutを許可して、これら2つの最後の制限を解除するオプション データを並べ替えたり複製したりするためのユーティリティ。しかし、これはPOSIX委員会によって拒否されました。 「このタイプの拡張機能は、IEEEP1003.2bドラフト標準の範囲外であるためです。」

私の時点では、その提案を拡張機能として実装しているカットバージョンはありません。ただし、そうする場合は、コメントセクションを使用して共有してください。

2。バイト範囲の操作

-bで呼び出された場合 コマンドラインオプションの場合、cutコマンドはバイトを削除します 範囲。

一見すると、キャラクターの間に明らかな違いはありません。 およびバイト 範囲:

sh$ diff -s <(cut -b -24,36-59,93- BALANCE.txt) \
              <(cut -c -24,36-59,93- BALANCE.txt)
Files /dev/fd/63 and /dev/fd/62 are identical

これは、サンプルデータファイルがUS-ASCII文字エンコード(「charset」)をfile -iとして使用しているためです。 コマンドはそれを正しく推測できます:

sh$ file -i BALANCE.txt
BALANCE.txt: text/plain; charset=us-ascii

その文字エンコードでは、文字とバイトの間に1対1のマッピングがあります。 1バイトだけを使用すると、理論的には最大256の異なる文字(数字、文字、句読点、記号など)をエンコードできます。実際には、文字エンコードによっていくつかの特別な値(32または65の制御文字など)が提供されるため、その数ははるかに少なくなります。一般的に見られる)。とにかく、フルバイト範囲を使用できたとしても、それはさまざまな人間の文章を保存するのに十分とは言えません。そのため、今日では、文字とバイト間の1対1のマッピングは標準よりも例外であり、ほとんどの場合、ユビキタスなUTF-8マルチバイトエンコーディングに置き換えられています。ここで、cutコマンドがそれをどのように処理できるかを見てみましょう。

マルチバイト文字の操作

前にも言ったように、その記事の例として使用されているサンプルデータファイルは、妻が使用している会計ソフトウェアからのものです。彼女は最近そのソフトウェアを更新し、その後、エクスポートされたテキストファイルは微妙に異なっていたと付け加えています。自分で違いを見つけてみてください:

sh$ head BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTNUM ACCOUNTLIB              ACCDOCLIB                        DEBIT          CREDIT
4         1012017       623477     TIDE SCHEDULE           ALNÉENRE-4701-LOC                00000001615,00
4         1012017       445452     VAT BS/ENC              ALNÉENRE-4701-LOC                00000000323,00
4         1012017       4356       PAYABLES                ALNÉENRE-4701-LOC                               00000001938,00
5         1012017       623372     ACCOMODATION GUIDE      ALNÉENRE-4771-LOC                00000001333,00
5         1012017       445452     VAT BS/ENC              ALNÉENRE-4771-LOC                00000000266,60
5         1012017       4356       PAYABLES                ALNÉENRE-4771-LOC                               00000001599,60
6         1012017       4356       PAYABLES                FACT FA00006253 - BIT QUIROBEN                  00000001837,20
6         1012017       445452     VAT BS/ENC              FACT FA00006253 - BIT QUIROBEN   00000000306,20
6         1012017       623795     TOURIST GUIDE BOOK      FACT FA00006253 - BIT QUIROBEN   00000001531,00

このセクションのタイトルは、何が変更されたかを見つけるのに役立つ場合があります。しかし、見つかったかどうかにかかわらず、その変更の結果を見てみましょう:

sh$ cut -c 93-,-24,36-59 BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTLIB              DEBIT          CREDIT
4         1012017       TIDE SCHEDULE            00000001615,00
4         1012017       VAT BS/ENC               00000000323,00
4         1012017       PAYABLES                                00000001938,00
5         1012017       ACCOMODATION GUIDE       00000001333,00
5         1012017       VAT BS/ENC               00000000266,60
5         1012017       PAYABLES                                00000001599,60
6         1012017       PAYABLES                               00000001837,20
6         1012017       VAT BS/ENC              00000000306,20
6         1012017       TOURIST GUIDE BOOK      00000001531,00
19        1012017       SEMINAR FEES            00000000080,00
19        1012017       PAYABLES                               00000000080,00
28        1012017       MAINTENANCE             00000000746,58
28        1012017       VAT BS/ENC              00000000149,32
28        1012017       PAYABLES                               00000000895,90
31        1012017       PAYABLES                                00000000240,00
31        1012017       VAT BS/DEBIT             00000000040,00
31        1012017       ADVERTISEMENTS           00000000200,00
32        1012017       WATER                   00000000202,20
32        1012017       VAT BS/DEBIT            00000000020,22
32        1012017       WATER                   00000000170,24
32        1012017       VAT BS/DEBIT            00000000009,37
32        1012017       PAYABLES                               00000000402,03
34        1012017       RENTAL COSTS            00000000018,00
34        1012017       PAYABLES                               00000000018,00
35        1012017       MISCELLANEOUS CHARGES   00000000015,00
35        1012017       VAT BS/DEBIT            00000000003,00
35        1012017       PAYABLES                               00000000018,00
36        1012017       LANDLINE TELEPHONE        00000000069,14
36        1012017       VAT BS/ENC                00000000013,83

コマンド出力in-extensoの上にコピーしました したがって、列の配置に問題があることは明らかです。

説明は、US-ASCII文字(記号、句読点、数字、発音区別符号のないラテン文字)のみを含む元のデータファイルです

ただし、ソフトウェアの更新後に作成されたファイルをよく見ると、新しいエクスポートデータファイルにアクセント付きの文字が保持されていることがわかります。たとえば、「ALNÉENRE」という名前の会社は、以前は「ALNEENRE」(アクセントなし)としてエクスポートされていたのに対し、現在は適切なスペルになっています

file -i ユーティリティは、ファイルがUTF-8でエンコードされていると報告するため、この変更を見逃しませんでした。

sh$ file -i BALANCE-V2.txt
BALANCE-V2.txt: text/plain; charset=utf-8

UTF-8ファイルでアクセント付き文字がどのようにエンコードされているかを確認するには、hexdumpを使用できます。 ファイル内のバイトを直接確認できるユーティリティ:

# To reduce clutter, let's focus only on the second line of the file
sh$ sed '2!d' BALANCE-V2.txt
4         1012017       623477     TIDE SCHEDULE           ALNÉENRE-4701-LOC                00000001615,00
sh$ sed '2!d' BALANCE-V2.txt  | hexdump -C
00000000  34 20 20 20 20 20 20 20  20 20 31 30 31 32 30 31  |4         101201|
00000010  37 20 20 20 20 20 20 20  36 32 33 34 37 37 20 20  |7       623477  |
00000020  20 20 20 54 49 44 45 20  53 43 48 45 44 55 4c 45  |   TIDE SCHEDULE|
00000030  20 20 20 20 20 20 20 20  20 20 20 41 4c 4e c3 89  |           ALN..|
00000040  45 4e 52 45 2d 34 37 30  31 2d 4c 4f 43 20 20 20  |ENRE-4701-LOC   |
00000050  20 20 20 20 20 20 20 20  20 20 20 20 20 30 30 30  |             000|
00000060  30 30 30 30 31 36 31 35  2c 30 30 20 20 20 20 20  |00001615,00     |
00000070  20 20 20 20 20 20 20 20  20 20 20 0a              |           .|
0000007c

hexdumpの00000030行目 一連のスペースの後の出力(バイト20 )、あなたは見ることができます:

  • 文字A バイト41としてエンコードされます 、
  • 文字L バイト4cでエンコードされます 、
  • と文字N バイト4eとしてエンコードされます 。

ただし、大文字のLATIN CAPITAL LETTER E WITH ACUTE(Éの正式名称であるため) Unicode標準では) twoを使用してエンコードされます バイトc3 89

そしてここに問題があります:cutを使用する 範囲がバイト位置で表されるコマンドは、固定長のエンコーディングでは適切に機能しますが、UTF-8やShiftJISのような可変長のエンコーディングでは機能しません。これは、POSIX標準の次の非規範的な抜粋で明確に説明されています。

以前のバージョンのcutユーティリティは、バイトと文字が同等であると見なされる環境で機能していました(一部の実装では、のモジュロ処理)。マルチバイト文字の拡張された世界では、新しい-bオプションが追加されました。

ちょっと待って! -bを使用していませんでした 上記の「障害のある」例のオプションですが、-c オプション。したがって、すべきではありません うまくいった?!?

はい、すべきです :残念ですが、2018年になりましたが、GNU Coreutils 8.30の時点では、cutユーティリティのGNU実装はまだマルチバイト文字を適切に処理していません。 GNUのドキュメントを引用するには、-c オプションは「今のところ-bと同じですが、国際化によってそれが変わります[…]」 — 10年以上前から存在している言及!

一方、cutユーティリティのOpenBSD実装はPOSIXに準拠しており、マルチバイト文字を適切に処理するために現在のロケール設定を尊重します。

# Ensure subseauent commands will know we are using UTF-8 encoded
# text files
openbsd-6.3$ export LC_CTYPE=en_US.UTF-8

# With the `-c` option, cut works properly with multi-byte characters
openbsd-6.3$ cut -c -24,36-59,93- BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTLIB              DEBIT          CREDIT
4         1012017       TIDE SCHEDULE           00000001615,00
4         1012017       VAT BS/ENC              00000000323,00
4         1012017       PAYABLES                               00000001938,00
5         1012017       ACCOMODATION GUIDE      00000001333,00
5         1012017       VAT BS/ENC              00000000266,60
5         1012017       PAYABLES                               00000001599,60
6         1012017       PAYABLES                               00000001837,20
6         1012017       VAT BS/ENC              00000000306,20
6         1012017       TOURIST GUIDE BOOK      00000001531,00
19        1012017       SEMINAR FEES            00000000080,00
19        1012017       PAYABLES                               00000000080,00
28        1012017       MAINTENANCE             00000000746,58
28        1012017       VAT BS/ENC              00000000149,32
28        1012017       PAYABLES                               00000000895,90
31        1012017       PAYABLES                               00000000240,00
31        1012017       VAT BS/DEBIT            00000000040,00
31        1012017       ADVERTISEMENTS          00000000200,00
32        1012017       WATER                   00000000202,20
32        1012017       VAT BS/DEBIT            00000000020,22
32        1012017       WATER                   00000000170,24
32        1012017       VAT BS/DEBIT            00000000009,37
32        1012017       PAYABLES                               00000000402,03
34        1012017       RENTAL COSTS            00000000018,00
34        1012017       PAYABLES                               00000000018,00
35        1012017       MISCELLANEOUS CHARGES   00000000015,00
35        1012017       VAT BS/DEBIT            00000000003,00
35        1012017       PAYABLES                               00000000018,00
36        1012017       LANDLINE TELEPHONE      00000000069,14
36        1012017       VAT BS/ENC              00000000013,83

予想どおり、-bを使用する場合 -cの代わりにバイトモード 文字モードでは、OpenBSDのカット実装はレガシーのcutのように動作します :

openbsd-6.3$ cut -b -24,36-59,93- BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTLIB              DEBIT          CREDIT
4         1012017       TIDE SCHEDULE            00000001615,00
4         1012017       VAT BS/ENC               00000000323,00
4         1012017       PAYABLES                                00000001938,00
5         1012017       ACCOMODATION GUIDE       00000001333,00
5         1012017       VAT BS/ENC               00000000266,60
5         1012017       PAYABLES                                00000001599,60
6         1012017       PAYABLES                               00000001837,20
6         1012017       VAT BS/ENC              00000000306,20
6         1012017       TOURIST GUIDE BOOK      00000001531,00
19        1012017       SEMINAR FEES            00000000080,00
19        1012017       PAYABLES                               00000000080,00
28        1012017       MAINTENANCE             00000000746,58
28        1012017       VAT BS/ENC              00000000149,32
28        1012017       PAYABLES                               00000000895,90
31        1012017       PAYABLES                                00000000240,00
31        1012017       VAT BS/DEBIT             00000000040,00
31        1012017       ADVERTISEMENTS           00000000200,00
32        1012017       WATER                   00000000202,20
32        1012017       VAT BS/DEBIT            00000000020,22
32        1012017       WATER                   00000000170,24
32        1012017       VAT BS/DEBIT            00000000009,37
32        1012017       PAYABLES                               00000000402,03
34        1012017       RENTAL COSTS            00000000018,00
34        1012017       PAYABLES                               00000000018,00
35        1012017       MISCELLANEOUS CHARGES   00000000015,00
35        1012017       VAT BS/DEBIT            00000000003,00
35        1012017       PAYABLES                               00000000018,00
36        1012017       LANDLINE TELEPHONE        00000000069,14
36        1012017       VAT BS/ENC                00000000013,83

3。フィールドの操作

ある意味で、区切られたテキストファイルのフィールドを操作する方がcutの方が簡単です。 ユーティリティ。各行で(1バイトの)フィールド区切り文字を見つけるだけでよいので、エンコードの問題を気にせずに、フィールドの内容を出力にそのままコピーしてから出力します。

区切られたテキストファイルのサンプルは次のとおりです。

sh$ head BALANCE.csv
ACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;ACCDOCLIB;DEBIT;CREDIT
4;1012017;623477;TIDE SCHEDULE;ALNEENRE-4701-LOC;00000001615,00;
4;1012017;445452;VAT BS/ENC;ALNEENRE-4701-LOC;00000000323,00;
4;1012017;4356;PAYABLES;ALNEENRE-4701-LOC;;00000001938,00
5;1012017;623372;ACCOMODATION GUIDE;ALNEENRE-4771-LOC;00000001333,00;
5;1012017;445452;VAT BS/ENC;ALNEENRE-4771-LOC;00000000266,60;
5;1012017;4356;PAYABLES;ALNEENRE-4771-LOC;;00000001599,60
6;1012017;4356;PAYABLES;FACT FA00006253 - BIT QUIROBEN;;00000001837,20
6;1012017;445452;VAT BS/ENC;FACT FA00006253 - BIT QUIROBEN;00000000306,20;
6;1012017;623795;TOURIST GUIDE BOOK;FACT FA00006253 - BIT QUIROBEN;00000001531,00;

フィールド区切り文字が常にコンマであるとは限らない場合でも、そのファイル形式をCSV(コンマ区切り値の場合)として知っている場合があります。たとえば、セミコロン(; )はフィールド区切り文字として頻繁に使用されます。フランスで行っているように、すでにカンマを小数点記号として使用している国でデータを「CSV」としてエクスポートする場合は、デフォルトで選択されることがよくあります。したがって、サンプルファイルでその文字を選択します。 )。別の一般的なバリアントは、フィールドセパレータとしてタブ文字を使用し、タブ区切り値ファイルと呼ばれることもあります。最後に、UnixおよびLinuxの世界では、コロン(: )は、たとえば標準の/etc/passwdにあるもう1つの比較的一般的なフィールドセパレータです。 および/etc/group ファイル。

区切りテキストファイル形式を使用する場合は、-fを使用し続けるフィールドの範囲をcutコマンドに指定します。 オプションであり、-dを使用して区切り文字を指定する必要があります オプション(-dなし オプションの場合、カットユーティリティはデフォルトでセパレータのタブ文字になります):

sh$ cut -f 5- -d';' BALANCE.csv | head
ACCDOCLIB;DEBIT;CREDIT
ALNEENRE-4701-LOC;00000001615,00;
ALNEENRE-4701-LOC;00000000323,00;
ALNEENRE-4701-LOC;;00000001938,00
ALNEENRE-4771-LOC;00000001333,00;
ALNEENRE-4771-LOC;00000000266,60;
ALNEENRE-4771-LOC;;00000001599,60
FACT FA00006253 - BIT QUIROBEN;;00000001837,20
FACT FA00006253 - BIT QUIROBEN;00000000306,20;
FACT FA00006253 - BIT QUIROBEN;00000001531,00;
区切り文字を含まない行の処理

しかし、入力ファイルの一部の行に区切り文字が含まれていない場合はどうなりますか?最初のフィールドのみを含む行としてそれを想像するのは魅力的です。しかし、これはではありません カットユーティリティの機能。

デフォルトでは、-fを使用する場合 オプションの場合、cutユーティリティは常に区切り文字を含まない行を逐語的に出力します(おそらくこれがヘッダーやある種のコメントのような非データ行であると想定しています):

sh$ (echo "# 2018-03 BALANCE"; cat BALANCE.csv) > BALANCE-WITH-HEADER.csv

sh$ cut -f 6,7 -d';' BALANCE-WITH-HEADER.csv | head -5
# 2018-03 BALANCE
DEBIT;CREDIT
00000001615,00;
00000000323,00;
;00000001938,00

-sを使用する オプションで、その動作を逆にすることができるので、cut そのような行は常に無視されます:

sh$ cut -s -f 6,7 -d';' BALANCE-WITH-HEADER.csv | head -5
DEBIT;CREDIT
00000001615,00;
00000000323,00;
;00000001938,00
00000001333,00;

ハックな気分になっている場合は、その機能を比較的あいまいな方法として利用して、特定の文字を含む行のみを保持することができます。

# Keep lines containing a `e`
sh$ printf "%s\n" {mighty,bold,great}-{condor,monkey,bear} | cut -s -f 1- -d'e'
出力区切り文字の変更

拡張機能として、cutのGNU実装では、--output-delimiterを使用して出力に異なるフィールド区切り文字を使用できます。 オプション:

sh$ cut -f 5,6- -d';' --output-delimiter="*" BALANCE.csv | head
ACCDOCLIB*DEBIT*CREDIT
ALNEENRE-4701-LOC*00000001615,00*
ALNEENRE-4701-LOC*00000000323,00*
ALNEENRE-4701-LOC**00000001938,00
ALNEENRE-4771-LOC*00000001333,00*
ALNEENRE-4771-LOC*00000000266,60*
ALNEENRE-4771-LOC**00000001599,60
FACT FA00006253 - BIT QUIROBEN**00000001837,20
FACT FA00006253 - BIT QUIROBEN*00000000306,20*
FACT FA00006253 - BIT QUIROBEN*00000001531,00*

その場合、コマンドライン引数で指定された範囲の境界にあるものだけでなく、フィールドセパレータのすべてのオカレンスが置き換えられることに注意してください。

4。非POSIXGNU拡張機能

非POSIXGNU拡張機能と言えば、特に役立つものがいくつかあります。次の拡張機能は、バイト、文字(現在のGNU実装での意味)、またはフィールド範囲で同様に機能します。--complement

そのオプションは、sedアドレスの感嘆符(!)のように考えてください。 );データを指定された範囲に一致させる代わりに、cut データが範囲と一致しないようにします

# Keep only field 5
sh$ cut -f 5 -d';' BALANCE.csv |head -3
ACCDOCLIB
ALNEENRE-4701-LOC
ALNEENRE-4701-LOC

# Keep all but field 5
sh$ cut --complement -f 5 -d';' BALANCE.csv |head -3
ACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;DEBIT;CREDIT
4;1012017;623477;TIDE SCHEDULE;00000001615,00;
4;1012017;445452;VAT BS/ENC;00000000323,00;

--zero-terminated-z

改行文字の代わりにNUL文字を行末記号として使用します。 -z このオプションは、ファイル名を操作する場合など、データに改行文字が埋め込まれている場合に特に便利です(改行はファイル名の有効な文字ですが、NULは有効ではないため)。

-z オプションが機能するので、少し実験してみましょう。まず、名前に新しい行が埋め込まれたファイルを作成します:

bash$ touch

ここで、各*.txtの最初の5文字を​​表示するとします。 ファイル名。素朴な解決策はここで惨めに失敗します:

sh$ ls -1 *.txt | cut -c 1-5
BALAN
BALAN
EMPTY
FILE
WITH
NAME.

すでにlsを読んだことがあるかもしれません は人間が消費するために設計されたものであり、コマンドパイプラインで使用することはアンチパターンです(確かにそうです)。それでは、findを使用しましょう 代わりにコマンド:

sh$ find . -name '*.txt' -printf "%f\n" | cut -c 1-5
BALAN
EMPTY
FILE
WITH
NAME.
BALAN

そして…これは基本的に以前と同じ誤った結果を生成しました(ただし、lsのため、順序は異なります) findのようなファイル名を暗黙的にソートします コマンドは実行しません。

問題はどちらの場合も、cut コマンドでは、データフィールド(ファイル名)の一部である改行文字と、レコードの終わりマーカーとして使用される改行文字を区別できません。ただし、NULバイト(\0 )ラインターミネータが混乱を解消し、最終的に期待される結果を得ることができるようになります:

# I was told (?) some old versions of tr require using \000 instead of \0
# to denote the NUL character (let me know if you needed that change!)
sh$ find . -name '*.txt' -printf "%f\0" | cut -z -c 1-5| tr '\0' '\n'
BALAN
EMPTY
BALAN

その最新の例では、この記事の核となるcutから離れています。 指図。それでは、ファンキーな"%f\0"の意味を自分で理解してみましょう。 -printfの後 findの引数 コマンドまたはtrを使用した理由 パイプラインの最後でコマンドを実行します。

カットコマンドでさらに多くのことができます

私は、Cutコマンドの最も一般的で最も重要な使用法を示しました。さらに実用的な方法でコマンドを適用できます。それはあなたの論理的推論と想像力に依存します。

以下のコメントセクションを使用して、調査結果を投稿することを躊躇しないでください。そして、いつものように、この記事が気に入ったら、お気に入りのWebサイトやソーシャルメディアで共有することを忘れないでください!


Linux
  1. Linuxdfコマンド

  2. ファイル列を選択するための 10 の実用的な Linux カット コマンドの例

  3. Linux での cut コマンドの例

  1. Linux Catコマンド:使用法と例

  2. Linux Sedコマンド:使用法と例

  3. Linuxコマンド:jobs、bg、およびfg

  1. Linuxでコマンドをカット

  2. Linux AWKコマンド–LinuxおよびUnixの使用構文の例

  3. Linuxでの「cd」コマンドの5つの実用例