Linux命令之文本處理工具

Linux一切皆文件,因此對文本就會頻繁操作,增刪改查,也就有對文本處理的各種工具,下面介紹常用工具,以及各工具常用用法,常用案例等

一、文本的查看

1、cat -n 文件 加行號顯示文本
-E 文件 顯示回車符號
-A 文件 顯示文本所有字符 $表示換行, ^I表示tab ,^M表示回車(一般win系統文本才有)
-s 文件 當遇到有連續兩行以上的空白行,就代換為一行的空白行
-v windos上文本文件 顯示非打印”顯示控制字符除了LFD和標簽使用` ^”具有高位設置的符號和前面字符“m”
cat file1 file2 >file3 把兩個文件合并一個文件

舉例:


image.png

-n用法


image.png

-E用法
image.png

-A用法
這個類似-E,顯示多一些看不到的字符,ceshi.txt是在Windows下建立的文本


image.png

-s用法
image.png

-v用法
這個可以和-A結合理解記憶
image.png

用cat合并兩個文件
image.png

2、tac 文件 倒著顯示,是以行,顛倒顯示


image.png

3、echo 字符 | rev 反向顯示,是以列 左右倒著


image.png

4、less 分行顯示
more 分頁顯示
這兩個命令常用,一般和其它命令組合使用較多,比如查看很長的命令幫助文檔,需要分頁顯示查看


image.png

image.png

按空格向下翻頁查看

5、head -n 3 文件 顯示文件前三行
-c 20 文件 顯示頭部20個字符


image.png

6、tail -n3 文件 顯示文件后三行
-f 文件 動態觀察文件 用于觀察日志文件,監控文件
-F 文件 和f一樣,多了文件被刪除,會有提示


image.png

image.png

image.png

tailf類似tail -f
前者只在修改時監控掃描文件內容,不耗資源;后者頻繁掃描監控文件內容,耗資源,因此一般都會用tailf

7、cut 取出特定列
cut -d: -f1,3 文件 以冒號為分隔符,取出內容第一和第三列
-d 指明分隔符 默認以tab為分隔符
--output-delimiter=" " 取出的列,以什么字符隔開
-f1 取第一列 混合使用:f1-3,7 第一列到第三列和第七列
-c 字符切割 一般列比較整齊的使用


image.png

image.png

paste file1 file2 兩個文件 file1第幾行對應file2第幾行 左右對應顯示顯示
-s file1 file2 兩個文件 file1第幾行對應file2第幾行 上下對應顯示顯示


image.png
image.png

練習------常用案例:
ss -nt | tr -s " " : | grep ESTAB | cut -d: -f6 取出和我對話的IP


image.png

df | grep /dev/sd | tr -s " " % | cut -d% -f5 取出磁盤利用率信息


image.png

cat /etc/passwd | head -n5 | cut -d: -f1,3 | tr ":" "-" 取出用戶和UID


image.png

取當前主機指定網卡的IP:
ifconfig ens33 | grep netmask |tr -s " "| cut -d" " -f3 centos 7上


image.png

ifconfig eth0 | grep Mask |tr -s " " : | cut -d: -f4 centos 6上


image.png

生成指定位數的隨機口令:
cat /dev/urandom | tr -dc '[:alnum:]' | head -c30
openssl rand -base64 30 | head -c30


image.png

二、文本的統計-分析

1、wc 文件 顯示文件有幾行,幾個單詞,幾個字節
-l 文件 只統計行
-w 文件 只統計單詞
-c 文件 只統計字節
-m 文件 只統計字符 一個漢字是一個字符、三個字節
-L 文件 只統計最長行的長度

image.png

image.png

2、sort -nr -t: -k3 文件 取出以冒號分隔的第三列按數字反向排序
-n 按數字排序
-t 按什么分隔符
-k 哪一列排序
-r 反向排序
-u 刪除輸出重復行

image.png

image.png

3、uniq 文件 相鄰一樣的合并輸出顯示
-c 文件 顯示合并的字符有幾個同樣的
-u 文件 只顯示不重復的
-d 文件 只顯示重復的


image.png

練習------常用案例:
提取網站訪問日志文件訪問次數高的前十名
tr -s " " <access_log | cut -d" " -f1|sort |uniq -c | sort -n|tail

image.png

image.png

image.png

image.png

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


image.png

image.png

image.png

比較文件
4、diff file1 file2 比較文件內容不同
-u

image.png

通過差異存檔,可以恢復刪掉的文件
diff f3 f4 -u >f8
rm f4
patch -b f3 f8
注意:系統沒有裝patch命令的包,需要取手動裝一下
恢復的文件f4,會覆蓋了f3,f3內容是原f4內容,原f3會生成一個備份文件

image.png

image.png

image.png

image.png

三、文本處理三劍客

grep sed awk 這里主要講grep,其它兩個后面單獨一個命令寫一篇

1、grep 行搜索并篩選
egrep=grep -E
fgrep=grep -F

grep 關鍵字 文件或目錄
關鍵字可以是字符,可以是命令(用反向單引號扣起來命令),也可以引用變量(用雙引號括起來或者不用)
-v 反選包含關鍵字以外的行

image.png

-i 忽略關鍵字大小寫


image.png

-n 顯示包括關鍵字的行以及行號
-c 匹配到關鍵字的行,有幾行


image.png

-q 匹配到關鍵字的行,只是不顯示(這種用法,后面用到,用處:只想知道匹配到還是沒匹配到,匹配結果不關心)


image.png

-o 僅顯示匹配到的關鍵字


image.png

-A n 包含關鍵字行的后n行也顯示
-B n 包含關鍵字行的前n行也顯示
-C n 包含關鍵字行的前后各n行也顯示


image.png

-e 或關系,多個關鍵字篩選


image.png

-w 匹配關鍵字是一個詞,不是一部分,除了數字、字母、下劃線不可以作為單詞的分隔符,其它鍵盤字符都可以


image.png

四、正則表達式

基本正則表達式:BRE
擴展正則表達式:ERE
正則表達式匹配的是內容里字符串

元字符分類:

1、字符匹配
. 一個任意字符串
[] 任意單一的字符
[^] 排除
[:alnum:] 數字和字母
[:alpha:] 字母
[:space:] 空格
[:digit:] 數字
[:loewr:] 小寫字母
[:upper:] 大寫字母
[:blank:] 空白字符

2、匹配次數
* 星號前面字符重復任意次,包括零次
.* 任意字符
\? 匹配前面字符重復0次或1次
\+ 匹配前面字符至少一次以上
\{n\} 匹配前面字符n次
\{m,n\} 匹配前面字符至少m次,至多n次
\{,n\} 匹配前面字符至多n次
\{n,\} 匹配前面字符至少n次

正則表達式涉及符號最好用引號引起來,不然有時會當作通配符用了

image.png

這個當成通配符a* 搜索針對的是ls傳遞過來包含a的文件名
這個是正則表達式"a*" 搜索針對的是ls傳遞過來的內容

3、位子錨定
^ 以什么開頭的行 ^root
以什么結尾的行 bash
^$ 取空行
\< 詞首以什么字符的行 \ <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


image.png

image.png

image.png

image.png

搜索篩選兩個關鍵字包含的行 是或的關系
grep -e root -e wang /etc/passwd


image.png

判斷主版本號
grep -o "[[:digit:]]+" /etc/centos-release |head -n1


image.png

取函數名
grep -o "^[[:alnum:]_]+[[:space:]]*()" /etc/init.d/functions


image.png

image.png

image.png

函數都是在開頭,需要牟定行首


image.png

練習:
1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)
grep "^[Ss]" /proc/meminfo
grep -i "^s" /proc/meminfo


image.png

2、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "/bin/bash$" /etc/passwd


image.png

3、顯示用戶rpc默認的shell程序
grep "^rpc\>" /etc/passwd |cut -d: -f7


image.png

4、找出/etc/passwd中的兩位或三位數
grep -o "\b[0-9]{2,3\}\b" /etc/passwd


image.png

image.png

需要牟定詞首詞尾,否者這個也被匹配


image.png

image.png

5、顯示CentOS7的/etc/grub.conf文件中,至少以一個空白字符開頭的且后面存非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf


image.png

6、找出“netstat -tan”命令的結果中以‘LISTEN’后跟任意多個空白字符結尾的行
netstat -tna |grep "LISTEN[[:space:]]*$"


image.png

7、顯示CentOS7上所有系統用戶的用戶名和UID
cut -d: -f1,3 /etc/passwd |grep "\b[0-9]\{1,3\}$"


image.png

image.png

image.png

image.png

8、找出/etc/passwd用戶名同shell名的行
grep "^\(.*\):.*\<\1" /etc/passwd grep "^\\(.\*\\)\\>.\*\\b\1" /etc/passwd

image.png

9、利用df和grep,取出磁盤各分區利用率,并從大到小排序
df |grep "/dev/sd" |grep -o "\<[[:digit:]]\{1,3\}%" |grep -o "[[:digit:]]\{1,3\}" |sort -nr


image.png

10、顯示三個用戶root、mage、wang的UID和默認shell
grep -o "^\(root\|mage\|wang\)\>" /etc/passwd|cut -d: -f3,7


image.png

11、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
grep -o "^[[:alpha:]_]*()" /etc/rc.d/init.d/functions


image.png

12、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions" |egrep -o "[^/]+/?$" |egrep -o ".*[^/]"


image.png

13、使用egrep取出上面路徑的目錄名
echo "/etc/rc.d/init.d/functions/" |egrep -o "^/./" |egrep -o ".[^/]"

image.png

14、統計last命令中以root登錄的每個主機IP地址登錄次數
last | grep "^root" |tr -s " " -|cut -d- -f3 |sort| uniq -c


image.png

15、顯示ifconfig命令結果中所有IPv4地址
ifconfig ens33 |grep -o "([0-9]{1,3}.){3}[0-9]{1,3}" 點需要去轉義


image.png

精確匹配
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])"


image.png

16、將此字符串:welcome to magedu linux 中的每個字符去重并排序,重復次數多的排到前面
echo "welcome to magedu linux" | grep -o "[[:alpha:]]" |sort |uniq -c|sort -nr


image.png

17、用正則表達式表示出QQ號
[1-2][0-9]\{10\}
18、用正則表達式表示手機號
^1[3-9][0-9]\{9\}$

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文筆記源自這里——[實驗樓]歡迎大家在下面交流其中有問題的地方喜歡請點收藏,每日更新(全部已親自實踐). 一. ...
    東皇Amrzs閱讀 4,043評論 7 54
  • 第1章 小試牛刀 $ 是普通用戶,# 表示管理員用戶 root。 shebang:#!。sharp / hash ...
    巴喬書摘閱讀 6,417評論 1 4
  • 系統信息 arch 顯示機器的處理器架構(1)uname -m 顯示機器的處理器架構(2)uname -r 顯示正...
    jsondream閱讀 558評論 4 13
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,219評論 2 33
  • 如平常一樣,我起了個大早,神情恍惚地把朋友送我的面煮了,大概是國外的面我不太習慣,沒煮熟,再加上調味料很...
    七月與小黑閱讀 295評論 1 1