1. 程式人生 > >【Linux】sed、awk、cut、sort常用命令

【Linux】sed、awk、cut、sort常用命令

1、利用sed命令在/etc/passwd中分別查詢滿足以下條件的行:

  首先在操作之前,先整一份資料,為了視覺化方便,整到桌面。(之所以費勁整到桌面上就是為了照顧一些初學者,當執行完下面兩句命令後,會發現桌面上多了一個檔案,相當於是看到正反饋了,就會給人信心,告訴自己付出就有回報。)

cd ~/Desktop
cat /etc/passwd >> passwd

(以下命令可以在終端直接執行,也可以寫成Shell檔案,當然得先知道什麼是sed)
sed說明

(1) o字元重複任意次

sed -n '/o*/p' passwd

或者

#! /bin/bash
sed
-n '/o\{0,\}/p' passwd echo "執行結束"

(2) o字元重複一次以上

 sed -n '/o\{1,\}/p' passwd

(3) o字元重複兩次以上

sed -n '/o\{2,\}/p' passwd
或者
sed '/o.*o/p' /etc/passwd   #可連續可不連續

命令總結:

  sed中使用正則表示式,先寫出來 sed -n ‘//p’ 檔名
然後再在//中填寫正則表示式,注意圓括號()和花括號{}都需要轉義符,即\(\)\{\},如下所示

sed -n '/正則表示式/p' 檔名

sed的正則表示式

2、利用sed命令將input檔案中的\OU字串修改為(ou)

sed 's/\\OU/(ou)/gp' input

命令總結:

  先寫出來 sed -n ‘s///gp’ 檔名 g :global 表示全域性匹配
然後再在///(三斜槓)之間填寫字串,如下所示

sed -n 's/原字串/替換後字串/p' input

sed的替換命令

3、利用sed命令列印input檔案中除第3-8行之外的所有行,在以下三種不同選項組合下執行該命令:

(1)不帶任何選項:

sed '3,8d' passwd

(2)只帶一p選項;

sed '3,8!p' passwd

(3)同時帶一n和一p選項

sed -n '3,8!p' input

命令總結

  (1)不帶任何選項是不可能的,題目的意思是不列印3-8行內容,所以直接的想法就是將3-8行內容刪除,即delete,對應的就是d選項
  (2)如果不帶-n選項的話,p選項會將處理過的行列印兩編,沒處理過的行列印一遍。
  (3)帶上-n會呈現靜默列印,意思就是打印出來你想要的效果。
sed的-n選項

4、用兩個不同的命令實現如下功能:將input檔案中的\OU字串修改為(ou),並在與\OU的匹配行後追加“We find \OU!”字串。

sed -n -e 's/\\OU/(ou)/g ; s/(ou).*$/&We find \\OU/gp' input
	或者
sed -n -e 's/\\OU/(ou)/g' -e 's/(ou).*$/&We find \\OU/gp' input

命令總結:

  首先,需要組合命令,有兩種方式,一種是用分號隔開,一種是多個 -e 即如下所示

	  sed -e '命令1;命令2' 檔名
	  sed -e '命令1' -e '命令2' 檔名

sed的-e選項
  然後是在行末追加,其實本質還是替換語句,只不過在’s//&這裡/’,的開頭加上&後就變成在所要替換的內容之後追加,至於行末,就是在’s/這裡 / / //' 的後面加上 表示行末,這樣就符合在所要替換內容的行末之後追加命令如下:

	  sed -n 's/(ou).*$/&We find \\OU/gp' input

  如果是行首的話,應該是’s/^這裡/替換後的字串&/’ 的前面加上^,並且看到替換後的字串也就到了&符號之前了,命令如下:

	  sed -n -e 's/\\OU/(ou)/g' -e 's/^.*(ou).*/WE find&/gp' input

  可以仔細體會一下。

5、將input檔案中的abcde字元分別用EDCBA替換。

sed 'y/abcde/EDCBA/' input

命令總結:

  字典替換,不再需要-n p ,s替換成y

sed的字典匹配

7、在student檔案中有7個域,表示學生姓名、籍貫、C語言,資料庫,離散數學,java考試成績,student內容如下:

張敏 南京 76 89 66 93 67
李準 石家莊 86 92 76 83 87
小飛 邢臺 88 66 55 96 93
王波 岳陽 93 79 85 78 90
柏慧 無錫 94 76 82 86 91
圖雅 紹興 96 77 86 84 90
安冬 紹興 96 87 96 94 97

(1)按Java考試成績排序,從低到高,如果Java成績相同,再按離散數學排序從高到低。

sort -k 7,7n -k 6,6n student

(2)按籍貫統計學生人數

cut -d " " -f 2 student | sort |uniq -c

(3)找出Java成績最高的前五名學生的情況

sort -k 7,7nr student | head -5

命令總結

這些命令如果不會的話,可以隨時man sort,或者man cut,或者 man 你想查的命令,我這裡簡單寫幾個:

sort 小結

分隔符 -t
-t, --field-separator=SEP use SEP instead of non-blank to blank transition
按字典排序(預設升序)
-d, --dictionary-order consider only blanks and alphanumeric characters
字典,Linux預設編碼是UTF-8,即Linux的字典
圖 < 安 < 小 < 李 < 柏 < 王
\u56fe\u5b89\u5c0f\u674e\u67cf\u738b
翻轉 -r
sort預設是升序排序的,加上r選項就可以變成降序排序

cut 小結

定界符 -d (類似sort裡面的分隔符 -t)
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter

8 利用awk完成,針對Student檔案

下面這些 內容就是awk了,awk官方說是一門程式語言,幾句話講不清,具體可以在命令列輸入man awk檢視官方文件。

(1)列出姓名,總分, 平均分

awk '{ print $1,$3+$4+$5+$6+$7,($3+$4+$5+$6+$7)/5; }' student

(2)列出總分最高的人的記錄。

(3)學生總分小於450的學生姓名

awk '{ if(($3+$4+$5+$6+$7)<450)  print $1; }' student

9. 寫一個命令,去掉某檔案中所有的空格符,並將結果儲存到a.txt。

sed 's/ //g' student > a.txt

10.寫一個命令,輸出某Shell變數中所包含字元的個數。

在此基礎上,再寫一個命令,輸出該變數中所包含字母的個數(空格不計算在內 )。(提示:用sed和wc命令)

s="123abcde456 fghi"

echo ${#s}

x="erte dgg rgtd rg"

echo $x |sed 's/ //g' |wc -c

撒花出門記得點贊喲!撒花