shell中字符串截取命令:cut锹淌,printf匿值,awk,sed

cut


  • cut 命令不能在分割符是空格的字符串中截取列赂摆,只能是 制表符 或 具體的分割符挟憔。

選項(xiàng)

  • -b :僅顯示行中指定直接范圍的內(nèi)容;
  • -c :僅顯示行中指定范圍的字符烟号;
  • -d :指定字段的分隔符绊谭,默認(rèn)的字段分隔符為"TAB";
  • -f :顯示指定字段的內(nèi)容汪拥;
  • -n :與"-b"選項(xiàng)連用达传,不分割多字節(jié)字符;
  • --complement :補(bǔ)足被選擇的字節(jié)喷楣、字符或字段趟大;
  • --out-delimiter=<字段分隔符> :指定輸出內(nèi)容是的字段分割符;
  • --help :顯示指令的幫助信息铣焊;
  • --version :顯示指令的版本信息逊朽。

使用

  • -d :分隔符 ( --delimiter 按照指定分隔符分割列 )
  • -b : 表示字節(jié)
  • -c : 表示字符
  • -f : 表示字段(列號(hào)) ( --field 提取第幾列 )
  • N- : 從第N個(gè)字節(jié)、字符曲伊、字段到結(jié)尾
  • N-M : 從第N個(gè)字節(jié)叽讳、字符追他、字段到第M個(gè)
  • -M : 從第一個(gè)字節(jié)、字符岛蚤、字段到第M個(gè)
$> cat user.txt
01, zhang, M, 18
02, wang, M, 20
03, li, M, 21

# 以","分隔邑狸,顯示第二列
$> cut -d "," -f 2 user.txt
 zhang
 wang
 li

# 以","分隔,顯示第1列和第3列
$> cut -d "," -f 1,3 user.txt
01, M,
02, M,
03, M,

# 以","分隔涤妒,顯示第1-3列
$> cut -d "," -f 1-3 user.txt
01, zhang, M,
02, wang, M,
03, li, M,

# 以","分隔单雾,顯示除第1列以外的其他列
$> cut -d "," -f 1 --complement user.txt
 zhang, M, 18
 wang, M, 20
 li, M, 21
## 注意前面是有空格的!

###### 字符串
$> cut -c1-5 user.txt
01, zh
02, wa
03, li

printf


  • printf '輸出類型輸出格式' 內(nèi)容

輸出類型:

- %ns: 輸出字符串她紫。n是數(shù)字硅堆,指輸出幾個(gè)字符
  - %ni: 輸出整數(shù)。n是數(shù)字贿讹,指輸出幾個(gè)數(shù)字
  - %m.nf: 輸出浮點(diǎn)數(shù)渐逃。m和n是數(shù)字,分別指輸出的整數(shù)位數(shù)和小數(shù)位數(shù)民褂。如%8.2f代表共輸出8位數(shù)茄菊,其中2是小數(shù),6是整數(shù)赊堪。

輸出格式:

- \a : 輸出警告聲音
  - \b : 輸出退格鍵面殖,也就是Backspace鍵
  - \f : 清除屏幕
  - \n : 換行
  - \r : 回車,也就是Enter鍵
  - \t : 水平輸出退格鍵雹食,也就是Tab鍵
  - \v : 垂直輸出退格鍵畜普,也就是Tab鍵

printf %s 1 2 3 4 5 6 # 把123456當(dāng)成一個(gè)字符串輸出,沒有格式
printf %s %s %s 1 2 3 4 5 6 # 把%s%s123456當(dāng)做字符串輸出群叶,沒有格式
printf '%s ' 1 2 3 4 5 6 # 把1 2 3 4 5 6當(dāng)做字符串輸出吃挑,輸出格式為空格
printf '%s\n' 1 2 3 4 5 6 # 輸出格式為1個(gè)一行
printf '%s %s %s' 1 2 3 4 5 6 # 把內(nèi)容當(dāng)做字符串三個(gè)為一組輸出,1 2 34 5 6
printf '%s %s %s\n' 1 2 3 4 5 6 # 輸出格式為3個(gè)一行
printf '%s' $(cat user.txt) # 輸出文本內(nèi)容為字符串
printf '%s\t %s\t %s\t %s\n' $(cat user.txt)  # 把文本內(nèi)容格式化輸出
  • 建議 man printf 查看可用的輸出格式街立,和C的 printf 格式一樣舶衬。

