Linux三劍客(grep sed awk)學習-進階篇

前言

前提是要掌握以下內容,才能很好的學習本片博文,此篇博文做深入學習和以往知識複習之用。以下這些知識點可以查看博主的 linux 欄目的內容,都有作很詳細的針對性的介紹使用

  • 正則表示的運用
  • linux 三劍客的基本熟悉瞭解
  • linux 一些命令的使用熟悉瞭解

一些小問題

# shell 單引號還是雙引號問題
shell 中單引號中的是原始字符串,不能起到轉義變量的作用
雙引號中的可以是變量,從而表示新字符串,也就是說雙引號中可以識別變量,但是單引號中不能識別變量

# 打開 linux 文檔後如何查看
pageUp 向上翻頁
pageDown 向下翻頁
輸入/後面輸入要搜索的內容,n 表示 next,N 表示上一個

# awk 爲什麼單引號中加雙引號
awk 單引號中表示其中爲 awk 的腳本,加上雙引號表示打印字符串,類似 java 的字符串用雙引號輸出

# 注意了 grep 中的正則可以在單引號中直接編寫,sed 和 awk 中的正則則需要在 / / 中編寫,這是因爲單引號外是它們自己的腳本動作,因爲 sed 是一種編輯器(面向流),awk 是一個解釋器,其本身即使一門編程語言,它們爲了將正則和自己專有的腳本作區分,所以讓正則用 / / 包裹

grep

擅長行的處理

grep 後是正則腳本

格式

grep [OPTION] PATTERN [FILE]

OPTION 選項

# 顯示不被模式匹配到的行
-v
# 忽略大小寫
-i
# 顯示行號
-n
# 統計匹配的行數
-c
# 僅顯示匹配到的字符串
-o
# 支持擴展正則
-E
# 查找後幾行
-B n
# 查找前幾行
-A n
# 查找前後幾行
-C n

sed

擅長替換,一次處理一行

sed 只會修改臨時存儲在模式空間的內容,真實原內容不會變,除非加命令讓真實內容改變

sed 後是 sed 的腳本 + 正則組合使用

格式

-e 是指定後面腳本

sed [-hnV] [-e<script>] [-f<script文件>] [文本文件]

注意點

# 默認只支持 ^$.*[] 基礎正則
grep

# 這種寫法可以支持擴展正則
egrep
grep -E

例子

# 加 -e 有什麼好處呢?如果你寫兩段單引號的正則,加了 -e 的都可以正常執行,沒加的只能執行第一個
sed -e '10a tmp' -e '11a tmp2'
sed '10a tmp' '11a tmp2'

# 行後新增,在第十行後新增一行 tmp,a 表示 add,-e 可以不加默認就是腳本
sed -e '10a tmp'
sed '10a tmp'

# 行更改,用 tmp 取代 1-10 行內容,寫作 1,10c,c 有 change 的意思
sed '1,10c tmp'
sed -e '1,10c tmp'

# 行刪除,刪除 1-10 行內容,d 有 delete 的意思
sed '1,10d'
sed -e '1,10d'

# 行前插入,在第十行前插入一行 tmp,i 表示 insert 的意思
sed '10i tmp'
sed -e '10i tmp'

# 正常打印到屏幕,加 -e 無法輸出到屏幕,只能加 -n 才能
sed -n '/regex/p'

# 全局替換文本,s 表示 select 選擇,g 表示 global 全局,不加 g 表示替換第一個
sed 's/tmp1/tmp2/g'
sed -e 's/tmp1/tmp2/g'

# 表示直接修改原文件了,這個一定要注意使用!!!
-i

注意點

# 默認支持基礎正則
sed

# 支持擴展正則
sed -r

# 同時我們也建議使用 s#...#...#g 這種寫法因爲這種寫法可以避免將裏頭的“/”字符轉義,顯得看起來混亂
sed -r s#...#...#g

# 另外需要特別注意的是使用 -r 時是支持擴展正則,但是僅僅是在第一個井號和第二個井號之間支持,第二個和第三個井號之間是不支持正則的,會以純文本形式輸出
sed -r s#識別一切正則符號#不識別一切正則符號#g

awk

擅長列的切片,空格爲默認分隔符。awk 本身其實就是一門編程語言

awk 的大致流程就是逐行處理,把行作爲賦值給 $0,然後將 $0 按照默認空格符做切分,切分爲 $1, $2, $3...,然後執行編程動作,最後輸出到屏幕

awk 後相當於是正則 + 編程腳本的混合使用

格式

awk 'pattern + action' [FILE]

例子

# BEGIN 處理文本前要執行的
# 先讓文件以 begin 開頭做第一行,然後打印第一列
awk 'BEGIN{print "begin"} {print $1}' file.log

# END 處理文本後要執行的

# FS 設置分隔符,默認是空格,等價於 -F

# NF 列數

# NR 行數
# 以 : 爲分隔符,導引第二行一整行的信息
awk -F : 'NR==2 {print $0}' file.log

# OFS 輸出域分隔符,ORS 輸出記錄分隔符,RS 控制記錄分隔符(默認\n)

# $0 整行,$1 第一列 ...
# 以 : 爲分隔符,匹配 root 的行,並顯示第一列,第二列
awk -F : '/root/ {print $1,$2}' file.log

# 因爲 awk 本身是一門編程語言,{print...} 前相當於是條件語句,其中條件表達式需要用 && 連接
awk '/aaa/ && NR==1 && NF==1 {print $0}' file.log

# 直接依據條件來輸出也行
awk 'NR==1' file.log

注意點

# awk 中 NR 和 NF 表示數字,即共多少行和多少列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章