Linux cut学習ノート

6799 ワード

Cutは選択コマンドで、データを分析して、私たちが望んでいるものを取り出します.一般的に、選択情報は通常、「行」に対して分析され、情報全体の分析ではありません.
 
(1)構文形式は次のとおりです.
Cut[-bn][file]またはcut[-c][file]またはcut[-df][file]
 
使用方法の説明
Cutコマンドは、ファイルの各行からバイト、文字、フィールドを切り取り、これらのバイト、文字、フィールドを標準出力に書きます.
Fileパラメータを指定しない場合、cutコマンドは標準入力を読み込みます.-b、-cまたは-fフラグのいずれかを指定する必要があります.
 
しゅパラメータ
-b:バイト単位で分割します.これらのバイト位置は、-nフラグも指定しない限り、マルチバイト文字境界を無視します.
-c:文字単位で分割します.
-d:カスタム区切り記号、デフォルトはタブです.
-f:-dとともに使用し、どの領域を表示するかを指定します.
-n:マルチバイト文字の分割を解除します.-bフラグとのみ使用します.文字の最後のバイトが-bフラグのListパラメータで示される
の範囲内にある場合、文字は書き出される.それ以外の場合、文字は除外されます.
 
(2)cutは一般的に何を根拠にしているのでしょうか.つまり、cutが位置決めしたいカット内容をどのように教えているのでしょうか.
 
Cutコマンドは主に3つの位置決め方法を受け入れます.
第1、バイト(bytes)、オプション-b
第二に、文字(characters)、オプション-c
第三に、ドメイン(fields)、オプション-f
 
(3)「バイト」で位置決め
 
例を挙げてみましょう.psコマンドを実行すると、次のような内容が出力されます.
 
[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)

 
各ローの3バイト目を抽出したい場合は、次のようにします.
 
[rocrocket@rocrocket programming]$ who|cut -b 3
c
c
c

 
(4)「バイト」の位置付けで3,4,5,8バイトを抽出したいのですが、どうすればいいですか?
 
-bは3-5のような形をサポートし、複数の位置決め間をカンマで区切るとよい.例を見てみましょう.
[rocrocket@rocrocket programming]$ who|cut -b 3-5,8
croe
croe
croe

 
ただし、cutコマンドが-bオプションを使用している場合、このコマンドを実行すると、cutはまず-bの後ろのすべての位置を小さいものから大きいものに並べ替えてから抽出することに注意してください.位置決めの順番を逆さまにしてはいけませんよ.この例では、この問題を説明します.
[rocrocket@rocrocket programming]$ who|cut -b 8,3-5
croe
croe
croe

 
(5)「3-5」のようなテクニックは何かありますか.挙げてみましょう.
[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
[rocrocket@rocrocket programming]$ who|cut -b -3
roc
roc
roc
[rocrocket@rocrocket programming]$ who|cut -b 3-
crocket :0           2009-01-08 11:07
crocket pts/0        2009-01-08 11:23 (:0.0)
crocket pts/1        2009-01-08 14:15 (:0.0)

 
-3は最初のバイトから3番目のバイト、3は3番目のバイトから行末までを表しています.細心の注意を払うと、この2つの場合、3バイト目の「c」が含まれていることがわかります.
もし私がwho|cut-b-3,3-を実行したら、あなたはどう思いますか?答えは行全体を出力し,連続して2つの重複するcは現れない.見てください.
[rocrocket@rocrocket programming]$ who|cut -b -3,3-
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)

 
(6)文字を位置決めマークとする最も簡単な例をあげましょう.
 
次の例では、3番目、4番目、5番目、8番目の文字を抽出します.
 
