3.1 cat:合並文件或查看文件內容


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM