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 
	9d8
	< banana
	  //diff命令後面,第一個文件有9行,第二個文件有8行,<表示右邊文件內容缺失
	
	shell> echo "cherry" >>shuiguo.txt 
	shell> diff fruit.txt shuiguo.txt 
	9c9
	< banana
	---
	> cherry
	  //diff命令後面,兩個文件都是9行,<右邊文件缺失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 
  //copy文件沒有內容差異
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 
1a2
> changqing
3a5
> 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 
1a2
> changqing
3a5
> 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> 外層打補丁
//如果qq-v1和qq-v2在相同目錄下,就不需要去掉一層路徑
[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.STDOUTSTDERR可以被重定向到文件

	命令 操作符號 文件名
	 支持的操作符號包括:
	>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.將命令1STDOUT發送給命令2STDIN,命令2STDOUT發送到命令3STDIN
	b.STDERR默認不能通過管道轉發,可利用2>&1|& 實現
	c.最後一個命令會在當前shell進程的子shell進程中執行
	d.組合多種工具的功能
		ls | tr ‘a-z’ ‘A-Z2.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
	把命令1STDOUT保存在文件中,做爲命令2的輸入
	-a 追加
7.使用:
	保存不同階段的輸出
	複雜管道的故障排除
	同時查看和記錄輸出

發佈了18 篇原創文章 · 獲贊 10 · 訪問量 7791
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章