Linux字符截取命令-cut

Linux字符截取命令-cut

Linux

做者 | WenasWeihtml

一 Linux之cut命令詳解

將每一個文件中選定的行部分打印到標準輸出, 若是沒有文件,或者文件是-,則讀取標準輸入,長選項的強制參數對於短選項也是強制的。node

cut 是一個選取命令,通常來講,選取信息一般是針對「行」來進行分析的,並非整篇信息分析的,用於顯示每行從開頭算起 num1 到 num2 的文字。linux

1.1 使用語法

  • cut [-bn] [file]
  • cut [-c] [file]
  • cut [-df] [file]

1.2 使用說明

cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段寫至標準輸出。ubuntu

若是不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標誌之一, cut 默認以製表符爲分隔符。bash

參數:服務器

  • -b :以字節爲單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標誌。
  • -c :以字符爲單位進行分割。
  • -d :自定義分隔符,默認爲製表符。
  • -f :與-d一塊兒使用,指定顯示哪一個區域。
  • -n :取消分割多字節字符。僅和 -b 標誌一塊兒使用。若是字符的最後一個字節落在由 -b 標誌的 List 參數指示的範圍以內,該字符將被寫出;不然,該字符將被排除

在 -b、-c 或 -f 中只能使用一個。每一個LIST由一個組成
範圍,或用逗號分隔的多個範圍。選定的輸入被寫入
順序與讀取和寫入的順序相同。app

1.3 三個方法定位

cut 命令主要是接受三個定位方法:測試

  • 第一,字節(bytes),用選項 -b
  • 第二,字符(characters),用選項 -c
  • 第三,域(fields),用選項 -f

二 cut 幫助文檔

執行命令查詢幫助文檔:ui

cut --help

cut幫助文檔

cut幫助文檔解析:spa

(1)'-b字節列表'

'--bytes =字節列表'

選擇僅打印字節列表中列出的位置中的 字節。製表符和退格鍵與其餘任何字符同樣;他們佔用了1個字節。若是指定了輸出定界符,而後在所選字節範圍之間輸出該字符串。

(2)'-c字符列表'

'--characters =字符列表'

選擇僅打印在 character-list 中列出的位置中的 字符。目前與 -b 相同,可是國際化將改變這種情況。製表符和退格鍵與其餘任何字符同樣;他們佔1個字符。若是指定了輸出定界符,而後在所選字節範圍之間輸出該字符串。

(3)'-d input_delim_byte'

'--delimiter = input_delim_byte'

和 -F,請使用 input_delim_byte 的第一個字節做爲輸入字段分隔符(默認爲TAB)。

(4)'-f字段列表'

'--fields =字段列表'

選擇僅打印在 field-list 中列出的字段。默認狀況下,字段之間用TAB字符分隔。還要打印任何不包含定界符的行,除非 -僅定界 (-s)選項已指定。

(5)'-n'

不要拆分多字節字符。

(6)'-s'

'-僅定界'

爲了 -F,請勿打印不包含字段分隔符的行。一般,任何沒有字段分隔符的行都按原樣打印。

三 命令詳解與使用案例

3.1 實例一: 查詢命令結合 cut -b

當你執行 who 命令時,會輸出相似以下的內容:

$ who
root     pts/1        2021-04-25 21:51 (58.62.93.183)
root     pts/0        2021-04-25 21:50 (58.62.93.183)
(1) 提取每一行的第3個字節
$ who|cut -b 3
o
o
(2) 提取第1,第二、第3個字節

方案1:

$ who |cut -b 1-3
roo
roo
roo

方案2:

$ who |cut -b 1,2,3
roo
roo
roo

-b 支持形如 1-3 的寫法,並且多個定位之間用逗號隔開就能夠了。

注意:

cut 命令若是使用了-b選項,那麼執行此命令時,cut 會先把 -b 後面全部的定位進行從小到大排序,而後再提取。不能顛倒定位的順序。

