1. 程式人生 > 實用技巧 >Linux三劍客命令

Linux三劍客命令

  1 Linux三劍客(grep,sed,awk)
  2 
  3 這三個命令可以和正則表示式結合在一起,功能十分強大!!掌握了這三個命令,那麼基本就可以對linux檔案進行所有操作了.
  4 
  5 grep擅長查詢,sed擅長進行取行和替換操作,awk擅長進行取列操作.
  6 
  7 先說一下,正則表示式的基本模板(普通字元+元字元):
  8 
  9 | 字元       | 描述                                                         |
 10 | ---------- | ------------------------------------------------------------ |
 11
| [A-Z] | [A-Z] 表示一個區間,匹配所有大寫字母,[a-z] 表示所有小寫字母。 | 12 | [xyz] | 字元集合。匹配所包含的任意一個字元。例如, '[abc]' 可以匹配 "plain" 中的 'a' | 13 | [^xyz] | 負值字元集合。匹配未包含的任意字元。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n' | 14 | \D | 匹配一個非數字字元。等價於 [ ^0-9] | 15 | \d | 匹配一個數字字元。等價於 [0-9] | 16
| \r | 匹配一個回車符 | 17 | \s | 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v] | 18 | \S | 匹配任何非空白字元 | 19 | \w | 匹配字母、數字、下劃線。等價於 [A-Za-z0-9_] | 20 | \W | 匹配非字母、數字、下劃線 | 21
| . | 匹配除換行符(\n、\r)之外的任何單個字元 | 22 | ^ | 匹配輸入字串的開始位置,要匹配 ^ 字元本身,請使用 \^ | 23 | $ | 匹配輸入字串的結尾位置,要匹配 $ 字元本身,請使用 \\$ | 24 | \b | 匹配單詞邊界 | 25 | \B | 匹配非單詞邊界 | 26 | ( ) | 標記一個子表示式的開始和結束位置,子表示式可以獲取供以後使用 | 27 | * | 匹配0個或多個,貪婪匹配 | 28 | + | 匹配1個或多個,貪婪匹配 | 29 | ? | 匹配0個或1個,非貪婪匹配 | 30 | \| | 或的意思,多選一(x\|y,匹配x或y) | 31 | {n} | 匹配n次. | 32 | {n,} | 匹配至少n次. | 33 | {n,m} | 匹配至少n次,至多n次. | 34 | | | 35 | **修飾符** | **描述** | 36 | i | ignore,不區分大小寫,將匹配設定為不區分大小寫,搜尋時不區分大小寫 | 37 | g | global,全域性匹配,查詢所有匹配項 | 38 | m | multi line,多行匹配,使邊界字元 ^ 和 $ 匹配每一行的開頭和結尾,記住是多行,而不是整個字串的開頭和結尾 | 39 | s | 預設情況下的圓點 . 是 匹配除換行符 \n 之外的任何字元,加上 s 修飾符之後, . 中包含換行符 \n | 40 41 42 43 詳細的正則表示式介紹,請移步: https://www.runoob.com/regexp/regexp-tutorial.html 44 45 46 47 ### 一.grep命令: 48 49 #### grep [OPTIONS] PATTERN [FILE..] 50 51 - --color=auto 對匹配到的文字著色顯示(現在已經自動顯示為紅色了) 52 53 - **-v 顯示不被pattern匹配到的行** 54 55 - -i 忽略字元大小寫 56 57 - **-n 顯示匹配的行號** 58 59 - **-c 統計匹配的行數** 60 61 - -d 指定要查詢的是目錄 62 63 - **-w 只顯示包含匹配字串的行** 64 65 - **-o 僅顯示匹配到的字串** 66 67 - **-A 10 after 後10行日誌** 68 69 - **-B 10 before 前10行日誌** 70 71 - **-C 10 context 前後(上下文)各10行日誌** 72 73 - -e 實現多個選項間的邏輯or關係 74 75 grep -e '小明' -e '小王' 過濾出包含'小王'和'小明'的資訊 76 77 - **-E 支援正則表示式** 78 79 ```shell 80 #舉栗子 81 #grep -e和 grep -E區別 82 #1.grep -e只能檢索一個內容 83 grep -e '小明' -e '小王' filename 84 85 #2.grep -E可以傳遞多個內容,使用 | 來分割多個pattern,以此實現OR操作 86 grep -E '小明|小王' filename 87 88 #在filename檔案中找出含有word的所有行並顯示,-n顯示行號 89 grep -n 'word' filename 90 91 #在filename檔案中找到wall或者well所在的行並顯示 92 grep 'w[ea]ll' filename 93 94 #在file_name檔案中找到”非well”所在的所有行並顯示 95 grep 'w[^e]ll' filename 96 97 #在file_name檔案中找到以The開頭的所有行並顯示 98 grep '^The' filename 99 100 #在file_name檔案中找到goo(任意字元)(任意字元)le的所有行並顯示(即總共七個字元) 101 grep 'goo..le' filename 102 103 #在file_name檔案中找到g , gg , ggg等的所有行並顯示(*代表重複前一個字元0~~無窮多次) 104 grep 'g*g' filename 105 106 #在file_name檔案中找到Tyy,Tyyy的所有行並顯示(注意{}在 shell中有特殊含義,故需要轉義) 107 grep 'Ty\{2,3\}' filename 108 109 #注意:grep可以使用grep –color=always 來使得所查詢的字元擁有特殊顏色,然後在執行source ~/.bashrc 來使得設定立即生效 110 111 ``` 112 113 114 115 116 117 ### 二.sed命令: 118 119 sed是一種流編輯器,**實現資料的替換,刪除,增加,選取等(以行為單位進行處理),它一次處理一行內容**。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。然後讀入下行,執行下一個迴圈。如果沒有使諸如‘D’ 的特殊命令,那會在兩個迴圈之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到檔案末尾。**檔案內容並沒有改變,除非你使用重定向儲存輸出** 120 121 #### sed [ -hnV ] [ -e< script>] [ -f< script檔案>] [文字檔案] 122 123 - -e 多點編輯,以選項中指定的script來處理輸入的文字檔案 124 - -f 以選項中指定的script檔案來處理輸入的文字檔案 125 - -E/r 支援擴充套件正則表示式 126 - -n 只顯示匹配處理的行(不加-n,則會輸出所有)(也就是關閉預設的輸出) 127 - **-i 編輯原檔案!** 128 - **-i.bak 備份原檔案並編輯原檔案(不是備份的)** 129 130 文字編輯動作(在script中) 131 132 - a 新增,a後面新增的字串會出現在**當前行的下一行**,支援使用\n實現多行追加. 133 134 - i 插入,i 的後面可以接字串,會出現在當**前行的上一行**. 135 136 - = 顯示行號 137 138 - p 列印當前模式空間內容, 通常 p 會與引數 sed -n 一起執行. 139 140 - c 替換,替換行為單行或多行文字. 141 142 - d 刪除,刪除模式空間匹配的行,並立即啟用下一輪迴圈 143 144 - **s s///, 查詢替換,支援使用其它分隔符,s@@@,s###** 145 146 替換標記: 147 148 - **g, 行內全域性替換** 149 - p, 顯示替換成功的行 150 - w, /path/to/somefile 將替換成功的行儲存至檔案中 151 152 ```shell 153 #舉栗子 154 zx@xx:[/xx/xx]cat -n test.txt 155 1 admin 156 2 root 157 3 user admin 158 4 password 159 5 password 160 161 #在第二行前加ROOT 162 zx@xx:[/xx/xx]sed -e '2iROOT' test.txt| cat -n 163 1 admin 164 2 ROOT 165 3 root 166 4 user admin 167 5 password 168 6 password 169 170 #在第二行後加ROOT 171 zx@xx:[/xx/xx]sed -e '2aROOT' test.txt|sed = 172 1 173 admin 174 2 175 root 176 3 177 ROOT 178 4 179 user admin 180 5 181 password 182 6 183 password 184 185 #刪除前2行 186 zx@xx:[/xx/xx]cat -n test.txt | sed -e '1,2d' 187 3 user admin 188 4 password 189 5 password 190 191 #從第三行開始刪除到底 192 zx@xx:[/xx/xx]cat -n test.txt | sed -e '3,$d' 193 1 admin 194 2 root 195 196 #刪除包含user的行 197 zx@xx:[/xx/xx]sed '/user/d' test.txt 198 admin 199 root 200 password 201 password 202 203 #插入2行資料 204 zx@xx:[/xx/xx]cat -n test.txt | sed -e '2ax\ny' 205 1 admin 206 2 root 207 x 208 y 209 3 user admin 210 4 password 211 5 password 212 213 #替換內容,2-3行替換 214 zx@xx:[/xx/xx]cat -n test.txt | sed -e '2,3c hello' 215 1 admin 216 hello 217 4 password 218 5 password 219 220 #重複列印1-2行 221 zx@xx:[/xx/xx]sed -e '1,2p' test.txt|cat -n 222 1 admin 223 2 admin 224 3 root 225 4 root 226 5 user admin 227 6 password 228 7 password 229 230 #列印1-3行 231 zx@xx:[/xx/xx]sed -n '1,3p' test.txt| nl 232 1 admin 233 2 root 234 3 user admin 235 236 #將password替換成pwd 237 zx@xx:[/xx/xx]sed -e 's/password/pwd/g' test.txt 238 admin 239 root 240 user admin 241 pwd 242 pwd 243 244 #先將password替換成pwd,再刪除pwd 245 #-e 多點編輯 246 zx@xx:[/xx/xx]sed -e 's/password/pwd/g' -e '4,$d' test.txt 247 admin 248 root 249 user admin 250 251 #-i 直接修改原檔案, -i.bak備份原檔案 252 zx@xx:[/xx/xx]sed -i '1a hello' test.txt 253 zx@xx:[/xx/xx]cat -n test.txt 254 1 admin 255 2 hello 256 3 root 257 4 user admin 258 5 password 259 6 password 260 zx@xx:[/xx/xx]sed -i.bak '1i hello' test.txt 261 zx@xx:[/xx/xx]cat -n test.txt 262 1 hello 263 2 admin 264 3 hello 265 4 root 266 5 user admin 267 6 password 268 7 password 269 zx@xx:[/xx/xx]cat -n test.txt.bak 270 1 admin 271 2 hello 272 3 root 273 4 user admin 274 5 password 275 6 password 276 277 #懶,就不貼輸出了-.-(以前的筆記) 278 #刪除file_name檔案的2到4行 279 sed '2,4d' filename 280 281 #在第二行下新增這樣兩行 282 sed '2a lv .....\ 283 duidui is shuai!!!' filename 284 285 #把file_name檔案的2到4行,替換為ni han ma a !! 286 sed '2,4c ni han ma a!!!' filename 287 288 #把file_name檔案的2到5行打印出來(不用-n 引數,就會重複輸出2到5行) 289 sed '2,5p' -n filename 290 291 #把file_name檔案中的a[t]. 全部替換為p_temp-> (-i 會直接將修改寫入檔案,[ ] 和 . 是特殊符號,需要用\來轉義一下) 292 sed -i 's/a\[t\]\.p_temp->/g' filename 293 294 #找出檔名(檔案格式前的名字) 295 zx@xx:[/xx/xx]find *.txt 296 1.txt 297 2.txt 298 3.txt 299 zx@xx:[/xx/xx]find *.txt|sed -r 's/(.*).txt/ \1/' 300 1 301 2 302 3 303 zx@xx:[/xx/xx]find *.txt|sed -E 's/(.*).txt/ \1/' 304 1 305 2 306 3 307 #找出檔名之後,將其改名 308 #mv移動檔案或改名, bash是執行mv命令 309 zx@xx:[/xx/xx]find *.txt|sed -E 's/(.*).txt/mv \1.txt \1.md/' 310 mv 1.txt 1.md 311 mv 2.txt 2.md 312 mv 3.txt 3.md 313 zx@xx:[/xx/xx]find *.txt|sed -E 's/(.*).txt/mv \1.txt \1.md/'|bash 314 315 ``` 316 317 318 319 ### 三.awk命令: 320 321 awk 是一種處理文字檔案的語言,是一個強大的文字分析工具. 322 323 #### awk [OPTIONS] 'pattern {action}' filename 324 325 1. **OPTIONS: awk的引數** 326 2. **pattern{action}: 模式動作** 327 - **pattern: 要找的物件** 328 - **{action}: 找到了之後要做的事情** 329 330 **注意:** 331 332 1. Pattern和{Action}需要用單引號引起來 333 2. Pattern是可選的。**如果不指定,awk將處理輸入檔案中的所有記錄。如果指定一個模式,awk則只處理匹配指定的模式的記錄** 334 3. {Action}為awk命令,可以是單個命令,也可以多個命令。整個Action(包括裡面的所有命令)都必須放在{ }中 335 4. Action必須被{ }包裹,沒有被{ }包裹的就是pattern 336 5. filename要處理的目標檔案 337 338 引數說明: 339 340 - **-F 指定欄位分隔符** 341 - **-v var=value 自定義變數並賦值** 342 343 344 345 內建變數(**在引用時不需要前面加$**) 346 347 | 變數 | 描述 | 348 | -------- | ------------------------------------------------------------ | 349 | $n | 當前行的第n列,欄位間由FS分隔 | 350 | $0 | 整個當前行 | 351 | NFR | 各檔案分別計數的行號,都從1開始 | 352 | FS | 輸入欄位分隔符(預設是任何空格) | 353 | NF | 每一行擁有的欄位總數,**$NF表示最後一列**,**$(NF-1)表示倒數第二列** | 354 | NR | 目前處理的是第幾行的資料,就是行號($NR),從1開始 | 355 | OFS | 輸出欄位分隔符(輸出換行符),輸出時用指定的符號代替換行符 | 356 | ORS | 輸出行分隔符(預設值是一個換行符) | 357 | RS | 輸入行分隔符(預設是一個換行符) | 358 | FILENAME | 當前檔名 | 359 360 ```powershell 361 #舉栗子 362 zx@xx:[/xx/xx]cat test.txt 363 root1,root2,root3 364 user1,user2,user3 365 zhangsan,lisi,wangwu 366 123,456,789 367 368 #列印檔案第一列 369 zx@xx:[/xx/xx]awk -F , '{print $1}' test.txt 370 root1 371 user1 372 zhangsan 373 123 374 375 #輸出第1,3列,並以\t為分隔符 376 zx@xx:[/xx/xx]awk -F , '{print $1,$3}' OFS="\t" test.txt 377 root1 root3 378 user1 user3 379 zhangsan wangwu 380 123 789 381 382 #查詢包含123的行,不包含123的行 383 zx@xx:[/xx/xx]awk '/123/' test.txt 384 123,456,789 385 zx@xx:[/xx/xx]awk '!/123/' test.txt 386 root1,root2,root3 387 user1,user2,user3 388 zhangsan,lisi,wangwu 389 390 #將test.txt檔案前3行的第一,二列,以製表符分隔打印出來 391 zx@xx:[/xx/xx]cat -n test.txt 392 1 root roat www 393 2 abc dbc xxx 394 3 ney aey ddd 395 4 11 22 33 396 zx@xx:[/xx/xx]awk 'NR<4{print $1"\t"$2}' test.txt 397 root roat 398 abc dbc 399 ney aey 400 zx@xx:[/xx/xx]awk 'NR<4{print $1,$2}' OFS="\t" test.txt 401 root roat 402 abc dbc 403 ney aey 404 zx@xx:[/xx/xx]awk '{print "該行資料為"$0"\t" "該行的欄位總數為"NF"\t" "目前這是第幾行"NR}' test.txt 405 該行資料為root roat www 該行的欄位總數為3 目前這是第幾行1 406 該行資料為abc dbc xxx 該行的欄位總數為3 目前這是第幾行2 407 該行資料為ney aey ddd 該行的欄位總數為3 目前這是第幾行3 408 該行資料為11 22 33 該行的欄位總數為3 目前這是第幾行4 409 410 411 ```