1. 程式人生 > >grep,cut,wc,sort,diff,uniq,patch命令

grep,cut,wc,sort,diff,uniq,patch命令

文字處理工具:
	
	Linux上文字處理三劍客:
		grep,egrep,fgrep: 文字過濾工具(模式: pattern)工具;
			grep:基本正則表示式,-E,-F
			egrep:擴充套件正則表示式,-G,-F
			fgrep:不支援正則表示式,
		sed: stream editor,流編輯器;文字編輯工具;
		awk: Linux上實現為gawk,文字報告生成器(格式化文字);

		正則表示式:regual expression , regexp
			由一類特殊字元及文字字元所編寫的模式,其中有些字元不表示其字面意義,而是用於表示控制或通配的功能;
				分兩類:
					基本正則表示式:BRE
					擴充套件正則表示式:ERE

			元字元: \(hello[[:space:]]\+\)\+
	

grep: global search regular expression and print out the line
	作用: 文字搜尋工具,根據使用者指定的"模式(過濾條件)" 對目標文字逐個進行匹配檢查;列印匹配到的行;
	模式:由正則表示式的元字元及文字符所編寫出的過濾條件;

	正則表示式引擎:

	grep [option] pattern [file]
	grep [option] [-e pattern | -f file] [file...]

		options:
			--color=auto: 對匹配到的文字著色後高亮顯示;
			-i: ignorecase,忽略字元大小寫;
			-o: 僅顯示匹配到的字元本身;
			-v,--invert-match: 顯示不能被模式匹配到的行;
			-E: 支援使用擴充套件的正則表示式元字元;
			-q,quiet,--slience: 靜默模式,即不輸出如何資訊;

			-A # : after,在後#行
			-B # : before,在前#行
			-C # : context,前後各#行

		基本正則表示式元字元:
			字元匹配:
				.:匹配任意單個字元;
				[]:匹配指定範圍內的任意單個字元;
				[^]:匹配指定範圍外的任意單個字元;
					如:[:punct:],[:alpha:];[:alnum:]#文字數字字元;[:alpha:]#文字字元; 
			匹配次數:用在要指明其出現的次數的字元的後面,用於限制其前面字元出現的次數;預設工作於貪婪模式;
				*: 匹配其前面的字元任意次;0,1,多次;
					例如: grep "x*y"
						abxy
						aby
						xxxxy
				.*:	匹配任意長度的任意字元;
				\?: 0次或1次;
				\+: 1次或多次;
				\{m\}: m次;
				\{m,n\}: 至少m次,至多n次;

			位置錨定:
				^: 行首錨定;用於模式的最左側;
				$: 行尾錨定的最右側;
				^pattern$ : 用於pattern來匹配整行;
					^$: 空白行;
					^[[:space:]]*$: 空行或包含空白字元的行;
				單詞:非特殊字元組成的連續字元(字串)都稱為單詞;

				\< 或 \b : 詞首錨定;用於單詞模式左側;
				\> 或 \b : 詞尾錨定;用於單詞模式右側;
				\<pattern\>: 匹配完整單詞;

			練習:
				1. 顯示/etc/passwd檔案中不以/bin/bash結尾的行;
					[
[email protected]
~]# grep -v "/bin/bash$" /etc/passwd 2. 找出/etc/passwd檔案中的兩位數或三位數; [[email protected] ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd 3. 找出/etc/rc.d/rc.sysinit或 /etc/grub2.cfg檔案中,以至少一個空白字元開頭,且後面非空白字元的行; [[email protected] ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 4. 找出"netstat -tan"命令的結果中以'LISTEN'後跟0,1或多個空白符結尾的行; [
[email protected]
~]# netstat -tan | grep "LISTEN[[:space:]]*$" 分組及引用: \(\):將一個或多個字元捆綁在一起,當做一個整體進行處理; 如: \(xy\)*ab Note: 分組括號中的模式匹配到的內容會被正則表示式引擎自動記錄於內部變數中,這些變數為; \1: 模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字元; \2: 模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字元; \3 ... 如: he loves his lover. he likes his lover. she likes her liker. she loves her liker. ]# grep "\(l..e\).*\1" /PATH egrep: grep -E 支援擴充套件的正則表示式實現類似於grep文字過濾功能;grep -E grep [OPTIONS] PATTERN [FILE...] 選項: -i,-o,-v,-q,-G(基本正則表示式),-A,-B,-C 擴充套件正則表示式的元字元: 字元匹配: .:任意單個字元 []:指定任意範圍內的單個字元 [^]:指定範圍外的任意單個字元 次數匹配: *:其前字元任意次,即0,1或多次; ?:0次或1次,即其前字元是可有可無的; +:其前字元至少1次;1次及以上; {m}: {m,n}: {0,n} {m,} 位置錨定: ^:行首錨定 $:行尾錨定 \<,\b: \>,\b: 分組及引用: ():分組;括號的模式匹配到的字元會被記錄於正則表示式引擎的俄內部變數中; 後項引用;\1,\2,... 或 a|b:a或b C|cat: C或cat (c|C)at: cat 或 Cat 練習: 1.找出/proc/meminfo檔案中,所有在大小寫S開頭的行;至少有三種實現方式; [
[email protected]
~]# grep -E "^(s|S)" /proc/meminfo [[email protected] ~]# grep -E "^[sS]" /proc/meminfo [[email protected] ~]# grep "^[sS]" /proc/meminfo [[email protected] ~]# grep -i "^s" /proc/meminfo 2.顯示當前系統上root,centos或user1使用者的相關資訊; [[email protected] ~]# egrep "^(root|centos|user1)\>" /etc/passwd 3.找出/etc/rc.d/init.d/functions檔案中某個單詞後面跟一個小括號的行; [[email protected] ~]# grep -E "[[:alpha:]]+\(\)" /etc/rc.d/init.d/functions 4.使用echo命令輸出一絕對路徑,使用egrep取出基(路徑); [[email protected] ~]# echo /etc/sysconfig | egrep -o "[^/]+/?$" 5.找出ifconfig命令結果中的1-255之間的數值; [[email protected] ~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" 6.找出ifconfig命令結果中的IP地址;(有效ip地址:1.0.0.1--223.255.255.254) [[email protected] ~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>" 7.新增使用者bash,testbash,basher以及nologin(其shell為/sbin/nologin);而後找出/etc/passwd檔案中使用者名稱同shell名的行; [[email protected] ~]# cat /etc/passwd | egrep "^([^:]+\>).*\1$" [[email protected] ~]# egrep "^(\<[^:]+\>).*(\1)$" /etc/passwd fgrep: 不支援正則表示式元字元; 當無需要用到元字元去編寫時,使用fgrep必然更好; 文字檢視及處理工具:wc ,cut ,sort ,uniq , diff,patch wc: 單詞統計; wc [OPTION]... [FILE]... -l:lines行 -w:words字 -c:bytes位元組 -m:chars字元數,不可與-c同用 -L:列印最長行的長度 cut: 文字擷取 cut OPTION... [FILE]... -d CHAR: 以指定的字元為分隔符; -f FIELDS: 挑選出的欄位; # : 指定的單個欄位; #-#: 連續的多個欄位; #,#: 離散的多個欄位; sort: 排序 sort OPTION... [FILE]... -n:基於數值大小而非字元進行排序; -t CHAR:指定分隔符; -k#:用於排序比較的欄位; -r:逆序排序; -f:忽略字元大小寫 -u:重複內容只保留一次; 重複行:連續且相同; uniq: 報告或移除重複的行 uniq [OPTION]... [INPUT [OUTPUT]] -c: 統計顯示每一行出現的次數; -u: 僅顯示不重複的行; -d: 僅顯示重複的行; diff: 比較不同 diff [option]...FILES.. diff /PATH/oldfile /PATH/newfile > /PATH/PATH_file -u: 使用unfied 機制,即顯示要修改的行上下文,預設為3行; patch: 向檔案打補丁 patch [option] -i /PATH/PATH_file /PATH/oldfile patch /PATH/oldfile < /PATH/PATH_file 練習: 取出ifconfig命令結果中ip地址;