(3) 提取第1到第3,第5和第20個字符以後的全部數據
who|cut -b 1-3,20-
roo   2021-04-25 21:51 (58.62.93.183)
roo   2021-04-25 21:50 (58.62.93.183)
roo   2021-04-25 23:05 (58.62.93.183)
(4) 提取第n個字節先後全部的字節

n = 2 的狀況下

方案1:

$ who |cut -b 2-
oot     pts/1        2021-04-25 21:51 (58.62.93.183)
oot     pts/0        2021-04-25 21:50 (58.62.93.183)
oot     pts/2        2021-04-25 23:05 (58.62.93.183)

方案2:

$ who |cut -b -2
ro
ro
ro

3.2 實例二: 文本文件結合 cut -c

(1)建立測試文件
  • 建立一份測試文件: test.txt

    vi test.txt
  • 測試文件內容數據

    apple=蘋果=pingguo
    create=建立
    delect=刪除
    exe=程序
    good=好的
(2) -c 和 -b 的使用區別

-c與命令查詢結果:

who|cut -c 1-3,20-
roo   2021-04-25 21:51 (58.62.93.183)
roo   2021-04-25 21:50 (58.62.93.183)
roo   2021-04-25 23:05 (58.62.93.183)

看似查詢結果相同,只是由於這個例子 who 輸出取的數據都是字節字符,因此用 -b 和 -c 沒有區別,若是你提取中文,區別就看出來了,看看中文提取的狀況:

$ cut -b 3-10 test.txt
ple=蘋
eate=創
lect=刪
e=程序
od=好

$ cut -c 3-10 test.txt
ple=蘋
eate=創
lect=刪
e=程序
od=好
  • 結果發現,這個問題不知道哪一個版本已經修復了,附加上測試使用的 linux 版本,其餘命令與 -b使用相似,下面將再也不一一列舉。

    $ cat /proc/version
    Linux version 4.15.0-52-generic (buildd@lgw01-amd64-051) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #56-Ubuntu SMP Tue Jun 4 22:49:08 UTC 2019

3.3 實例三: cut -d 與 -f 的共同使用

cut 的 -d 選項的默認間隔符就是製表符,因此當你就是要使用製表符的時候,徹底就能夠省略 -d 選項,而直接用-f來取域就能夠了。

(1) 結合查詢命令取出指定符號的切割的第一域
$ head -n 5  /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

$ head -n 5  /etc/passwd  |cut -d ':' -f 1
root
daemon
bin
sys
sync
(2) 取出文檔中指定符號的切割的第一域
$ head -n 5  test.txt |cut -d : -f 1
apple=蘋果=pingguo
create=建立
delect=刪除
exe=程序
good=好的

$ head -n 5  test.txt |cut -d = -f 2
蘋果
建立
刪除
程序
好的
(3)如上 -b 中的拼接規則同理使用
$ head -n 5  test.txt |cut -d = -f2-

$ head -n 5  test.txt |cut -d = -f2,3

$ head -n 5  test.txt |cut -d = -f2-3
(4)分隔符必須爲單個字符,多個異常以下
$ cat test.txt |cut -d '==' -f2-3
cut: the delimiter must be a single character

四 使用場景和缺陷不足

4.1 cut的使用場景

  • cut命令用來顯示行中的指定部分,刪除文件中指定字段
  • 腳本切割讀取文件或者指定命令信息
  • 統計指定的服務器信息處理,進行概括統計

4.2 cut的缺陷和不足

  • 不能處理多空格
  • 若是文件裏面的某些域是由若干個空格來間隔的,那麼用cut就有點麻煩了,由於 cut 只擅長處理「以一個字符間隔」的文本內容

4.3 cut和awk的差異

  • 當一個文件中每一行都含有一個或多個空格時,這時候只能用 awk 來分隔
  • cut默認的分隔符是製表符,awk默認的分隔符是一個空格或者多個空格或者是製表符
  • 語法格式不一樣

參考文檔:

相關文章
相關標籤/搜索