張賀,多年互聯網工做經驗,擔任過網絡工程師、系統集成工程師、LINUX系統運維工程師,負責過大規模集羣架構自動化運維管理工做,擅長Web集羣架構與自動化運維,曾負責國內某電商運維工做。linux
文本處理最厲害的工具是文本處理」三劍客」(grep、sed、awk),必定要用的熟練,三劍客像是三本一流劍譜:太極劍法(變化無窮,用意不用力)、辟邪劍法(惟快不破)、獨孤九劍(破解天下一切武功)。shell
三種劍法皆屬於一流劍法,可是面對小嘍囉的時候範不上用這種高深的武功,都無需拔劍,用一些江湖流傳的螳螂拳、八卦掌、炮錘足矣!vim
文件處理類export PS1='[\[\e[32;1m\]\u@\[\e[33;1m\]\H\[\e[34;1m\] \W\[\e[0m\]]\$' PS1="\[\e[31;1m\][\[\e[37;1m\]\A\[\e[36;1m\]\u@\[\e[32;1m\]\H \w\[\e[31;1m\]]\[\e[33;1m\]# \[\e[0m\]"
效果以下:windows
如需持久生效可根據需求將其寫入到家目錄和./bashrc下或/etc/bashrc文件centos
discription:word count緩存
wc [option]… [file]…bash
–l:lines -w:words -c:bytes
[root@N2 ~]# cat test.txt abxy cab abc hello ha [root@N2 ~]# wc test.txt 4 5 22 test.txt [root@N2 ~]# wc -l test.txt 4 test.txt [root@N2 ~]# wc -w test.txt 5 test.txt [root@N2 ~]# wc -c test.txt 22 test.txt
-d:指定分隔符,只能指定一個,awk能夠指定多個服務器
-f:挑選字段網絡
#單個字段 #-#:連續多個字段 #,#:離散的多個字段
[root@N2 ~]# cut -d: -f1,3 /etc/passwd | head -3 root:0 bin:1 daemon:2
sort [OPTION]... [FILE]...session
-n:基於數據大小而字符進行排序,默認是根據字符排序 -t:指定分隔符 -k #:指定用於比較的字段 -r:逆序排序 -f忽略字符大小寫 -u:重複的行只保留一份,重複行是指連續且相同
//顯示/passwd當中Uid最大的那個用戶 sort -n -t":" -k3 /etc/passwd | tail -1 | awk -F":" '{if(NR=1)print $1}' nfsnobody //顯示passwd當中uid最大的用戶名 sort -n -r -t":" -k3 /etc/passwd | tail -1 | awk -F":" '{if(NR=1)print $1}' root //取出/etc/passwd文件第6行到第10行,並將這些信息按照第三個字段大小進行排序,最後僅顯示uid最大的用戶名: head -10 /etc/passwd|tail -4|sort -n -t: -k3|tail -1|cut -d: -f1 uucp sed -n "6,10p" /etc/passwd | sort -n -t: -k 3 | tail -1|cut -d ":" -f1 uucp
uniq:報告或移除重複的行
-c:顯示每行的重複次數
-u:僅顯示不曾重複過的行
-d:僅顯示重複過的行
[root@N2 ~]# cat test.txt abxy abxy cab abc hello ha //顯示重複的次數 [root@N2 ~]# uniq -c test.txt 2 abxy 1 cab 1 abc 1 hello ha //去除重複的行 [root@N2 ~]# uniq test.txt abxy cab abc hello ha //顯示不重複的行 [root@N2 ~]# uniq -u test.txt cab abc hello ha //僅顯示重複過的行 [root@N2 ~]# uniq -d test.txt abxy //統計經常使用命令的top3,先把序號去掉,而後根據首字母排序,再顯示次數,根據次數再排序,取出top3 history | awk '{print $2}' | sort | uniq -c | sort -nr | head -3
[root@N2 ~]# cp /etc/fstab ./fstab.new [root@N2 ~]# vim ./fstab.new [root@N2 ~]# diff /etc/fstab ./fstab.new 5a6 #在第五行下面add了一行,變成了第6行 > zhanghe [root@N2 ~]# diff /etc/fstab ./fstab.new 3c3 #第三行被change了 < # /etc/fstab #舊文件第三行本來是這樣的 --- > # /etc/fstabzhanghe #新文件變成了這樣
替換不加選項
刪除顯示內容時才使用-d
//把/etc/passwd裏面的冒號全都替換成空格 [root@N2 ~]# tr ':' ' ' < /etc/passwd //將小寫所有替換成大寫 [root@N2 ~]# tr 'a-z' 'A-Z' < /etc/passwd //將echo傳遞的內容裏面的a刪除 [root@N2 ~]# echo zhanghe | tr -d a zhnghe
取得一個文件的基名
[root@zhanghe ~]# basename /tmp/test.txt test.txt
在腳本當中咱們可使用basename $0來取得腳本自己的名字,這樣不用手動輸入,並且若是腳本名要修改了,裏面的路徑是不用修改的,很是的方便。
[root@zhanghe ~]# vim test.sh basename $0 [root@zhanghe ~]# /bin/bash test.sh test.sh文件查看類
-d;只顯示目錄 -L:level,指定顯示的層級數目 -p :pattern,只顯示由指定pattern匹配到的路徑
查看文件裏面存儲的什麼內容
[root@N2 ~]# file /etc/passwd /etc/passwd: ASCII text [root@N2 ~]# file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
//默認查看前10行 head file…… //指定查看前多少行 head -4 file……
4.15 tail
tail [OPTON]…[FILE]…
-n #:指定獲取後#行
-#
-f;跟蹤顯示文件追加的內容
用這個命令查看新添加的用戶是好的
tail –f
能夠監視這個文件的變化,當你tail –f FILE
的時候,顯示完成後並不會退出,而是一直處於這個文件內,若是哪一個用戶在這個編輯這個文件的話,顯示的這邊馬上就會顯示。經常使用於監控日誌文件。
-n, --number
cat的意思是鏈接並顯示
-E 是查看文件尾部的鏈接符,咱們linux尾部是$符,而windows尾部是$加上空格,因此linux的文件放到windows上顯示每每都是顯示一行,而windows的文件放到linux上有進都顯示不出來。
-A 是顯示出全部的符號
cat –n對文本行編號顯示
最好玩的是cat也能夠反過來寫,反過來寫就是倒着顯示
有人說cat每每只能查看小文件,其實否則,它是能夠翻頁的,按着shift+pgdn/pgup。
[root@zhanghe ~]# cat /etc/passwd /etc/shadow /etc/fstab
能夠顯示多個文件的內容
man實際上就是調用的less,用法與man同樣,經常使用。
-N顯示行號
G回到文檔尾部
1G回到文檔首部
使用jK兩個鍵就能夠進行行間的查看
其它[root@N2 ~]# date +%Y-%m-%d-%H-%M-%S 2020-02-17-21-14-07
[root@zabbix backup]# date +%F #總體年月日 2017-11-23 [root@zabbix backup]# date +%T #總體時分秒 00:19:48 [root@zabbix backup]# date +%F 2017-11-23 [root@zabbix backup]# date +%Y #僅顯示年,小寫的Y僅僅顯示17,而不顯示20 2017 [root@zabbix backup]# date +%m #僅顯示月 11 [root@zabbix backup]# date +%d #僅顯示日 23
[root@zabbix backup]# date +%T #規律:時分秒皆大寫,年月日皆小寫 00:26:09 [root@zabbix backup]# date +%H#僅顯示時 00 [root@zabbix backup]# date +%M#僅顯示分 26 [root@zabbix backup]# date +%S#僅顯示秒 21
查看星期:
[root@zabbix ~]# date +%A Friday [root@zabbix ~]# date +%a Fri
更改時間:
[root@zabbix ~]# man date | grep "]]$" #先把格式過濾出來 date [-u|--utc|--universal] [M MDDhhmm[[CC]YY][.ss]] [root@zabbix ~]# date 080808082008.00 #把系統時間調整爲八月八日八時八分二零零八.零零秒
值得注意的是系統一啓動的會讀取芯片上時間,一旦讀取成功,內核會本身模擬一個時鐘就再也不使用芯片時間,因此因爲內核繁忙可能兩個時間會不同。兩個時間都不是最精確的,有些公司專門作時間服務。當系統啓動以後首先從硬件中讀取時間 ,而後就本身模擬時鐘進行工做,通常咱們winosws的電腦上都有時間服務器,會自動去服務器上對時。
-n禁止自動添加換行符號
-e容許使用轉義符
\n換行
\t製表符
echo 「$VAR_NAME」變量會替換,雙引號表弱引用
echo ‘$VAR_NAME’變量不會替換,強引用
[root@N2 ~]# echo -n zh zh[root@N2 ~]# echo -e "zhanghe\nzhangjia\tzhangweiwei" zhanghe zhangjia zhangweiwei
內部命令就是shell自帶的命令,外部命令是某個路徑下的執行程序。
外部命令的執行依賴於PATH變量,這個變量是用戶一登錄系統就準備好的,用戶的執行的命令都去這個裏面尋找。(windows系統中也是有環境變量的)
查看PATH變量:
[root@zhanghe ~]# echo $PATH 3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:
查看命令是內部命令仍是外部命令用:type 命令,若是顯示某個路徑表示是這個外部命令,若是顯示「cd is a shell builtin」表示這是個內部命令。
[root@zhanghe ~]# type -a ls ls is aliased to `ls --color=auto' ls is /bin/ls [root@zhanghe ~]# type -a cd cd is a shell builtin
shutdown –r 重啓
shutdown –h 關機
shutdown –c 取消關機或者重啓
TIME:
now: shutdown –r now 如今重啓
+m: shutdown –h +3 三分鐘之後關機
hh:mm :shutdown –h 08:08 八點八分之後關機
當咱們在交互式接口中輸入命令回車,意味着告訴交互式接口把我輸入的命令所對應的執行程序代碼找到,並由其分析後提交給內核並運行起來,運行起來的程序表現爲一個或多個進程。
當咱們第一次使用某個命令的時候,會從$PATH變量中查找路徑,查找到以後變緩存到hash裏面,之後再使用這個命令的時候就不會從$PATH變量裏面再找了,直接去hash裏面查找路徑。
當咱們第一次使用某個命令的時候,終端會去查找$PATH裏面的路徑,查找到了以後會緩衝到hash裏面,hash能夠理解成內存中的一段空間。
hash的優先級是比PATH變量的優先級要高的,若是在hash中的有記錄,可是記錄錯誤,真正使用的時候也會報錯的,出現這種狀況就要清空緩存,help hash,hash –r清除所有緩存。
[root@N2 ~]# uname -r 3.10.0-957.el7.x86_64 [root@N2 ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@N2 ~]# uname -a Linux n9 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [root@N2 ~]# hostnamectl status Static hostname: n9 Pretty hostname: N9 Icon name: computer-vm Chassis: vm Machine ID: 0b6b6e96ae154bb8a1bc2593538fbefb Boot ID: 61da47b868d14d78a7fd3f03236484c5 Virtualization: vmware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-957.el7.x86_64 Architecture: x86-64
顯示命令對應的程序文件路徑
which [OPTION]COMMAND
--skipi-alias禁止顯示別名
[root@N2 ~]# which --skip-alias ls /usr/bin/ls
whoami :顯示當前登陸的有效用戶
who;系統當前全部的登陸會話
w:系統當前全部的登陸會話及所作的操做
[root@N2 ~]# whoami root [root@N2 ~]# who root pts/0 2020-02-17 18:29 (192.168.80.6) root pts/1 2020-02-17 19:40 (192.168.80.6) [root@N2 ~]# w 21:05:27 up 8:49, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.80.6 18:29 7.00s 0.27s 0.00s w root pts/1 192.168.80.6 19:40 1:24m 0.00s 0.00s -bash可選命令
任何文件都由元數據和數據組成,使用stat查看文件的時間戳
三個時間戳:
access time :訪問時間,簡寫atime,讀取文件內容
modify time:修改時間,mtime,改變文件內容(數據)
chage time:改變時間,ctime,元數據發生改變(對數據的描述)
touch的主要做用是更改時間戳
用來修改除了改變時間外的另外兩個時間,改變時間也會隨之改變。
[root@zhanghe tmp]# stat zhang Access: 2017-06-28 03:59:18.000000000 +0800 Modify: 2017-06-28 03:58:50.000000000 +0800 Change: 2017-06-28 03:58:50.000000000 +0800 [root@zhanghe tmp]# touch -a zhang #只修改訪問時間,改變時間不受控制 [root@zhanghe tmp]# stat zhang Access: 2017-06-28 04:02:34.000000000 +0800 Modify: 2017-06-28 03:58:50.000000000 +0800 Change: 2017-06-28 04:02:34.000000000 +0800 [root@zhanghe tmp]# touch -m zhang #只更新修改時間,一樣的改變時間不受控制 [root@zhanghe tmp]# stat zhang Access: 2017-06-28 04:02:34.000000000 +0800 Modify: 2017-06-28 04:05:08.000000000 +0800 Change: 2017-06-28 04:05:08.000000000 +0800 [root@zhanghe tmp]# touch -m -t 202008080808 zhang #只把修改時間更新爲2020年8月8日8時8分 [root@zhanghe tmp]# stat zhang Access: 2017-06-28 04:02:34.000000000 +0800 Modify: 2020-08-08 08:08:00.000000000 +0800 Change: 2017-06-28 04:07:47.000000000 +0800 [root@zhanghe tmp]# touch -a -t 202008080802 zhang #只把訪問時間更新爲2020年8月8日8時2分 [root@zhanghe tmp]# stat zhang Access: 2020-08-08 08:02:00.000000000 +0800 Modify: 2020-08-08 08:08:00.000000000 +0800 Change: 2017-06-28 04:11:21.000000000 +0800
hash緩存的做用是:Remember or display program locations. 記住並顯示程序的位置。
當咱們從shell當中輸入一個命令的完,shell會從PATH變量當中的路徑去查找沒有有相對應的二進制文件,若是沒有找到就說輸出命令沒有找到,若是命令找了以後把此次查找中吸收經驗把這個命令從哪裏找到的會記到hash當中方便下使用,下次再命令時直接從目的找就能夠了就不用去PATH當中挨個查找了,這樣提升了工做的效率,突然發覺,人真的應該向電腦學習。
[root@zhanghe ~]# hash #查看hash表 [root@zhanghe ~]# hash -d cat #刪除hash表當中的cat記錄 [root@zhanghe ~]# hash –r #清空hash表
—a 追加命令歷史到歷史文件
append history lines from this session to the history file
—c清除歷史列表的刪除全部條目
clear the history list by deleting all of the entries
—d 6 刪除緩存歷史中的第六條記錄