sed, awk 練習

1. sed打印某行到某行之間的內容

2. sed 轉換大小寫

  • 將單詞首字母轉化大寫
  • 將所有小寫轉化大寫

3. sed 在某一行最後面添加一個數字

4. 刪除某行到最後一行

解析: {:a;N;$!ba;d}

:a      : 是做一個標識符, 標識符名稱爲 a(此處名稱可以自定義)

N       將下一行文本讀入 待操作空間(pattern space), sed操作是先將一行讀入(pattern space) 模式空間, 然後根據命令處理這一行文本.

$!ba    可以拆解爲 b:流程控制 回到前面一個標記 :(分號標記點) 的位置 即 a 標記,(這裏的b 是 break 的意思) $! 爲 b語句的判斷條件, 如果滿足這個條件即執行 break :a 這個動作, 
        # 這個 :a COMMAND; $!b:a  有點像是C語言的 do{}while(); 語句 這個do{} 就是:a 以及後繼的命令, while() 就是 $!b:a , 而 $! 僅僅是 while() 裏面的判斷條件.
        # 這裏的僅僅是有點相似, 準確的說 :a COMMAND; $!b:a 更像是 彙編或C 裏面 loop: goto 語句, 一個標記點, 另一個是跳轉.

---------

/^abc/      # 匹配 abc 開頭的行
p           # 打印上面匹配到的行
:a          # 做標記
N           # 將該行的下一行讀入 模式空間
$!ba        # 滿足 $!(沒有到最後一行)  條件時 跳回 :a 標記處
d           # 當上面語句執行完畢時,執行該語句, 刪除

:a; COMMAND ;//ba 語句實驗

  • 上面操作 是 匹配/.*/ 所有內容, {:a;N;3!ba} 將 第三行以及之前的內容讀入pattern 空間內, ;p 將 pattern 空間內的 內容 打印出來.

5. sed 的空間概念

sed 命令在處理文件內容時, 會將當前行存儲在臨時緩衝區內, 稱爲(pattern space), 接着sed 命令處理緩衝區內的內容, 處理結束後, 會將緩衝區內的內容按照命令指定方式處理(默認會print, 也可以指定d :delete) 接着會清理緩衝區, 處理下一行, 重複上面動作.

sed 還有一段保留空間(hold space) 相當於倉庫, 用戶可以根據 需要將當前行內容放入該空間中, 便於後面需要時取出.

空間的相關操作:

d           Delete 了 pattern space 的內容

h H         複製/追加 pattern space 的內容到 hold space

g G         複製/追加 hold space 的內容到 pattern space 

x           交換  hold space 和pattern  space內容  

n           讀取下一個輸入行, 用下一個命令處理, 而不是從第一個命令開始處理

N           讀取下一行到 pattern space 內, 和pattren space 內原有的內容作爲一行處理. 會改變當前的行號

  • 123 開頭的行移到 ee開頭的行, 並將ee行 放到最後一行. 使用 hold space 做存儲可以很方便做到這些.

6. sed 中遇到N 會將下一行連帶彙總在一起處理

7. 打印2到6行含某個字符串的行

8. awk 中使用外部變量

awk -v val=$val

9.awk 合併文件

10. 過濾多個關鍵字

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章