awk


命令

awk '條件1{動(dòng)作1} 條件2{動(dòng)作2} ...' 文件名
( 如果條件1,執(zhí)行動(dòng)作1赎离;如果條件2逛犹,執(zhí)行動(dòng)作2 )

條件(pattern):一般使用關(guān)系表達(dá)式作為條件

  • x > 10 : 判斷變量x是否大于10
  • x >= 10 : 大于等于
  • x <= 10 : 小于等于

動(dòng)作(Action)

  • 格式化輸出
  • 流程控制語句

例子

# 大括號(hào)前面沒有條件,直接執(zhí)行命令梁剔,這里的printf 是awk的命令虽画,$2 提取文件第二列,$3 提取文件第三列荣病,$0 提取所有列
awk '{printf $2 "\t" $3"\n"}' user.txt

# 打印三列码撰,這里的print是awk的命令,系統(tǒng)并沒有print命令个盆,所以只能在awk里使用脖岛;與printf的區(qū)別是:print會(huì)自動(dòng)在行尾加換行符朵栖,而printf不會(huì)
df -h | awk '{print $1 "\t" $5 "\t" $6 "\t"}'

# 提取系統(tǒng)已使用硬盤空間,可以把結(jié)果賦給一個(gè)變量柴梆,判斷是否大于某個(gè)值陨溅,進(jìn)行報(bào)警
df -h | grep sda3 | awk '{print $5}' | cut -d '%' -f 1

# 查看剩余內(nèi)存不包含單位M
free -h | grep Mem | awk '{print $4}' | cut -d 'M' -f 1 

說明

  • grep 取行,awk 按條件取指定列绍在,cut 按分隔符取指定列门扇。
  • BEGIN:先執(zhí)行一條多余的動(dòng)作
awk 'BEGIN{print "this is a text"} {print $2 "\t" $3}' user.txt
  • END:用于在所有命令處理完之后執(zhí)行
  • FS內(nèi)置變量:用于定義分割符,如果需要手工定義分割符揣苏,一定要在分割符前面加BEGIN悯嗓;
awk 'BEGIN{FS=":"} END{print "this is end text"} {print $1 "\t" $3}' /etc/passwd
  • BEGIN、END也是條件卸察。
  • 關(guān)系運(yùn)算符:
# user.txt中不包含ID這行,提取滿足條件為第四列值大于18的第二列
cat user.txt | grep -v ID | awk '$4 > 18 {printf $2 "\n"}'

sed


sed主要是用來將數(shù)據(jù)進(jìn)行選取铅祸、替換坑质、刪除、新增的命令临梗∥卸螅可以放在管道符之后處理。

命令

  • sed [選項(xiàng)] '[動(dòng)作]' 文件名
  • sed命令有兩種形式:sed [options] 'command' file(s)盟庞;sed [options] -f scriptfile file(s)

選項(xiàng):

  • -n : 一般sed命令會(huì)把所有數(shù)據(jù)都輸出到屏幕吃沪;如果加入此選項(xiàng),則只會(huì)把經(jīng)過sed命令處理的行輸出到屏幕什猖。
    • sed -n '2p' user.txt # 輸出第二行
  • -e : 允許對(duì)輸入數(shù)據(jù)應(yīng)用多條sed命令編輯
  • -f : 添加腳本文件的內(nèi)容到執(zhí)行的動(dòng)作
  • -i : 用sed的修改結(jié)果直接修改讀取數(shù)據(jù)的文件票彪,而不是由屏幕輸出