[rocrocket@rocrocket programming]$ who|cut -c 3-5,8
croe
croe
croe
でも、どうやって-bと変わらないの?もしかして-bと-cの作用は同じですか?実はそうではありません.同じように見えますが、この例はよくありません.whoが出力しているのはすべて単バイト文字なので、-bと-cで違いはありません.もしあなたが中国語を抽出したら、違いが見えます.さあ、中国語の抽出状況を見てみましょう.
[rocrocket@rocrocket programming]$ cat cut_ch.txt
   
   
   
   
[rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt
�
�
�
�
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt
 
 
 
 

 
見ましたね.-cを使うと文字単位で正常に出力されます.-bはバイト(8ビットバイナリビット)で計算するだけで、出力は文字化けです.
この知識点に言及した以上、もう一言補充して、もしあなたが勉強に余力があれば、向上します.
マルチバイト文字に遭遇した場合、-nオプションを使用して、-nはcutにマルチバイト文字を分解しないように伝えることができます.例は次のとおりです.
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -b 2
�
�
�
�
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 2

[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 1,2,3
 
 
 
 

 
 
(7)ドメインはどういうことですか?
 
なぜ「ドメイン」の抽出があるのか、さっき述べた-bと-cは固定フォーマットのドキュメントでしか情報を抽出できず、非固定フォーマットの情報には手が回らないからだ.このとき「ドメイン」が役に立ちます./etc/passwdファイルを観察すると、whoの出力情報のように固定フォーマットではなく、比較的ばらばらな排出であることがわかります.しかし、コロンはこのファイルの各行において非常に重要な役割を果たし、コロンは各項目を区切るために使用されます.
 
幸いなことに、cutコマンドはこのような抽出方法を提供しています.具体的には「スペーサ」を設定し、「いくつかのドメインを抽出」を設定すればOKです.
 
/etc/passwdの最初の5行の内容を例に挙げます.
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp

 
 
見たでしょう、-dで間隔をコロンに設定して、-fで私が取る最初のドメインを設定して、車に戻ると、すべてのユーザー名が表示されます!ほほほ達成感があるでしょう!
もちろん、-fを設定する際には、例えば3-5または4-のようなフォーマットを用いてもよい.
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7
root:0:0:root:/bin/bash
bin:1:1:bin:/sbin/nologin
daemon:2:2:daemon:/sbin/nologin
adm:3:4:adm:/sbin/nologin
lp:4:7:lp:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f -2
root:x
bin:x
daemon:x
adm:x
lp:x

 
 
(8)スペースやタブに遭遇した場合、どうやって見分けますか?ちょっと散らかっていると思いますが、どうすればいいですか?
 
タブは確かに認識しにくい場合がありますが、スペースがいくつかのスペースから構成されているのか、それとも1つのタブから構成されているのかを見る方法があります.
[rocrocket@rocrocket programming]$ cat tab_space.txt
this is tab finish.
this is several space      finish.
[rocrocket@rocrocket programming]$ sed -n l tab_space.txt
this is tab\tfinish.$
this is several space      finish.$

 
見たでしょう、タブ(TAB)ならt記号、スペースならそのまま表示されます.
この方法でタブとスペースを判断できます.
注意、上のsed-nの後ろの文字はLの小文字ですよ.見間違えないでください.
 
(9)cut-dでカスタム表文字やスペースを設定する記号は何ですか?
 
実はcutの-dオプションのデフォルトのインターバルはタブですので、タブを使用する場合は、-dオプションを完全に省略し、-fでドメインを取得すればいいのです.
 
スペースをスペースに設定すると、次のようになります.
[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1
this
this

 
注意、2つの引用符の間には確かにスペースが必要ですよ.サボってはいけません.
また、cutは間隔記号が1文字であることを許可するため、-dの後ろにスペースを設定するしかありません.複数のスペースを設定することはできません.
 
[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1
cut: the delimiter must be a single character
Try `cut --help' for more information.
 
(10)cutにはどのような欠陥と不足がありますか.
 
わかったでしょ?はい、マルチスペースを処理するときです.
ファイルの一部のドメインが複数のスペースで区切られている場合、cutは「1文字で区切られた」テキストの内容を処理するのが得意なので、cutを使うのはちょっと面倒です.