cat 命令
可以理解為英文單詞concatenate的縮寫,其功能是連接多個文件並且打印到屏幕輸出,或者重定向到指定的文件中。此命令常用來顯示單個文件內容,或者將幾個文件內容連接起來一起顯示,還可以從標准輸入中讀取內容並顯示,生產環境中它常與重定向或追加符號配合使用。
cat命令的記憶方法:cat的中文意思是貓,可理解為“瞄”一下文件內容,即顯示文件內容。cat具備5大常用功能,特整理為如表3-1所示。
1.查看文件內容 例如:cat file.txt,這是cat最基本的功能之一 2.把多個文件合並成一個 例如:cat filel.txt file2.txt > newfile.txt 3.創建編輯新文件 例如:輸入cat>filel.txt,后面接要編輯的內容,使用快捷鍵Ctrl+d或Ctrl+c可結束編輯,此功能應用不多,了解即可 4.非交互式的編輯或追加內容到文件尾部 這是生產工作中最重要的一個應用了,所以必須要熟練掌握,這里先給一個命令格式: cat>>file.txt<<EOF I love linux EOF 5.清空文件內容 例如:使用cat /dev/null>file.txt命令就可以把文件內容清空,但是文件還是存在的, 這個功能生產工作中也會用到
cat命令的參數選項及說明
-n 從1開始對所有輸出的內容按行編號
-b 和-n選項功能類似,但會忽略顯示空白行行號
-s 當遇到有連續兩行以上的空白行時,就替換為一行空白行
-A 等價於-vET三個選項的功能之和
-e 等價於-vE
-E 在每一行的行尾顯示$符號
-t 與-vT等價
-T 將Tab字符顯示為1
-v 除了LFD和TAB之外,使用^和M-引用
執行如下的完整命令生成cat.txt文件內容
cat >cat.txt<<EOF welcome to learn linux love linux forever EOF #<==這里要按回車才能結束,另外,EOF必須成對出現,但也可以用別的成對標簽來替換。例如:lewen字符標簽,默認情況下,結尾的EOE必須要頂格寫。 cat >cat.txt<<-EOF #<==如果cat后面使用了-符號,則結尾的EOF可以不用頂格,但要用tab縮進。 welcome to learn linux love linux forever,my blog\'s site is http://www.wenyule.top EOF 執行過程 [root@cs6-mini ~]# cat >cat.txt<<EOF > > > welcome to learn linux > > love linux forever,my blog\'s site is http://www.wenyule.top > > >bye > EOF
直接執行cat命令,不帶任何選項。
[root@cs6-mini ~]# cat cat.txt welcome to learn linux love linux forever,my blog\'s site is http://www.wenyule.top bye
執行cat命令,分別帶-n及-b選項,並對比區別
[root@cs6-mini ~]# cat -n cat.txt 1 2 3 welcome to learn linux 4 5 love linux forever,my blog\'s site is http://www.wenyule.top 6 7 8 bye [root@cs6-mini ~]# cat -b cat.txt 1 welcome to learn linux 2 love linux forever,my blog\'s site is http://www.wenyule.top 3 bye
-b選項和-n選項類似,但是,-b選項並不對空行編號。
執行cat命令,帶-E選項
[root@cs6-mini ~]# cat -E cat.txt $ $ welcome to learn linux$ $ love linux forever,my blog\'s site is http://www.wenyule.top$ $ $ bye$ #<=說明:從上面的例子可以看出,-E選項就是把文件結尾的隱藏結束標識符$符號顯示出來。即使是空行,結尾也是有結束標識符的,這一點大家要注意
這個小例子更好地說明了即使是空行結尾也是有標識符S的。因此,在計算文件占用空間時,要注意這點。
-A(-vET),-e(-vE)這兩個選項都包含-E選項,因此,其和-E的功能類似,但-v、-T這兩個選項在工作中使用得不多,了解一下就好了。
[root@cs6-mini ~]# cat -A cat.txt $ $ welcome to learn linux$ $ love linux forever,my blog\'s site is http://www.wenyule.top$ $ $ bye$ [root@cs6-mini ~]# cat -e cat.txt $ $ welcome to learn linux$ $ love linux forever,my blog\'s site is http://www.wenyule.top$ $ $ bye$
執行cat 命令,帶-s選項
[root@cs6-mini ~]# cat -s cat.txt welcome to learn linux love linux forever,my blog\'s site is http://www.wenyule.top #由於-s選項的原因,變成一個空行了。 bye
從上面的例子可以看出,-s選項就是把兩個以上的空行變成一個空行,如果文件中連續的空行有很多,那么這個選項可以讓文件顯示得更加精煉易讀。
但是在實際生產工作中,我們還是習慣於使用grep -v "^S" cat.txt 過濾掉所有的空行(一個空行都不留),從而使得顯示更加緊湊一些.
[root@cs6-mini ~]# grep -v "^$" cat.txt welcome to learn linux love linux forever,my blog\'s site is http://www.wenyule.top bye
執行cat命令編輯新文件
[root@cs6-mini ~]# cat > cat.txt hi,here is linux os [root@cs6-mini ~]# cat cat.txt hi,here is linux os
這里是利用cat和“>”重定向將標准輸出定向到文件的,這是一個特殊的編輯文件的方法。這里有幾個問題需要注意,具體如下。
結束編輯可以用快捷鍵Ctrl+d或Ctrl+c退出,但是必須要先執行回車,將光標定位到新的未輸入的行才行。
使用此種方式輸入時,會發現如果輸入錯了,只按退格鍵(Backspace)將會無法刪除,需要按住“Ctrl+退格鍵”才能刪除。
此操作為特殊編輯方法,作為擴展知識點提及,實際生產環境中使用得很少。
執行cat命令連接並顯示多個文件
[root@cs6-mini ~]# cat test1.txt test2.txt test1 file test2 file
這樣兩個文件會一起顯示,但還是有先后順序的,前面的test.txt的內容會優先顯示。
利用cat實現一鍵優化Linux系統腳本
這是使用cat命令實現非交互式地在文件結尾增加內容的功能。下面的優化腳本是批量修改配置文件的方法,是生產環境中經常會用到的用法,要熟練掌握才好。
下面以一鍵優化腳本中的一部分Linux服務器內核選項為例來說明cat的功能。
所謂內核優化,主要是在Linux系統中針對業務服務應用而進行的系統內核選項優化,優化並無特殊的標准,下面就以常見的生產環境Linux的內核優化為例進行講解,僅供大家參考。
#!/bin/bash /bin/cp /etc/sysctl.conf /etc/sysctl.conf.'date +%F_%T' #<==備份 sysctl.conf cat>>/etc/sysctl.conf<<EOF #<修改sysctl.conf #added by lewen at 2019 start net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384 net.ipv4.tcp_max_orphans = 16384 #end EOF sysctl -p &>/dev/null #<==加載sysctl.conf [root@cs6-mini ~]# vim opt_sysctl.sh [root@cs6-mini ~]# sh opt_sysctl.sh [root@cs6-mini ~]# tail -16 opt_sysctl.sh net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384 net.ipv4.tcp_max_orphans = 16384 #end EOF sysctl -p &>/dev/null #<==加載sysctl.conf
利用cat在腳本中顯示幫助菜單
[root@cs6-mini scripts]# cat exportfs_usage.sh #!/bin/bash exportfs_usage() { cat <<END USAGE:$0 {start|stop|monitor|status|validate-all} END } exportfs_usage [root@cs6-mini scripts]# sh exportfs_usage.sh USAGE:exportfs_usage.sh {start|stop|monitor|status|validate-all}
這里的cat命令可以用echo命令來代替,對於單行的內容顯示和追加內容,使用echo命令是非常合適的,cat的優勢是針對多行文本內容進行編輯,或者在已有內容的結尾追加新內容。
利用cat在腳本中顯示內容選擇菜單
[root@cs6-mini scripts]# cat menu.sh #!/bin/bash menu(){ cat <<END 1.[apple] 2.[pear] 3.[banana] 4.[cherry] 5.[orange] please select one that you like: END } menu [root@cs6-mini scripts]# sh menu.sh 1.[apple] 2.[pear] 3.[banana] 4.[cherry] 5.[orange] please select one that you like:
為了實現自動化運維,有時高級運維人員不得不通過腳本把操作寫好,然后讓組內的初級運維或非運維的同事,通過傻瓜式的菜單選擇,來完成相應的工作,進而提升工作效率。
上面的腳本,從美感的角度來看,還是有些缺陷的。比如:
改進后的腳本
[root@cs6-mini scripts]# cat menu.sh #!/bin/bash menu(){ cat <<-END 1.[apple] 2.[pear] 3.[banana] 4.[cherry] 5.[orange] please select one that you like: END } menu [root@cs6-mini scripts]# sh menu.sh 1.[apple] 2.[pear] 3.[banana] 4.[cherry] 5.[orange] please select one that you like:
利用cat連接多文件合並Web集群日志
在工作中,前端通常會有多個集群服務器節點,這時服務器記錄日志都是在本地記錄的,因此,完整的日志是所有服務器的日志總和。在Web節點把日志推到日志平台后,首先要做的就是對所有節點當天或者當小時的日志進行合並,這時就可以用cat的多文件功能,當然這不是必須的,還有別的方法,這里暫略,僅講解cat的生產應用。
合並Web集群節點日志的命令如下:
cat web01_access20130522.log log_web02access_20130522.log > web_access20130522.log cat web_access20130522.log
上面用cat合並后的總日志文件的日志行並沒有按照用戶訪問的時間進行排序,若要按訪問時間進行排序,就要用到sort命令(請看后文詳解)了,它可以讓日志按第4列訪問時間列進行排序,整個處理方法如下:
sort -k 4 web_access2010128.log #<==-k指定排序列,這里表示按第4列排序。
利用cat 命令實現一鍵MySQL主從同步
在進行MySQL主從同步時,最關鍵的步驟就是CHANGE MASTER..命令的使用了,如果希望非交互式地執行CHANGE MASTER..命令的完整選項配置,那么下面的命令就是最合適的了。
以下是特殊生產場景下的應用,MySQL將自動批量制作主從同步所需要的語句。
cat |mysql -uroot -p'oldboy'<<EOF CHANGE MASTER TO MASTER_HOST='10.0.0.16' MASTER_PORT=3306, MASTER_USER='lewenrep', MASTER_PASSWORD='lewenrep', MASTER_LOG_file='mysql-bin.000025', MASTER_LOG_POS=4269; EOF