1. 程式人生 > >Linux入門-7 Linux管道、重定向以及文本處理

Linux入門-7 Linux管道、重定向以及文本處理

cas tde blog linux中 err linuxcast 重要 nal new

Linux管道、重定向以及文本處理

  • 1 Linux多命令協作:管道及重定向
    • 管道和重定向
  • 2 Linux命令行文本處理工具
    • 文件瀏覽
    • 基於關鍵字搜索-grep
    • 基於列處理文本-cut
    • 文本統計-wc
    • 文本排序-sort
    • 刪除重復行
    • 文本比較-diff
    • 檢查拼寫-aspell
    • 處理文本內容-tr
    • 搜索替換-sed

開源的一個重要理念:不要重復發明輪子
很多開源軟件都是現有軟件、代碼、功能的重新組合。
《大教堂與集市》

1 Linux多命令協作:管道及重定向

管道和重定向

Linux中,大多數命令都很簡單,往往只實現一個或幾個簡單的功能,我們可以將不同功能的命令組合在一起使用,以達到完成某個復雜功能的目的。
Linux中,幾乎所有命令的返回都是純文本的,而純文本形式的數據是絕大多數命令的輸入格式,這就讓協作成為可能。
Linux的命令行為我們提供了管道和重定向機制,多命令協作就是通過管道和重定向完成的。

  • 命令行shell數據流有以下定義:
名稱 說明 編號 默認
STDIN 標準輸入 0 鍵盤
STDOUT 標準輸出 1 終端
STDERR 標準錯誤 2 終端

命令通過STDIN接收參數或數據,通過STDOUT輸出結果或通過STDERR輸出錯誤。

  • 通過管道和重定向可以控制CLI的數據流
  • 管道通常用來組合不同的命令,以實現更復雜的功能
  • 重定向通常用來保存命令的輸出或錯誤信息
分類 關鍵字 定義 例子
重定向 > 將STDOUT重定向到文件(覆蓋) echo "linuxcast.net" > outfile
重定向 >>
將STDOUT重定向到文件(追加) echo "linuxcast.net" >> outfile
重定向 2> 將STDERR重定向到文件(覆蓋) echo "linuxcast.net" 2> outfile
重定向 2>&1 將STDERR與STDOUT結合 echo "linuxcast.net" 2>&1 outfile
重定向 < STDIN grep linuxcast < /etc/passwd
管道 | 將一個命令的STDOUT作為另一個命令的STDIN ls -l | grep linuxcast

一個更復雜的例子:查找用戶linuxcast的Video文件,將查找錯誤重定向到null(丟棄)
find / -user linuxcast 2> /dev/null | grep Video

2 Linux命令行文本處理工具

文件瀏覽

  • cat/more/less/head/tail

基於關鍵字搜索-grep

該命令使用正則表達式搜索指定的純文本文件或純文本(管道)

  • -i 忽略大小寫
  • -n 現實結果所在行數(文件)
  • -v 輸出不帶關鍵字的行(反選)
  • -Ax 輸出的時候包含結果所在行之後的指定行數
  • -Bx 輸出的時候包含結果所在行之前的指定行數

基於列處理文本-cut

  • -d 指定分割字符,默認為TAB
  • -f 指定輸出的列號
  • -c 基於字符進行切割,固定長度

例:
cut -d: -f1 /etc/passwd:為分割符,顯示第一列
grep linuxcast /etc/passwd | cut -d: -f3輸出用戶linuxcast的uid(第三列)
cut -c2-6 /etc/passwd第2-6個字符

文本統計-wc

  • -l 只統計行數line
  • -w 只統計單詞word
  • -c 只統計字節數
  • -m 只統計字符數

文本排序-sort

  • -r 進行倒敘排序
  • -n 基於數字進行排序
  • -f 忽略大小寫
  • -u 刪除重復行
  • -tc 使用c作為分隔符分割為列進行排序
  • -kx 當進行基於指定字符分割為列的排序時,指定基於哪個列排序

刪除重復行

  • sort -u 排序時刪除重復行
  • uniq 刪除重復的相鄰行

文本比較-diff

  • -i 忽略大小寫
  • -b 忽略空格數量的改變
  • -u 統一顯示比較信息(一般用以生成patch文件)
    diff -u linuxcast linuxcast-new > final.patch

檢查拼寫-aspell

  • aspell check linuxcast
  • aspell list < linuxcast

處理文本內容-tr

translate

  • tr -d ‘TMD‘ < linuxcast 刪除關鍵字
  • tr ‘a-z‘ ‘A-Z‘ < linuxcast 轉換大小寫

搜索替換-sed

使用正則表達式處理文本文件

  • sed ‘s/linux/unix/g‘ linuxcast 替換linux為unix,/g全部替換
  • sed ‘1,50s/linux/unix/g‘ linuxcast 替換1-50行
  • sed -e ‘s/linux/unix/g‘ -e ‘s/nash/nash_su/g‘ linuxcast 多個正則表達式
  • sed -f sededit linuxcast 將匹配表達式保存在sededit文件中

Linux入門-7 Linux管道、重定向以及文本處理