Linux基礎命令-文本處理工具與標準I/O和管道
文本處理工具與標準I/O和管道
一、抽取文本的工具
1. 文件內容
文件查看命令:cat,nl,tac,rev
1. cat [ OPTION ] ... [ FILE ] ...
- E :顯示行結束符$ - n:對顯示出的每一行進行編號
- A :顯示所有控制符
- b:非空行編號
- s:壓縮連續的空行成一行
2. nl [ OPTION ] ... [ FILE ] ...
(nl 命令在 Linux 系統中用來計算文件中行號。nl 可以將輸出的文件內容自動的加上行
號,其默認的結果和與 cat - n 有點不太一樣,nl 可以將行號做比較多的顯示設計,
包括位數是否自動補齊 0 等等的功能)
- b : 指定行號指定的方式,主要有兩種
- b a :表示無論是否爲空行,也同樣列出行號 ( 類似 cat - n)
- b t:表示有空行,空的那一行不要列出行號 ( 默認值)
- n:列出行號表示的方法,主要有三種
- n ln :行號在螢幕的最左方顯示;
- n rn :行號在自己欄位的最右方顯示,且不加 0 ;
- n rz :行號在自己欄位的最右方顯示,且加 0 ;
- w :行號欄位的佔用的位數;
- p :在邏輯定界符處不重新開始計算。
3. tac [ OPTION ] ... [ FILE ] ...
(將指定文件中的行,按照反序方式顯示)
-- version 顯示命令版本信息
-- help 顯示幫助文檔
- b | -- before 將分隔符放到文件記錄前
- r | -- regex 將分隔符當做一般字符處理
- s | -- separator= STRING 使用指定的間隔字符取代新建的控制字符
4. rev [ OPTION ] ... [ FILE ] ...
(The rev utility copies the specified files to standard output,
reversing the order of characters in every line.
If no files are specified, standard input is read. )
(rev命令將文件中的每行內容以字符爲單位反序輸出,即第一個字符最後輸出,
最後一個字符最先輸出,依次類推)
[ root@centos7 data] # rev 0. txt
321321
123123
[ root@centos7 data] # cat 0. txt
123123
321321
5. more:分頁查看文件
more [ OPTIONS ... ] FILE ...
- d: 顯示翻頁及退出提示
6. less:一頁一頁地查看文件或STDIN 輸出
查看時有用的命令包括:
/ 文本 搜索 文本
n/ N 跳到下一個 或 上一個匹配
less 命令是man命令使用的分頁器
2. 文件截取
1. head [ OPTION ] ... [ FILE ] ...
- c # 指定獲取前#字節
- n # 指定獲取前#行
- # 指定行數
2. tail [ OPTION ] ... [ FILE ] ...
- c # 指定獲取後#字節
- n # 指定獲取後#行
- # 同上
- f 跟蹤顯示文件fd新追加的內容, 常用日誌監控
相當於 -- follow= descriptor
- F 跟蹤文件名,相當於-- follow= name -- retry
3. tailf 類似tail –f,當文件不增長時並不訪問文件
3. 按列抽取和合並文件
cut [ OPTION ] ... [ FILE ] ...
- d DELIMITER : 指明分隔符,默認tab
- f FILEDS :
#: 第#個字段
#, #[ , #] :離散的多個字段,例如1 , 3 , 6
#- #:連續的多個字段, 例如1 - 6
混合使用:1 - 3 , 7
- c 按字符切割
-- output- delimiter= STRING 指定輸出分隔符
顯示文件或STDIN 數據的指定列
cut - d: - f1 / etc/ passwd
cat / etc/ passwd | cut - d: - f7
cut - c2- 5 / usr/ share/ dict/ words
2. paste 合併兩個文件同行號的列到一行
paste [ OPTION ] ... [ FILE ] ...
- d 分隔符:指定分隔符,默認用TAB
- s : 所有行合成一行顯示
示例:
paste f1 f2
paste - s f1 f2
4. 排序和統計
1. wc [ OPTION ] ... [ FILE ] ...
計數單詞總數、行總數、字節總數和字符總數
可以對文件或STDIN 中的數據運行
wc story. txt
39 237 1901 story. txt
行數 字數 字節數
常用選項
- l 只計數行數
- w 只計數單詞總數
- c 只計數字節總數
- m只計數字符總數
- L 顯示文件中最長行的長度
2. sort [ OPTION ] ... [ FILE ] ...
把整理過的文本顯示在STDOUT ,不改變原始文件
常用選項
- r 執行反方向(由上至下)整理
- R 隨機排序
- n 執行按數字大小整理
- f 選項忽略(fold)字符串中的字符大小寫
- u 選項(獨特,unique)刪除輸出中的重複行
- t c 選項使用c做爲字段界定符
- k X 選項按照使用c字符分隔的X 列來整理能夠使用多次
3. uniq [ OPTION ] ... [ FILE ] ...
從輸入中刪除前後相接的重複的行
- c: 顯示每行重複出現的次數
- d: 僅顯示重複過的行
- u: 僅顯示不曾重複的行
注:連續且完全相同方爲重複
常和sort 命令一起配合使用:
sort userlist. txt | uniq - c
5. 打補丁
在Linux應用中,作爲DBA ,我們知道MySQL跑在Linux系統之上,數據庫最重要的追求
就是性能,“穩”是重中之重,所以不能動不動就是換系統或是換這換那的,這個時候
除非是萬不得已,要不然都是在原有基礎上改改就行了,也就是給內核及下載的一些
源碼打補丁或者說是升級,那麼在Linux下使用diff製作補丁以及如何使用patch打
補丁顯得尤爲重要。
一、找不同:diff命令(differences)
-- compare files line by line
一行一行的比較文本文件
作用:
比較兩個文件之間的差異,輸出結果爲兩個文件的不同之處。
使用diff命令製作補丁。
格式:
diff [ OPTION ] ... FILES
選項:
- u:會將不同的地方放在一起,緊湊易讀
diff - u linuxidc. com1 test2 > test. patch (利用diff命令生成補丁patch)
- r:遞歸比較目錄下的所有文件(比較文件夾時候一定要接- r)
1 、diff命令:找不同
shell> cp fruit. txt shuiguo. txt
shell> diff fruit. txt shuiguo. txt
shell> echo "banana" >> fruit. txt
shell> diff fruit. txt shuiguo. txt
9 d8
< banana
shell> echo "cherry" >> shuiguo. txt
shell> diff fruit. txt shuiguo. txt
9 c9
< banana
-- -
> cherry
2 、diff命令:製作補丁文件
shell> cat ni. txt
jinan
changqing
linux
chinaitsoft
shell> cp ni. txt wo. txt
shell> diff ni. txt wo. txt
shell> diff - u ni. txt wo. txt
shell> echo "zhangjiacai" >> wo. txt
shell> diff - u ni. txt wo. txt
-- - ni. txt 2016 - 11 - 02 16 : 11 : 35.253976996 + 0800
++ + wo. txt 2016 - 11 - 02 16 : 13 : 50.037971397 + 0800
@@ - 2 , 3 + 2 , 4 @@
changqing
linux
chinaitsoft
+ zhangjiacai
shell> vim ni. txt
shell> cat ni. txt
jinan
linux
chinaitsoft
shell> diff - u ni. txt wo. txt
-- - ni. txt 2016 - 11 - 02 16 : 16 : 32.930978061 + 0800
++ + wo. txt 2016 - 11 - 02 16 : 13 : 50.037971397 + 0800
@@ - 1 , 3 + 1 , 5 @@
jinan
+ changqing
linux
chinaitsoft
+ zhangjiacai
解析:
@@ 代表一段範圍
- 代表ni. txt
+ 代表wo. txt
使用 > 輸出重定向生成補丁文件ni- to- wo. patch
shell> diff - u ni. txt wo. txt > ni- to- wo. patch
shell> cat ni- to- wo. patch
-- - ni. txt 2016 - 11 - 02 16 : 16 : 32.930978061 + 0800
++ + wo. txt 2016 - 11 - 02 16 : 13 : 50.037971397 + 0800
@@ - 1 , 3 + 1 , 5 @@
jinan
+ changqing
linux
chinaitsoft
+ zhangjiacai
如此,我們就做好了一個補丁文件。
二、打補丁:patch命令
-- - apply a diff file to an original.
用途:
用來打補丁-- - 修補文件
格式:
patch [ 選項] 原始文件 < 補丁文件
- pN:N 表示忽略N 層路徑
- R : 還原到老版本
注意事項:
①如果打多個補丁,注意先後順序;
②打補丁前不要修改源文件;
1 、文件和文件的比較
shell> diff ni. txt wo. txt
1 a2
> changqing
3 a5
> zhangjiacai
shell> diff ni. txt wo. txt > ni- to- wo. patch
shell> patch ni. txt < ni- to- wo. patch
patching file ni. txt
shell> diff ni. txt wo. txt
shell> patch - R ni. txt < ni- to- wo. patch
patching file ni. txt
shell> diff ni. txt wo. txt
1 a2
> changqing
3 a5
> zhangjiacai
2 、目錄和目錄的比較
[ root@localhost linuxidc. com] # tree qq- v1
qq- v1
├── hosts
└── image
└── 1. txt
[ root@localhost linuxidc. com] # tree qq- v2
qq- v2
├── hosts
├── image
│ └── 1. txt
├── passwd
└── sound
└── 3. txt
[ root@localhost linuxidc. com] # diff - ur qq- v1 qq- v2
Only in qq- v2: passwd
Only in qq- v2/ sound: 3. txt
[ root@localhost linuxidc. com] # diff - Nur qq- v1 qq- v2
diff - Nru qq- v1/ passwd qq- v2/ passwd
-- - qq- v1/ passwd 1970 - 01 - 01 08 : 00 : 00.000000000 + 0800
++ + qq- v2/ passwd 2016 - 11 - 02 17 : 07 : 47.664980339 + 0800
@@ - 0 , 0 + 1 , 31 @@
+ root: x: 0 : 0 : root: / root: / bin/ bash
+ bin: x: 1 : 1 : bin: / bin: / sbin/ nologin
解析:
- N -- new - file(Treat absent files as empty)如果沒有文件,就拿一個空文件和別的目錄裏的文件比較
製作補丁文件進行對目錄的打補丁
[ root@localhost linuxidc. com] # diff - Nur qq- v1 qq- v2 > patch- v2. txt #比較文件夾生成補丁文件-- 備用:補丁文件patch- v2. txt在linuxidc. com目錄下
- pnum or -- strip= num
Strip the smallest prefix containing num leading slashes from each file name
found in the patch file.
例如:/ a/ b/ c/ d/ e/ f/ g
- p3 的效果就是去掉第3 個/ 前面的內容,效果:c/ d/ e/ f/ g
- p4 的效果就是去掉第4 個/ 前面的內容,效果:d/ e/ f/ g
1 > 內層打補丁
[ root@localhost linuxidc. com] # cd qq- v1 #進入qq目錄,進去裏面進行打補丁
[ root@localhost qq- v1] # patch - p1 < . . / patch- v2. txt
patching file passwd
patching file sound/ 3. txt
[ root@localhost qq- v1] # cd . .
[ root@localhost linuxidc. com] # diff - Nru qq- v1 qq- v2
[ root@localhost linuxidc. com] # cd qq- v1
[ root@localhost qq- v1] # patch - R - p1 < . . / patch- v2. txt
patching file passwd
patching file sound/ 3. txt
[ root@localhost qq- v1] # cd . .
[ root@localhost linuxidc. com] # diff - Nru qq- v1 qq- v2
diff - Nru qq- v1/ passwd qq- v2/ passwd
-- - qq- v1/ passwd 1970 - 01 - 01 08 : 00 : 00.000000000 + 0800
++ + qq- v2/ passwd 2016 - 11 - 02 17 : 07 : 47.664980339 + 0800
@@ - 0 , 0 + 1 , 31 @@
+ root: x: 0 : 0 : root: / root: / bin/ bash
+ bin: x: 1 : 1 : bin: / bin: / sbin/ nologin
2 > 外層打補丁
[ root@localhost linuxidc. com] # patch - p0 < patch- v2. txt
patching file qq- v1/ passwd
patching file qq- v1/ sound/ 3. txt
牆裂建議:
任何操作前,記得對文件、目錄做好備份,防止操作失敗導致數據丟失。
原文鏈接
二、標準I/O和管道
1. 三種I/O設備
1. 程序:指令+ 數據
讀入數據:Input
輸出數據:Output
2. 打開的文件都有一個fd: file descriptor ( 文件描述符)
3. Linux給程序提供三種 I / O 設備
標準輸入(STDIN )-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT )-1 默認輸出到終端窗口
標準錯誤(STDERR )-2 默認輸出到終端窗口
4. I / O 重定向:改變默認位置
2. 把I/O重定向至文件
a. 把輸出和錯誤重新定向到文件
1. STDOUT 和STDERR 可以被重定向到文件
命令 操作符號 文件名
支持的操作符號包括:
> 把STDOUT 重定向到文件
2 > 把STDERR 重定向到文件
& > 把所有輸出重定向到文件
2. > 文件內容會被覆蓋
set - C 禁止將內容覆蓋已有文件, 但可追加
> | file 強制覆蓋
set + C 允許覆蓋
3. >> 原有內容基礎上,追加內容
4.2 > 覆蓋重定向錯誤輸出數據流
5.2 >> 追加重定向錯誤輸出數據流
6. 標準輸出和錯誤輸出各自定向至不同位置
COMMAND > / path/ to/ file. out 2 > / path/ to/ error. out
7. 合併標準輸出和錯誤輸出爲同一個數據流進行重定向
& > 覆蓋重定向
& >> 追加重定向
COMMAND > / path/ to/ file. out 2 > & 1 (順序很重要)
COMMAND >> / path/ to/ file. out 2 > & 1
8. ( ) :合併多個程序的STDOUT
( cal 2007 ; cal 2008 ) > all. txt
b. tr命令
tr 轉換和刪除字符
tr [ OPTION ] ... SET1 [ SET2 ]
選項:
- c –C -- complement:取字符集的補集
- d -- delete :刪除所有屬於第一字符集的字符
- s -- squeeze- repeats:把連續重複的字符以單獨一個字符表示
- t -- truncate- set1:將第一個字符集對應字符轉化爲第二字符集對應的字符
[ : alnum: ] :字母和數字
[ : alpha: ] :字母
[ : cntrl: ] :控制(非打印)字符
[ : digit: ] :數字
[ : graph: ] :圖形字符
[ : lower: ] :小寫字母
[ : print: ] :可打印字符
[ : punct: ] :標點符號
[ : space: ] :空白字符
[ : upper: ] :大寫字母
[ : xdigit: ] :十六進制字符
c. 從文件中導入STDIN
1. 使用 < 來重定向標準輸入
2. 某些命令能夠接受從文件中導入的STDIN
tr ‘a- z’ ‘A - Z ’< / etc/ issue
該命令會把/ etc/ issue中的小寫字符都轉換成大寫字符
3. tr –d abc < / etc/ fstab
刪除fstab文件中的所有abc中任意字符
4. cat > file
zjl
wangxiaochun
按ctrl+ d離開,可以使用文件來代替鍵盤的輸入
5. cat < file1 > file2
6. cat < file1 >> file1
d. 把多行發送給STDIN
使用“<< 終止詞”命令從鍵盤把多行重導向給STDIN
直到 終止詞 位置的所有文本都發送給STDIN
有時被稱爲就地文本(here documents)
mail - s "Please Call" admin@magedu. com << END
> Hi Wang
>
> Please give me a call when you get in . We may need
> to do some maintenance on server1.
>
> Details when you're on- site
> Zhang
> END
3. 使用管道
1. 管道(使用符號“| ”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
a. 將命令1 的STDOUT 發送給命令2 的STDIN ,命令2 的STDOUT 發送到命令3 的STDIN
b. STDERR 默認不能通過管道轉發,可利用2 > & 1 或 | & 實現
c. 最後一個命令會在當前shell進程的子shell進程中執行
d. 組合多種工具的功能
ls | tr ‘a- z’ ‘A - Z ’
2. less :一頁一頁地查看輸入
ls - l / etc | less
3. mail: 通過電子郵件發送輸入
echo "test email" | mail - s "test" wang@example. com
4. bc:算術運算
echo "2^3" | bc
5. 示例:
將 / home 裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到 stdout,
經過管道後,將 tar - cvf - / home 傳送給後面的 tar - xvf - , 後面的這個 - 則是取
前一個命令的 stdout, 因此,就不需要使用臨時file了
tar - cvf - / home | tar - xvf -
6. 命令1 | tee [ - a ] 文件名 | 命令2
把命令1 的STDOUT 保存在文件中,做爲命令2 的輸入
- a 追加
7. 使用:
保存不同階段的輸出
複雜管道的故障排除
同時查看和記錄輸出