Linux一切皆文件,因此對文本就會頻繁操作,增刪改查,也就有對文本處理的各種工具,下面介紹常用工具,以及各工具常用用法,常用案例等
一、文本的查看
1、cat -n 文件 加行號顯示文本
-E 文件 顯示回車符號
-A 文件 顯示文本所有字符 $表示換行, ^I表示tab ,^M表示回車(一般win系統文本才有)
-s 文件 當遇到有連續兩行以上的空白行,就代換為一行的空白行
-v windos上文本文件 顯示非打印”顯示控制字符除了LFD和標簽使用` ^”具有高位設置的符號和前面字符“m”
cat file1 file2 >file3 把兩個文件合并一個文件
舉例:
-n用法
-E用法
-A用法
這個類似-E,顯示多一些看不到的字符,ceshi.txt是在Windows下建立的文本
-s用法
-v用法
這個可以和-A結合理解記憶
用cat合并兩個文件
2、tac 文件 倒著顯示,是以行,顛倒顯示
3、echo 字符 | rev 反向顯示,是以列 左右倒著
4、less 分行顯示
more 分頁顯示
這兩個命令常用,一般和其它命令組合使用較多,比如查看很長的命令幫助文檔,需要分頁顯示查看
按空格向下翻頁查看
5、head -n 3 文件 顯示文件前三行
-c 20 文件 顯示頭部20個字符
6、tail -n3 文件 顯示文件后三行
-f 文件 動態觀察文件 用于觀察日志文件,監控文件
-F 文件 和f一樣,多了文件被刪除,會有提示
tailf類似tail -f
前者只在修改時監控掃描文件內容,不耗資源;后者頻繁掃描監控文件內容,耗資源,因此一般都會用tailf
7、cut 取出特定列
cut -d: -f1,3 文件 以冒號為分隔符,取出內容第一和第三列
-d 指明分隔符 默認以tab為分隔符
--output-delimiter=" " 取出的列,以什么字符隔開
-f1 取第一列 混合使用:f1-3,7 第一列到第三列和第七列
-c 字符切割 一般列比較整齊的使用
paste file1 file2 兩個文件 file1第幾行對應file2第幾行 左右對應顯示顯示
-s file1 file2 兩個文件 file1第幾行對應file2第幾行 上下對應顯示顯示
練習------常用案例:
ss -nt | tr -s " " : | grep ESTAB | cut -d: -f6 取出和我對話的IP
df | grep /dev/sd | tr -s " " % | cut -d% -f5 取出磁盤利用率信息
cat /etc/passwd | head -n5 | cut -d: -f1,3 | tr ":" "-" 取出用戶和UID
取當前主機指定網卡的IP:
ifconfig ens33 | grep netmask |tr -s " "| cut -d" " -f3 centos 7上
ifconfig eth0 | grep Mask |tr -s " " : | cut -d: -f4 centos 6上
生成指定位數的隨機口令:
cat /dev/urandom | tr -dc '[:alnum:]' | head -c30
openssl rand -base64 30 | head -c30
二、文本的統計-分析
1、wc 文件 顯示文件有幾行,幾個單詞,幾個字節
-l 文件 只統計行
-w 文件 只統計單詞
-c 文件 只統計字節
-m 文件 只統計字符 一個漢字是一個字符、三個字節
-L 文件 只統計最長行的長度
2、sort -nr -t: -k3 文件 取出以冒號分隔的第三列按數字反向排序
-n 按數字排序
-t 按什么分隔符
-k 哪一列排序
-r 反向排序
-u 刪除輸出重復行
3、uniq 文件 相鄰一樣的合并輸出顯示
-c 文件 顯示合并的字符有幾個同樣的
-u 文件 只顯示不重復的
-d 文件 只顯示重復的
練習------常用案例:
提取網站訪問日志文件訪問次數高的前十名
tr -s " " <access_log | cut -d" " -f1|sort |uniq -c | sort -n|tail
ss -nt 查詢并發連接的遠程IP最多的前三個IP
ss -nt | grep ESTAB | tr -s " " :|cut -d: -f6|sort|uniq -c|sort -nr |head -3|tr -s " " | cut -d" " -f3
比較文件
4、diff file1 file2 比較文件內容不同
-u
通過差異存檔,可以恢復刪掉的文件
diff f3 f4 -u >f8
rm f4
patch -b f3 f8
注意:系統沒有裝patch命令的包,需要取手動裝一下
恢復的文件f4,會覆蓋了f3,f3內容是原f4內容,原f3會生成一個備份文件
三、文本處理三劍客
grep sed awk 這里主要講grep,其它兩個后面單獨一個命令寫一篇
1、grep 行搜索并篩選
egrep=grep -E
fgrep=grep -F
grep 關鍵字 文件或目錄
關鍵字可以是字符,可以是命令(用反向單引號扣起來命令),也可以引用變量(用雙引號括起來或者不用)
-v 反選包含關鍵字以外的行
-i 忽略關鍵字大小寫
-n 顯示包括關鍵字的行以及行號
-c 匹配到關鍵字的行,有幾行
-q 匹配到關鍵字的行,只是不顯示(這種用法,后面用到,用處:只想知道匹配到還是沒匹配到,匹配結果不關心)
-o 僅顯示匹配到的關鍵字
-A n 包含關鍵字行的后n行也顯示
-B n 包含關鍵字行的前n行也顯示
-C n 包含關鍵字行的前后各n行也顯示
-e 或關系,多個關鍵字篩選
-w 匹配關鍵字是一個詞,不是一部分,除了數字、字母、下劃線不可以作為單詞的分隔符,其它鍵盤字符都可以
四、正則表達式
基本正則表達式:BRE
擴展正則表達式:ERE
正則表達式匹配的是內容里字符串
元字符分類:
1、字符匹配
. 一個任意字符串
[] 任意單一的字符
[^] 排除
[:alnum:] 數字和字母
[:alpha:] 字母
[:space:] 空格
[:digit:] 數字
[:loewr:] 小寫字母
[:upper:] 大寫字母
[:blank:] 空白字符
2、匹配次數
* 星號前面字符重復任意次,包括零次
.* 任意字符
\? 匹配前面字符重復0次或1次
\+ 匹配前面字符至少一次以上
\{n\} 匹配前面字符n次
\{m,n\} 匹配前面字符至少m次,至多n次
\{,n\} 匹配前面字符至多n次
\{n,\} 匹配前面字符至少n次
正則表達式涉及符號最好用引號引起來,不然有時會當作通配符用了
這個當成通配符a* 搜索針對的是ls傳遞過來包含a的文件名
這個是正則表達式"a*" 搜索針對的是ls傳遞過來的內容
3、位子錨定
^ 以什么開頭的行 ^root
^$ 取空行
\< 詞首以什么字符的行 \ <r
\> 詞尾以什么字符的行 r\>
\<\> 匹配單詞 \<root\>
\ 轉義符
4、分組
\(\) 將一個或多個字符當作一個整體取處理,這就需要用到分組 (root)
\| 或者 a\|b a或者b \(A\|a\)b Ab或ab
echo axx bxx cxx | grep “\(a\|b\|c\)xx”
\n 后項引用,調用前面第n個括號里的正則表達式
例如:\(a..b\).*\(x..y\).*\1.*\2* 所以:\1=\(a..b\) \2=\(x..y\)
練習-----常用案例
掃描網段在用的IP,使用-B的的場景用法
-sP:ping掃描,僅發現目標主機是否存活
nmap -v -sP 172.18..2.0/24 | grep -B1 up | grep report | cut -d" " -f5
搜索篩選兩個關鍵字包含的行 是或的關系
grep -e root -e wang /etc/passwd
判斷主版本號
grep -o "[[:digit:]]+" /etc/centos-release |head -n1
取函數名
grep -o "^[[:alnum:]_]+[[:space:]]*()" /etc/init.d/functions
函數都是在開頭,需要牟定行首
練習:
1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)
grep "^[Ss]" /proc/meminfo
grep -i "^s" /proc/meminfo
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "/bin/bash$" /etc/passwd
3、顯示用戶rpc默認的shell程序
grep "^rpc\>" /etc/passwd |cut -d: -f7
4、找出/etc/passwd中的兩位或三位數
grep -o "\b[0-9]{2,3\}\b" /etc/passwd
需要牟定詞首詞尾,否者這個也被匹配
5、顯示CentOS7的/etc/grub.conf文件中,至少以一個空白字符開頭的且后面存非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf
6、找出“netstat -tan”命令的結果中以‘LISTEN’后跟任意多個空白字符結尾的行
netstat -tna |grep "LISTEN[[:space:]]*$"
7、顯示CentOS7上所有系統用戶的用戶名和UID
cut -d: -f1,3 /etc/passwd |grep "\b[0-9]\{1,3\}$"
8、找出/etc/passwd用戶名同shell名的行
grep "^\(.*\):.*\<\1" /etc/passwd
9、利用df和grep,取出磁盤各分區利用率,并從大到小排序
df |grep "/dev/sd" |grep -o "\<[[:digit:]]\{1,3\}%" |grep -o "[[:digit:]]\{1,3\}" |sort -nr
10、顯示三個用戶root、mage、wang的UID和默認shell
grep -o "^\(root\|mage\|wang\)\>" /etc/passwd|cut -d: -f3,7
11、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
grep -o "^[[:alpha:]_]*()" /etc/rc.d/init.d/functions
12、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions" |egrep -o "[^/]+/?$" |egrep -o ".*[^/]"
13、使用egrep取出上面路徑的目錄名
echo "/etc/rc.d/init.d/functions/" |egrep -o "^/./" |egrep -o ".[^/]"
14、統計last命令中以root登錄的每個主機IP地址登錄次數
last | grep "^root" |tr -s " " -|cut -d- -f3 |sort| uniq -c
15、顯示ifconfig命令結果中所有IPv4地址
ifconfig ens33 |grep -o "([0-9]{1,3}.){3}[0-9]{1,3}" 點需要去轉義
精確匹配
ifconfig ens33 |egrep -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
16、將此字符串:welcome to magedu linux 中的每個字符去重并排序,重復次數多的排到前面
echo "welcome to magedu linux" | grep -o "[[:alpha:]]" |sort |uniq -c|sort -nr
17、用正則表達式表示出QQ號
[1-2][0-9]\{10\}
18、用正則表達式表示手機號
^1[3-9][0-9]\{9\}$