動(dòng)作:(要加雙引號(hào))

  • a\ : 追加,在當(dāng)前行后添加一行或多行不狮。添加多行時(shí)降铸,除最后一行外,每行末尾需要用""代表數(shù)據(jù)未完結(jié)摇零。
  • c\ : 行替換推掸,用c后面的字符串替換原數(shù)據(jù)行,替換多行時(shí)驻仅,除最后一行外谅畅,每行末尾需要用""代表數(shù)據(jù)未完結(jié)。
  • i\ : 插入噪服,在當(dāng)前行前插入一行或多行毡泻。插入多行時(shí),除最后一行外芯咧,每行末尾需要用""代表數(shù)據(jù)未完結(jié)牙捉。
  • d : 刪除竹揍,刪除指定的行。
  • p : 打印邪铲,輸出指定的行芬位。
  • s : 字串替換,用一個(gè)字符串替換另外一個(gè)字符串带到。格式為“行范圍s/舊字串/新字串/g”(和vim中的替換格式類似)

例子

sed -n '2p' user.txt        # 輸出第二行, p一般都要和-n使用昧碉,不-n會(huì)顯示出所有的行
df -h | sed -n '2p'          # 管道符結(jié)果作為操作內(nèi)容
sed '2,4d' user.txt        # 刪除文件的第2行到第4行,顯示剩下的行揽惹,沒有加 i 選項(xiàng)被饿,不會(huì)更改文件內(nèi)容
sed '2a hello' user.txt      # 在第二行后追加hello,僅僅修改命令輸出
sed '2i hello \
  world' user.txt        # 在第二行前插入兩行數(shù)據(jù)搪搏,僅僅修改命令輸出
sed '2c No person' user.txt    # 把第二行替換為No person
sed '2s/M/F/g' user.txt      # 把第二行的M替換為F后輸出
sed -i '2s/M/F/g' user.txt  # 把替換后的結(jié)果寫入文件
sed -e 's/zhang//g ; s/wang//g' user.txt    # -e 允許多條命令順序執(zhí)行狭握,用分號(hào)隔開,s前面不加數(shù)字表示所有行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疯溺,一起剝皮案震驚了整個(gè)濱河市论颅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囱嫩,老刑警劉巖恃疯,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墨闲,居然都是意外死亡今妄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門鸳碧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾鳞,“玉大人,你說我怎么就攤上這事杆兵⊙阒伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵琐脏,是天一觀的道長攒砖。 經(jīng)常有香客問我,道長日裙,這世上最難降的妖魔是什么吹艇? 我笑而不...
    開封第一講書人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮昂拂,結(jié)果婚禮上受神,老公的妹妹穿的比我還像新娘。我一直安慰自己格侯,他們只是感情好鼻听,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開白布财著。 她就那樣靜靜地躺著,像睡著了一般撑碴。 火紅的嫁衣襯著肌膚如雪撑教。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評(píng)論 1 290
  • 那天醉拓,我揣著相機(jī)與錄音伟姐,去河邊找鬼。 笑死亿卤,一個(gè)胖子當(dāng)著我的面吹牛愤兵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播排吴,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼秆乳,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了傍念?” 一聲冷哼從身側(cè)響起矫夷,我...
    開封第一講書人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憋槐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淑趾,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阳仔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扣泊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近范。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖延蟹,靈堂內(nèi)的尸體忽然破棺而出评矩,到底是詐尸還是另有隱情,我是刑警寧澤阱飘,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布斥杜,位于F島的核電站,受9級(jí)特大地震影響沥匈,放射性物質(zhì)發(fā)生泄漏蔗喂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一高帖、第九天 我趴在偏房一處隱蔽的房頂上張望缰儿。 院中可真熱鬧,春花似錦散址、人聲如沸乖阵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞪浸。三九已至儒将,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間默终,已是汗流浹背椅棺。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齐蔽,地道東北人两疚。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像含滴,于是被迫代替她去往敵國和親诱渤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容