文本編輯種類html
♦ 全屏編輯器:nano (字符工具),gedit(圖形化工具),vi,vimgit
♦ 行編輯器: sed正則表達式
#進入一個練習文檔或者vim自帶的練習冊vimtutor [root@centos82s ~]$vimtutor =============================================================================== = W e l c o m e t o t h e V I M T u t o r - Version 1.7 = =============================================================================== Vim is a very powerful editor that has many commands, too many to explain in a tutor such as this. This tutor is designed to describe enough of the commands that you will be able to easily use Vim as an all-purpose editor. #練習開始,用vim進入文檔是命令模式 i 按i鍵進入插入模式,便可編輯,按Esc回到命令模式 :wq 保存退出(:w 保存,:q 退出) :w 保存不退出 :q 退出 :q! 不保存,退出 :!command 執行命令 :r!command 讀入命令的輸出 :w!command 將當前文件內容寫入到另外一個文件 #光標移動 hjkl 左下上右移動光標,同↑↓←→ w,b 以單詞詞首爲單位移動光標 e 以單詞詞尾爲單位移動光標 0,^ 以行爲單位,移動光標至行首 $ 一行爲單位,移動光標至行尾 gg 以文章行號爲單位,移動光標到第一行 G 以文章行號爲單位;num+G:移動光標到num行 H 以當前屏幕爲單位,移動光標到第一行 M 以當前屏幕爲單位,移動光標到中間 L 以當前屏幕爲單位,移動光標到最後一行 ( 以句子爲單位,移動光標到上一句 ) 以句子爲單位,移動光標到下一句 { 以段落爲單位,移動光標到上一段落 } 以段落爲單位,移動光標到下一段落 Ctrl+f 以當前屏幕爲單位,下移一屏幕 Ctrl+b 以當前屏幕爲單位,上移一屏幕 Ctrl+d 以當前屏幕爲單位,下移半屏幕 Ctrl+u 以當前屏幕爲單位,上移半屏幕 #複製 y$ 複製當前光標到行尾的全部字符 y0 複製當前光標到行首的全部字符 y^ 複製當前光標到非空行的行首 ye 複製當前光標到單詞的詞尾 yw 複製當前光標到單詞的詞尾 yb 複製光標以前的全部字符,除光標位置的字符 yy 複製當前光標所在行全部內容 Y 複製當前光標所在行全部內容,不含換行符 #刪除 x 刪除當前光標所在的一個字符 dd 刪除當前行,並把刪除的行保存到剪切板 db 刪除光標以前的全部字符,除光標位置的字符,並把刪除的行保存到剪切板(cb功能同樣) c$ 刪除當前光標到行尾的全部內容,進入插入模式 c^ 刪除當前光標到非空行首的全部內容,進入插入模式 c0 刪除當前光標到行首的全部內容,進入插入模式 ce 刪除當前光標到詞尾的內容,進入插入模式 cw 刪除當前光標到詞尾的內容,進入插入模式 cc 刪除當前光標所在行;num+cc:刪除num行;進入插入模式 C 刪除當前光標到行尾的全部內容,進入插入模式 #插入 a 進入插入模式並在光標後插入數據 o 進入插入模式並在當前行下面插入一個新行(小o) O 進入插入模式並在當前行上面插入一個新行(大O) #粘貼 p 粘貼剪切板內容,和dd鍵、yy鍵配合使用 #撤銷更改 u 撤銷最近的修改 num+u 撤銷以前num次的修改 U 撤銷光標落在此行後的全部修改 Ctrl+r 撤銷以前的撤銷,相對於Windows中Ctrl+y num. 重複前一個操做num次 #高級用法 0y$ 複製行首到行尾 10iroot 粘貼10次root,按Esc退出 di" 光標在符號之間,刪除符號之間的內容,注意符號成對,如"" yi" 光標在符號之間,複製符號之間內容,注意符號成對,如"" vi" 光標在符號之間,選中符號之間內容,注意符號成對,如"" dt+x 刪除字符直至遇到第一個x字符,x可爲其它 yt+x 複製字符直至遇到第一個x字符,x可爲其它
#格式::start_pos,end_pos CMD num 光標定位到num行 num,num1 從num行到num1行 num,+num1 從num行到num+num1行 . 當前行 $ 最後一行 .,$-1 當前行到倒數第二行 % 全文,相對於1,$ #匹配到後續操做纔有效 /param/ 匹配param值 /param/,/param1/ 匹配param值到param1值結束 num,/param/ 從num行開始,匹配到param值結束 /param/,$ 從匹配到param開始到最後一行
#格式:s/param/param1/修飾符 i 忽略大小寫 g 全局替換 gc 全局替換,每次替換前詢問 若出現/param,可使用@,#代替/,好比s#/etc#param#g
查找參數明明存在,若出現下圖狀況使用:
shell
擴展命令模式的配置只對當前vim進程有效,可將配置存放在文件永久保存apache
#配置文件 /etc/vimrc 全局 ~/.vimrc 我的 #行號 啓用:set number,簡寫:set nu 關閉:set nonumber,簡寫:set nonu #忽略字符大小寫 啓用:set ignorecase,簡寫:set ic 關閉:set noignorecase,簡寫set noic #自動縮進 啓用:set autoindent,簡寫:set ai 關閉:set noautoindent,簡寫:set noai #複製保留格式 啓用:set paste 關閉:set nopaste #顯示Tab和換行符(^I和$) 啓用:set list 關閉:set nolist #高亮搜索 啓用:set hlsearch 關閉:set nohlsearch 簡寫:set nohl #語法高亮 啓用:syntax on 關閉:syntax off #文件格式 啓用Windows格式: set fileformat=dos 啓用Unix格式: set fileformat=unix 簡寫: set ff=dos|unix #tab 用空格代替 啓用:set expandtab 默認爲8個空格 禁用:set noexpandtab 簡寫:set et #設置tab空格個數 啓用:set tabstop=num num空格個數 簡寫:set ts=4 #設置文本寬度 啓用:set textwidth=80 簡寫:set tw=80 #設置光標所在行的標示線 啓用:set cursorline, 簡寫:set cul 關閉:set nocursorline #加密 啓用:set key=password 禁用:set key= #set幫助 :help option-list :set or :set all
在末行有「-- VISUAL ...-- 」指示,表示可視化模式編程
容許選擇的文本塊vim
♦ v 面向字符,-- VISUAL -- c#
♦ V 面向整行,-- VISUAL LINE --centos
♦ Ctrl+v 面向塊,-- VISUAL BLOCK --緩存
可視化可結合箭頭,h,j,k,l等使用。選中的文字可被刪除,複製,修改,過來,搜索,替換等
以下所示,在每行行首插入#字符
一、先將光標移到第一行行首
二、按Ctrl+v鍵,進入可視化模式
三、輸入G鍵到最後一行
四、輸入I到插入模式
五、輸入#
六、按Esc鍵退出插入模式,完成
以下所示,在指定塊位置插入相同內容
一、光標定位到要操做的位置
二、Ctrl+v,進入可視化模式
三、按I鍵,進入插入模式
四、輸入@
五、按Esc鍵退出,完成
#vim file1 file2 file3 或 vim file[1-3] :next 切換到下一個文件 :prev 切換到上一個文件 :first 切換到第一個文件 :last 切換到最後一個文件 :wall 保存全部 :qall 不保存退出全部 :wqall 保存退出全部
vim -o|-O file1 file2
-o: 上下分割
-O: 左右分割
窗口切換:Ctrl+w
10.4.1 單文件窗口分割
Ctrl+w,s 水平分割,上下分屏
Ctrl+w,v 垂直分割,左右分屏
Ctrl+w,q 取消相鄰窗口
Ctrl+w,o 取消所有分屏窗口
:wqall 退出
vim有26個命名寄存器和1個無命名寄存器,存放不一樣的剪切板內容,能夠在同一個主機的不一樣會話(終端窗口)間共享
寄存器名稱a..z格式 格式:"寄存器+命令 ,放在數字和命令之間
寄存器的主要功能就是緩存操做過程當中刪除、複製、搜索等的文本內容
ma 將當前位置標記爲a,26個字母都可作標記,mb、mc等等
'a 跳轉到a標記的位置,實用的文檔內標記方法,文檔中跳躍編輯時頗有用
qa 錄製宏a,a爲宏的名稱,末行提示:recording @a
q 中止錄製宏
@a 執行宏a
@@ 從新執行上次執行的宏
#以二進制方式打開文件 vim -b file #擴展命令模式下,利用xxd命令轉換爲可讀的十六進制 :%!xxd #切換至插入模式,編輯二進制文件 #切換至擴展命令模式下,利用xxd命令轉換回二進制 :%!xxd -r #保存退出
命令經常使用選項
♦ -E 顯示行結束符$
♦ -A 顯示全部控制符
♦ -n 對顯示出的行編號
♦ -b 對非空行編號
♦ -s 壓縮連續的空行成一行
#-E [root@centos82s data]$cat -E f1.txt 1$ $ 2$ 3$ #-A [root@centos82s data]$cat -A f1.txt 1$ ^I$ 2$ 3$ #-n [root@centos82s data]$cat -n f1.txt 1 1 2 3 2 4 3 5 4 6 5 #-b [root@centos82s data]$cat -b f1.txt 1 1 2 此行存在tab字符,因此不爲空 3 2 4 3 5 4 6 5 7 6 #-s [root@centos82s data]$cat -s f1.txt 1 2 3 4 5 6
#逆向顯示文本內容 [root@centos82s data]$tac f1.txt 9 8 6 5 4 3 2 1 [root@centos82s data]$tac a b c d 按Ctrl+d d c b a [root@centos82s data]$seq 5 1 2 3 4 5 [root@centos82s data]$seq 5|tac 5 4 3 2 1
顯示行號,相對於cat -b
[root@centos82s data]$nl f1.txt 1 1 2 3 2 4 3 5 4 6 5 7 6
將同一行的內容逆向顯示
[root@centos82s data]$cat f2.txt 1 2 3 4 5 a b c [root@centos82s data]$rev f2.txt 5 4 3 2 1 c b a #手動輸入,按enter鍵,逆向顯示 [root@centos82s data]$rev 1 2 3 4 5 6 6 5 4 3 2 1 [root@centos82s data]$echo {1..5} 1 2 3 4 5 [root@centos82s data]$echo {1..5}|rev 5 4 3 2 1
[root@centos82s data]$hexdump -C -n 512 sda 00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............| [root@centos82s data]$echo {a..z}|tr -d ' '|hexdump -C 00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop| 00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.| 0000001b
od即dump files in octal and other formats(轉儲文件的八進制和其餘格式)
#十六進制 [root@centos82s data]$echo {a..z}|tr -d ' '|od -t x 0000000 64636261 68676665 6c6b6a69 706f6e6d 0000020 74737271 78777675 000a7a79 0000033 [root@centos82s data]$echo {a..z}|tr -d ' '|od -t x1 0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 0000020 71 72 73 74 75 76 77 78 79 7a 0a 0000033 [root@centos82s data]$echo {a..z}|tr -d ' '|od -t x1z 0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 >abcdefghijklmnop< 0000020 71 72 73 74 75 76 77 78 79 7a 0a >qrstuvwxyz.< 0000033
[root@centos82s data]$echo {a..z}|tr -d ' '|xxd 00000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70 abcdefghijklmnop 00000010: 7172 7374 7576 7778 797a 0a qrstuvwxyz.
能夠實現分頁查看文件,能夠配合管道實現輸出信息的分頁
經常使用快捷鍵
♦ enter 文件下移一行
♦ space 文件下翻一頁
♦ b 文件上翻一頁
當下移到最後一行時,將退出more命令,若是想查看前面內容,只能從新執行一遍more命令
[root@centos82s data]$more /etc/init.d/functions
基本功能和more相似
經常使用快捷鍵
♦ ↑↓ 上移和下移一行
♦ enter 文件下移一行
♦ space 文件下翻一頁
♦ b 文件上翻一頁
♦ g 光標定位到文件開始
♦ G 光標定位到文件最後
♦ /param 搜索匹配param的字符串
♦ n/N 跳到下一個或上一個匹配
#分頁顯示 /etc下的文件列表 [root@centos82s ~]$ls -R /etc/|more /etc/: adjtime aliases alternatives anacrontab audit authselect bash_completion.d .... #分頁顯示系統啓動信息 [root@centos82s ~]$dmesg|less [ 0.000000] Linux version 4.18.0-193.el8.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)) #1 SMP Fri May 8 10:59:10 UTC 2020 [ 0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-193.el8.x86_64 root=UUID=5e437624-9610-4d5d-804b-ec9054e9f46d ro crashkernel=auto resume=UUID=9c230f26-8349-4153-b1d6-742a6a7b7088 rhgb quiet ....
能夠顯示文件或標準輸入的前面行
經常使用命令選項
♦ -c num 指定獲取前num字節
♦ -n num 指定獲取前num行
♦ -num 同上
#默認獲取文件前10行 [root@centos82s data]$head passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin #指定獲取文件前10個字符 [root@centos82s data]$head -c 10 passwd root:x:0:0 #指定獲取文件前5行 [root@centos82s data]$head -n 5 passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #顯示第一行到倒數第八行的內容 [root@centos82s data]$seq 10|head -n -8 1 2
tail和head相反,能夠顯示文件或標準輸入的倒數行
經常使用命令選項
♦ -c num 指定獲取後num字節
♦ -n num 指定獲取後num行
♦ -num 同上
♦ -f 跟蹤顯示文件fd新追加的內容,經常使用日誌監控,相對於--follow=descriptor,當文件刪 除再新建同名文件,將沒法進行跟蹤文件
♦ -F 跟蹤文件名,相對於--follow=name --retry,當文件刪除再新建同名文件,將能夠繼 續跟蹤文件
♦ tailf 相似tail -f,當文件不增加時並不訪問文件
♦ -fn0/-0f -Fn0/-0F 只查看最新發生的日誌
#默認獲取文件後10行 [root@centos82s data]$tail passwd polkitd:x:998:996:User for polkitd:/:/sbin/nologin unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin sssd:x:996:993:User for sssd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rngd:x:995:992:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin dou:x:1000:1000:dou:/home/dou:/bin/bash apache:x:48:48:Apache:/var/www:/sbin/nologin admins:x:1001:1001::/home/admins:/bin/bash honghong:x:1002:1002::/home/honghong:/bin/bash lanlan:x:1003:1003::/home/lanlan:/bin/bash #指定獲取文件後5行內容 [root@centos82s data]$tail -n 5 passwd dou:x:1000:1000:dou:/home/dou:/bin/bash apache:x:48:48:Apache:/var/www:/sbin/nologin admins:x:1001:1001::/home/admins:/bin/bash honghong:x:1002:1002::/home/honghong:/bin/bash lanlan:x:1003:1003::/home/lanlan:/bin/bash #指定獲取文件後5個字節 [root@centos82s data]$tail -c 5 passwd bash #特殊用法 [root@centos82s data]$seq 10|tail -n 5 6 7 8 9 10 #顯示倒數第一行到倒數第八行的內容 [root@centos82s data]$seq 10|tail -n -8 3 4 5 6 7 8 9 10 #新建ping.log文件,打開一個終端執行下面的命令,將返回結果重定向到ping.log [root@centos82s data]$touch ping.log [root@centos82s data]$echo hello >> ping.log #在打開一個終端,使用命令tail -f ping.log查看,tail程序會持續地顯示出ping.log文件後續增長的內容 [root@centos82s data]$tail -fn0 ping.log hell hello #把文件刪除,從新建立ping.log,再使用tail命令追蹤, [root@centos82s data]$rm -rf ping.log [root@centos82s data]$tail -f ping.log tail: cannot open 'ping.log' for reading: No such file or directory tail: no files remaining [root@centos82s data]$touch ping.log #小f再也不生效 [root@centos82s data]$tail -f ping.log #大F繼續追蹤 [root@centos82s data]$tail -Fn0 ping.log hello hello tail: 'ping.log' has become inaccessible: No such file or directory tail: 'ping.log' has appeared; following new file hello
cut命令能夠提取文本文件或STDIN數據的指定列
命令經常使用選項
♦ -d 指明分隔符,默認tab
♦ -f fileds:
#: 第#個字段,例如:3
#,#[,#]: 離散多個字段,例如:1,3,5
#-#: 連續的多個字段,例如:1-6
混合使用:1-3,7
♦ -c 按字符切割
♦ --output-delimiter=STRING指定輸出分隔符
#以:爲分隔符,抽取 [root@centos82s data]$cut -d: -f1,3-4,7 passwd root:0:0:/bin/bash bin:1:1:/sbin/nologin daemon:2:2:/sbin/nologin adm:3:4:/sbin/nologin lp:4:7:/sbin/nologin sync:5:0:/bin/sync shutdown:6:0:/sbin/shutdown [root@centos82s data]$df|tr -s ' '|cut -d ' ' -f5|tr -dc "[0-9]\n" 0 0 2 0 3 15 15 0 [root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]' 0 0 2 0 3 15 15 0 [root@centos82s data]$df|tr -s ' '|cut -d ' ' -f5|tr -d %|tail -n +2 0 0 2 0 3 15 15 0
paste合併多個文件同行號的列到一行
命令經常使用選項
♦ -d 分隔符:指定分隔符,默認用tab
♦ -s 全部行合成一行顯示
#列顯示 [root@centos82s data]$cat alpha.log seq.log a b c d e f g h 1 2 3 4 5 [root@centos82s data]$paste alpha.log seq.log a 1 b 2 c 3 d 4 e 5 f g h [root@centos82s data]$paste -d: alpha.log seq.log a:1 b:2 c:3 d:4 e:5 f: g: h: #行顯示 [root@centos82s data]$paste -s alpha.log seq.log a b c d e f g h 1 2 3 4 5
文本數據統計:wc
整理文本: sort
比較文件: diff和patch
wc命令可用於統計文件的行總數、單詞總數、字節總數和字符總數,能夠對文件或STDIN中的 數據統計
命令經常使用選項
♦ -l 只計算行數
♦ -w 只計算單詞總數
♦ -c 只計算字節總數
♦ -m 只計算字符總數
♦ -L 顯示文件中最長行的長度
[root@centos82s data]$wc seq.log 5 5 10 seq.log 行數 單詞數 字節數 [root@centos82s data]$wc -l seq.log 5 seq.log #取倒數第一行到倒數第八行 [root@centos82s ~]$df|tail -n $(echo `df|wc -l` -1|bc) devtmpfs 905156 0 905156 0% /dev tmpfs 921932 0 921932 0% /dev/shm tmpfs 921932 17092 904840 2% /run tmpfs 921932 0 921932 0% /sys/fs/cgroup /dev/sda2 104806400 2196452 102609948 3% / /dev/sda5 52403200 7799112 44604088 15% /data /dev/sda1 999320 137604 792904 15% /boot tmpfs 184384 0 184384 0% /run/user/0
把整理過的文本顯示在STDOUT,不改變原始文件
命令經常使用選項
♦ -r 執行反方向(由上至下)整理
♦ -R 隨機排序
♦ -n 執行按數字大小整理
♦ -h 人類可讀排序,如:2k 1G
♦ -f 選項忽略(fold)字符串中的字符大小寫
♦ -u 選項(獨特,unique),合併重複項,即去重
♦ -t c 選項使用c作爲字段界定符
♦ -k 選項按照使用c字符分隔的#列來整理可以使用屢次
[root@centos82s data]$cut -d: -f1,3 passwd|sort -t: -k2 -nr|head -n 3 nobody:65534 lanlan:1003 honghong:1002 #統計日誌同一個ip訪問的數量 [root@centos82s data]$cut -d" " -f1 access_log|sort -u|wc -l 201 #統計分區利用率 [root@centos82s data]$df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 905156 0 905156 0% /dev tmpfs 921932 0 921932 0% /dev/shm tmpfs 921932 17092 904840 2% /run tmpfs 921932 0 921932 0% /sys/fs/cgroup /dev/sda2 104806400 2196416 102609984 3% / /dev/sda5 52403200 7831184 44572016 15% /data /dev/sda1 999320 137604 792904 15% /boot tmpfs 184384 0 184384 0% /run/user/0 #查看分區利用率最高值 [root@centos82s data]$df|tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1 15 [root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'|sort -nr|head -1 15 [root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'|sort -n|tail -1 15 [root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'|sort -nr|head -n1 15 #對指定的列數字排序 [root@centos82s data]$sort passwd admins:x:1001:1001::/home/admins:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin ... #以:爲分隔符,對第三列即UNID按字母次序排序,取前三行 [root@centos82s data]$sort -t: -k3 passwd|head -n 3 root:x:0:0:root:/root:/bin/bash dou:x:1000:1000:dou:/home/dou:/bin/bash admins:x:1001:1001::/home/admins:/bin/bash #以:爲分隔符,對第3列即UNID按數字大小倒序排序,取前三行 [root@centos82s data]$sort -t: -k3 -nr passwd|head -n 3 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin lanlan:x:1003:1003::/home/lanlan:/bin/bash honghong:x:1002:1002::/home/honghong:/bin/bash #-R,隨機排序 [root@centos82s data]$seq 5|sort -R 3 5 1 2 4 [root@centos82s data]$seq 5|sort -R 1 4 3 5 2 #-u去除重複的行 [root@centos82s data]$cut -d: -f7 passwd|sort /bin/bash /bin/bash /bin/bash /bin/bash /bin/bash /bin/sync /sbin/halt /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin ... [root@centos82s data]$cut -d: -f7 passwd|sort -u /bin/bash /bin/sync /sbin/halt /sbin/nologin /sbin/shutdown
去除相鄰重複的行
命令經常使用選項
♦ -c 顯示重複次數
♦ -d 顯示重複過的行
♦ -u 顯示沒有重複過的行
#原文件輸出 [root@centos82s data]$cat num1.txt 123 123 43 200 3321 3321 345 456 200 #去重 [root@centos82s data]$uniq num1.txt 123 43 200 3321 345 456 200 #-c [root@centos82s data]$uniq -c num1.txt 2 123 1 43 1 200 2 3321 1 345 1 456 1 200 #-d [root@centos82s data]$uniq -d num1.txt 123 3321 #-u [root@centos82s data]$uniq -u num1.txt 43 200 345 456 200 #統計日誌訪問量最多的請求,取前三行 [root@centos82s data]$cut -d" " -f1 access_log|sort|uniq -c|sort -nr|head -n 3 4870 172.20.116.228 3429 172.20.116.208 2834 172.20.0.222
diff命令能夠對比兩個文件的不一樣之處,方便查看改動過的內容
命令經常使用選項
♦ -y 選擇並排對比
♦ -W 指定行寬度
♦ -u 以unified格式顯示
[root@centos82s data]$cat num1.txt 1 2 3 4 5 6 7 8 9 [root@centos82s data]$cat num2.txt 1 2 33 4 55 6 #比較兩個文件 [root@centos82s data]$diff num1.txt num2.txt 3c3 < 3 --- > 33 5c5 < 5 --- > 55 7,9d6 < 7 < 8 < 9 #說明:上面的3c3,5c5表示兩個文件在第3行和第5行內容不一樣,7,9d6表示第一個文件比第二個文件多了7到9行 #-y,-W並排對比 [root@centos82s data]$diff num1.txt num2.txt -y -W 30 1 1 2 2 3 | 33 4 4 5 | 55 6 6 7 < 8 < 9 < [root@centos82s data]$diff num2.txt num1.txt -y -W 30 1 1 2 2 33 | 3 4 4 55 | 5 6 6 > 7 > 8 > 9 "|" 表示兩個文件內容的不一樣 "<" 表示後面文件比前面文件少了一行內容 ">" 表示後面文件比前面文件多了一行內容 #-u 以unified格式顯示 [root@centos82s data]$diff -u num1.txt num2.txt --- num1.txt 2020-08-07 00:40:40.191763464 +0800 +++ num2.txt 2020-08-07 00:44:14.331778309 +0800 @@ -1,9 +1,6 @@ 1 2 -3 +33 4 -5 +55 6 -7 -8 -9 "-":表示第一個文件, "+":表示第二個文件, "-1,9":表示第一個文件的第一行到第九行, "+1,6":表示第二個文件的第一行到第六行, "-3/-5/-7/-8/-9":表示第一個文件刪除此行,能夠和第二個文件行相同 "+33/+55":表示第一個文件添加此行,能夠和第二個文件行相同
利用patch命令,結合diff輸出的unified格式信息和兩個文件任意一個,能夠生成另外一個文件
命令經常使用選項
♦ -b 備份參考文檔,文件名稱後綴加.orig
#對比生成unified格式信息 [root@centos82s data]$diff -u num1.txt num2.txt > diff.txt [root@centos82s data]$ll total 7432632 -rw-r--r-- 1 root root 149 Aug 7 01:08 diff.txt #刪除一個文件 [root@centos82s data]$rm -f num2.txt [root@centos82s data]$ll total 7432628 -rw-r--r-- 1 root root 149 Aug 7 01:08 diff.txt -rw-r--r-- 1 root root 18 Aug 7 00:40 num1.txt #-b表示先備份num1.txt爲num1.txt.orig,num1.txt內容是恢復的原num2.txt的數據,把num1.txt重命名爲num2.txt,把num1.txt.orig重命名爲num1.txt,搞定 [root@centos82s data]$patch -b num1.txt diff.txt patching file num1.txt [root@centos82s data]$ls num1.txt.orig diff.txt num1.txt
命令經常使用選項,param表明正則表達式
♦ -color=auto 對匹配到的文本着色顯示
♦ -m num 匹配num次後中止
♦ -v 顯示不被param匹配到的行
♦ -i 忽略大小寫
♦ -n 顯示匹配的行號
♦ -c 統計匹配的行數
♦ -o 僅顯示匹配到的字符串
♦ -q 靜默模式,不輸出任何信息,使用$?查看,0:匹配,1:沒有匹配
♦ -A num after,後num行
♦ -B num before,前num行
♦ -C num context,先後各num行
♦ -e 實現多個選項間的邏輯 or 關係,如:grep -e 'cat' -e 'dog' file
♦ -w 匹配整個單詞
♦ -E 使用ERE
♦ -F 至關於fgrep,不支持正則表達式
♦ -f file 根據模式文件處理
♦ -r 遞歸目錄,不處理軟連接
♦ -R 遞歸目錄,處理軟連接
#列出passwd文件中匹配到root的行 [root@centos82s data]$grep root passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #默認會對搜索到的內容着色顯示 [root@centos82s data]$alias grep alias grep='grep --color=auto' #-v,排除過濾,列出沒有匹配到root的行 [root@centos82s data]$grep -v root passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ... #-i,忽略大小寫 [root@centos82s data]$grep ROOT passwd [root@centos82s data]$grep -i ROOT passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #顯示行號 [root@centos82s data]$grep -n root passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin #顯示匹配到行的次數 [root@centos82s data]$grep -c root passwd 2 #只顯示匹配到的內容,行的其它內容不顯示 [root@centos82s data]$grep -o root passwd root root root root #-q,靜默模式,不輸出信息,使用$?查看是否匹配 [root@centos82s data]$grep -q root passwd [root@centos82s data]$echo $? 0 # [root@centos82s data]$grep -n root passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin #匹配到行的後三行,和匹配行內容一塊兒輸出 [root@centos82s data]$grep -nA3 root passwd 1:root:x:0:0:root:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin 4-adm:x:3:4:adm:/var/adm:/sbin/nologin -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13-nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin #匹配到行的前三行,和匹配行內容一塊兒輸出 [root@centos82s data]$grep -nB3 root passwd 1:root:x:0:0:root:/root:/bin/bash -- 7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin #匹配到行的先後三行,和匹配行內容一塊兒輸出 [root@centos82s data]$grep -nC3 root passwd 1:root:x:0:0:root:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin 4-adm:x:3:4:adm:/var/adm:/sbin/nologin -- 7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13-nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin #-e,屢次過濾,多個條件「或」的關係 [root@centos82s data]$grep -e root -e dou passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin dou:x:1000:1000:dou:/home/dou:/bin/bash #"|"下面是與的關係 [root@centos82s data]$grep dou passwd|grep bin dou:x:1000:1000:dou:/home/dou:/bin/bash #-w,匹配單詞,不模糊匹配 [root@centos82s data]$grep adm passwd adm:x:3:4:adm:/var/adm:/sbin/nologin admins:x:1001:1001::/home/admins:/bin/bash [root@centos82s data]$grep -w adm passwd adm:x:3:4:adm:/var/adm:/sbin/nologin #-f,用文件存放過濾條件 [root@centos82s data]$cat f1.txt root dou [root@centos82s data]$grep -f f1.txt passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin dou:x:1000:1000:dou:/home/dou:/bin/bash
sed即Stream EDitor,和vi不一樣,sed是行編輯器
sed是從文件或管道中讀取一行,處理一行,直到最後一行。每當處理一行時,把當前處理的行存儲在 臨時緩衝區,稱爲模式空間,接着用sed命令處理緩衝區中的內容,處理完後,把緩衝區的內容送往屏 幕。接着處理下一行,這樣不斷重複,直到文件末尾。
經常使用選項
♦ -n 不輸出模式空間內容到屏幕,即不自動打印
♦ -e 多點編輯
♦ -f FILE 從指定文件中讀取編輯腳本
♦ -i。bak 備份文件並原處編輯
script格式:’地址命令‘
地址格式
♦ 不給地址:對全文進行處理
♦ 單地址:
#:指定的行,$:最後一行
/pattern/:被此處模式所可以匹配到的每一行
♦ 地址範圍:
#,# 從#行到第#行
#,+# 從#行到+#行
/pat1/,/pat2/
#,/pat/
♦ 步進:~,1~2 奇數行,2~2 偶數行
命令
♦ p 打印當前模式空間內容,追加到默認輸出以後
♦ Ip 忽略大小寫輸出
♦ d 刪除模式空間匹配的行,並當即啓用下一輪循環
♦ a [\\]text 在指定行後面追加文本,支持使用\n實現多行追加
♦ i [\\]text 在行前面插入文本
♦ c [\\]text 替換行爲單行或多行文本
♦ w file 保存模式匹配的行至指定文件
♦ r file 讀取指定文件的文本至模式空間中匹配到的行後
♦ = 爲模式空間中的行打印行號
♦ ! 模式空間中匹配行取反處理
♦ s/pattern/string/修飾符 查找替換,支持使用其它分隔符,能夠是其它形式:s@@@,s###
替換修飾符:
g 行內全局替換
p 顯示替換成功的行
w /PATH/FILE 將替換成功的行保存至文件中
I,i 忽略大小寫
#-a,向匹配行後追加 [root@centos82s ~]$cat test.txt dou123douo456dou789 13579dou a246dou810 #方法一:指定行 [root@centos82s ~]$sed "2ahello" test.txt dou123douo456dou789 13579dou hello a246dou810 #方法二:模糊匹配,可多行追加 [root@centos82s ~]$sed "/13579/ahello" test.txt dou123douo456dou789 13579dou hello a246dou810 #向最後一行追加 [root@centos82s ~]$sed '$ahello' test.txt dou123douo456dou789 13579dou a246dou810 hello #-i [root@centos82s ~]$sed "2ihello" test.txt dou123douo456dou789 hello 13579dou a246dou810 [root@centos82s ~]$sed '/13/ihello' test.txt dou123douo456dou789 hello 13579dou a246dou810 [root@centos82s ~]$sed '$ihello' test.txt dou123douo456dou789 13579dou hello a246dou810 #替換指定行 [root@centos82s ~]$sed '1chello' test.txt hello 13579dou a246dou810 #替換匹配行 [root@centos82s ~]$sed '/dou/chello' test.txt hello hello hello #替換最後一行 [root@centos82s ~]$sed '$chello' test.txt dou123douo456dou789 13579dou hello #刪除指定行 [root@centos82s ~]$sed '1d' test.txt 13579dou a246dou810 #刪除奇數行 [root@centos82s ~]$sed '1~2d' test.txt 13579dou #刪除1到2行 [root@centos82s ~]$sed '1,2d' test.txt a246dou810 #刪除1到2以外的行 [root@centos82s ~]$sed '1,2!d' test.txt dou123douo456dou789 13579dou #刪除最後一行 [root@centos82s ~]$sed '$d' test.txt dou123douo456dou789 13579dou #刪除模糊匹配行 [root@centos82s ~]$sed '/135/d' test.txt dou123douo456dou789 a246dou810 #刪除匹配行到最後一行 [root@centos82s ~]$sed '/135/,$d' test.txt dou123douo456dou789 #刪除匹配行及其下面一行 [root@centos82s ~]$sed '/135/,+1d' test.txt dou123douo456dou789 #刪除空行 [root@centos82s ~]$sed '/^$/d' test.txt dou123douo456dou789 13579dou a246dou810 #刪除匹配行以外的行 [root@centos82s ~]$sed '/123\|135/!d' test.txt dou123douo456dou789 13579dou #刪除指定行範圍內匹配的行 [root@centos82s ~]$sed '1,3{/123/d}' test.txt 13579dou a246dou810 #替換文件中的內容,默認只替換行中匹配的第一個 [root@centos82s ~]$sed 's/dou/xiaobai/' test.txt xiaobai123douo456dou789 13579xiaobai a246xiaobai810 #替換內容,g,全局替換 [root@centos82s ~]$sed 's/dou/xiaobai/g' test.txt xiaobai123xiaobaio456xiaobai789 13579xiaobai a246xiaobai810 #將每行中匹配到內容的第二個替換 [root@centos82s ~]$sed 's/dou/xiaobai/2' test.txt dou123xiaobaio456dou789 13579dou a246dou810 #將每行匹配到內容的第二行替換,並將替換過的內容保存到文件 [root@centos82s ~]$sed -n 's/dou/xiaobai/2pw test1.txt' test.txt dou123xiaobaio456dou789 #將每一行行首匹配到的內容替換爲空 [root@centos82s ~]$sed '/^#.*/s/#/''/' test.txt dou123douo456,dou789 sds,%sdjsdo#@ ,13579dou ,sakjdlsad 234cac2,46dou810 #將每一行行首匹配到的內容替換爲@ [root@centos82s ~]$sed '/^#.*/s/#/@/' test.txt @dou123douo456,dou789 @sds,%sdjsdo#@ @,13579dou ,sakjdlsad @234cac2,46dou810 #匹配行首爲#的行,替換,逗號後面的內容爲空 [root@centos82s ~]$sed '/^#.*/s/,.*//g' test.txt #dou123d#ouo456 #sds # ,sakjdlsad #234ca#c2 #替換每行最後兩個字符爲空 [root@centos82s ~]$sed 's/..$//g' test.txt #dou123d#ouo456,dou7 #sds,#%sdjsdo #,13579d ,sakjdls #234ca#c2,46dou八、 #將行首爲#的行替換爲空 [root@centos82s ~]$sed 's/^#.*//' test.txt ,sakjdlsad #將行首爲#的替換爲空,而後刪除爲空的行 [root@centos82s ~]$sed 's/^#.*//;/^$/d' test.txt ,sakjdlsad #將全部數字行首加上() [root@centos82s ~]$cat test.txt 1.#dou123d#ouo456,dou789 2.#sds,#%sdjsdo#@ 3.#,13579dou ,sakjdlsad 4.#234ca#c2,46dou810 #方法一 [root@centos82s ~]$sed 's/^[0-9]/(&)/' test.txt (1).#dou123d#ouo456,dou789 (2).#sds,#%sdjsdo#@ (3).#,13579dou ,sakjdlsad (4).#234ca#c2,46dou810 #方法二 [root@centos82s ~]$sed 's/\([0-9]\)/(\1)/' test.txt (1).#dou123d#ouo456,dou789 (2).#sds,#%sdjsdo#@ (3).#,13579dou ,sakjdlsad (4).#234ca#c2,46dou810 #在每一行行尾添加內容 [root@centos82s ~]$sed 's/$/& 'xiaobai'/' test.txt 1.#dou123d#ouo456,dou789 xiaobai 2.#sds,#%sdjsdo#@ xiaobai 3.#,13579dou xiaobai ,sakjdlsad xiaobai 4.#234ca#c2,46dou810 xiaobai #打印文件第三行內容 [root@centos82s ~]$sed -n '3p' test.txt 3.#,13579dou #從第二行開始每隔二行打印一行 [root@centos82s ~]$sed -n '2~2p' test.txt 2.#sds,#%sdjsdo#@ ,sakjdlsad #打印第一行到第三行 [root@centos82s ~]$sed -n '1,3p' test.txt 1.#dou123d#ouo456,dou789 2.#sds,#%sdjsdo#@ 3.#,13579dou #打印最後一行 [root@centos82s ~]$sed -n '$p' test.txt 4.#234ca#c2,46dou810 #打印第二行到最後一行 [root@centos82s ~]$sed -n '2,$p' test.txt 2.#sds,#%sdjsdo#@ 3.#,13579dou ,sakjdlsad 4.#234ca#c2,46dou810 #打印匹配到的行 [root@centos82s ~]$sed -n '/dou/p' test.txt 1.#dou123d#ouo456,dou789 3.#,13579dou 4.#234ca#c2,46dou810 #打印從匹配s行匹配到dou的行 [root@centos82s ~]$sed -n '/s/,/dou/p' test.txt 2.#sds,#%sdjsdo#@ 3.#,13579dou ,sakjdlsad 4.#234ca#c2,46dou810 #打印行號,和wc -l相似 [root@centos82s ~]$sed -n '$=' test.txt 5 #打印匹配行的行號 [root@centos82s ~]$sed -n '/dou/=' test.txt 1 3 5 #打印匹配行的行號和內容 [root@centos82s ~]$sed -n '/dou/{=;p}' test.txt 1 1.#dou123d#ouo456,dou789 3 3.#,13579dou 5 4.#234ca#c2,46dou810 #將一個文件的內容讀取到另外一個文件,在另外一個文件的每一行追加顯示 [root@centos82s ~]$sed 'r test1.txt' test.txt 1.#dou123d#ouo456,dou789 dou123xiaobaio456dou789 2.#sds,#%sdjsdo#@ dou123xiaobaio456dou789 3.#,13579dou dou123xiaobaio456dou789 ,sakjdlsad dou123xiaobaio456dou789 4.#234ca#c2,46dou810 dou123xiaobaio456dou789 #將一個文件內容讀取到另外一個文件的第三行後面追加顯示 [root@centos82s ~]$sed '3r test1.txt' test.txt 1.#dou123d#ouo456,dou789 2.#sds,#%sdjsdo#@ 3.#,13579dou dou123xiaobaio456dou789 ,sakjdlsad 4.#234ca#c2,46dou810 #將一個文件內容讀取到另外一個文件匹配內容行的後面追加顯示 [root@centos82s ~]$sed '/135/r test1.txt' test.txt 1.#dou123d#ouo456,dou789 2.#sds,#%sdjsdo#@ 3.#,13579dou dou123xiaobaio456dou789 ,sakjdlsad 4.#234ca#c2,46dou810 #將一個文件內容讀取到另外一個文件內容的最後一行 [root@centos82s ~]$sed '$r test1.txt' test.txt 1.#dou123d#ouo456,dou789 2.#sds,#%sdjsdo#@ 3.#,13579dou ,sakjdlsad 4.#234ca#c2,46dou810 dou123xiaobaio456dou789 #將一個test文件內容讀取到另外一個test1文件,文件不存在則建立,文件存在則覆蓋 [root@centos82s ~]$sed 'w test1.txt' test.txt 1.#dou123d#ouo456,dou789 2.#sds,#%sdjsdo#@ 3.#,13579dou dou123xiaobaio456dou789 ,sakjdlsad 4.#234ca#c2,46dou810 #將文件test的第一行和最後一行寫入test1 [root@centos82s ~]$sed -n -e '1w test1.txt' -e '$w test1.txt' test.txt [root@centos82s ~]$cat test1.txt 1.#dou123d#ouo456,dou789 4.#234ca#c2,46dou810 #將test文件的第一行和第二行分別寫入test1和test2 [root@centos82s ~]$sed -n -e '1w test1.txt' -e '$w test2.txt' test.txt
正則表達式分爲兩類:
♦ 基本正則表達式:BRE
♦ 擴展正則表達式:ERE
通常使用正則表達式用""將其包裹起來,避免特殊字符的影響
正則表達式的元字符分類:字符匹配、匹配次數、位置錨定、分組和邏輯組合
字符元字符列表
♦ . 任意單個字符
♦ [] 指定範圍內的字符,如[dou],表示匹配d,o,u這三個字符中的任何一個
♦ [^] 排除[]中的字符,如[dou],表示匹配d,o,u 這個三個字符除外的任何一個
♦ [:alnum:] 字母和數字
♦ [:alpha:] 字母
♦ [:lower:] 小寫字母
♦ [:upper:] 大寫字母
♦ [:blank:] 空格和tab
♦ [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
♦ [:digit:] 十進制數字,即0-9
♦ [:xdigit:] 十六進制數字
♦ [:cntrl:] 不可打印的控制字符(退格、刪除...)
♦ [:graph:] 可打印的非空白字符
♦ [:print:] 可打印的字符
♦ [:punct:] 標點符號
#.匹配單個字符 [root@centos82s data]$grep "r..t" passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin #匹配文件中的數字 [root@centos82s data]$grep "[0-9]" passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync ... #過濾指定的字符 [root@centos82s data]$cat f1.txt dou1 dou3 dou5 dou7 [root@centos82s data]$grep "dou[1-3]" f1.txt dou1 dou3 #過濾指定的字符(取反) [root@centos82s data]$grep "dou[^1-3]" f1.txt dou5 dou7
用在要指定次數的字符後面,表明字符要出現的次數
次數匹配規則元字符
♦ * 匹配前面字符N次,包括0次
♦ \? 匹配前面字符0次或1次
♦ \+ 匹配前面字符至少1次
♦ \{n\} 匹配前面字符連續n次,n爲數字
♦ \{m,n\} 匹配前面字符次數要大於等於m,小於等於n
♦ \{m,} 匹配前面字符次數大於等於m
♦ \{,n} 匹配前面字符次數小於等於n
[root@centos82s data]$cat f1.txt dou111 dou333333 dou555555555 dou7 dou # *,匹配「1」任意次 [root@centos82s data]$grep "dou1*" f1.txt dou111 dou333333 dou555555555 dou7 dou # \?,匹配1,0次或1次 [root@centos82s data]$grep "dou1\?" f1.txt dou111 dou333333 dou555555555 dou7 dou # \+,至少匹配1,1次 [root@centos82s data]$grep "dou1\+" f1.txt dou111 # \{n\},匹配1,n次 [root@centos82s data]$grep "dou1\{4\}" f1.txt [root@centos82s data]$grep "dou1\{2\}" f1.txt dou111 # \{m,n\},匹配1,大於等於3次,小於等於7次 [root@centos82s data]$grep "dou1\{3,7\}" f1.txt dou111 # \{m,\},匹配1,大於等於3次 [root@centos82s data]$grep "dou1\{3,\}" f1.txt dou111 [root@centos82s data]$grep "dou1\{4,\}" f1.txt [root@centos82s data]$
位置錨定能夠用於定位出現的位置
♦ ^ 行首錨定,用於模式的最左側
♦ $ 行尾錨定,用於模式的最右側
♦ ^PATTERN$ 用於模式匹配整行
♦ ^$ 空行
♦ ^[[:space:]] 空白行
♦ \< 或 \b 詞首錨定,用於單詞模式的左側
♦ \> 或 \b 詞尾錨定,用於單詞模式的右側
♦ \<PATTERN\> 匹配整個單詞
[root@centos82s data]$grep root passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #查找以root爲行首的行 [root@centos82s data]$grep "^root" passwd root:x:0:0:root:/root:/bin/bash #查找非#開頭的行 [root@centos82s data]$grep "^[^#].*" fstab UUID=5e437624-9610-4d5d-804b-ec9054e9f46d / xfs defaults 0 0 UUID=e54fe5be-10b7-456b-b297-cf28faf5aab6 /boot ext4 defaults 1 2 UUID=7faf9f94-f218-4497-9fa2-030c11f8d577 /data xfs defaults 0 0 UUID=9c230f26-8349-4153-b1d6-742a6a7b7088 swap swap defaults 0 0 #查詢以bash結尾的行 [root@centos82s data]$grep "bash$" passwd root:x:0:0:root:/root:/bin/bash dou:x:1000:1000:dou:/home/dou:/bin/bash admins:x:1001:1001::/home/admins:/bin/bash honghong:x:1002:1002::/home/honghong:/bin/bash lanlan:x:1003:1003::/home/lanlan:/bin/bash #位置匹配行 [root@centos82s data]$grep "^dou111$" f1.txt dou111 #詞首詞尾錨定 [root@centos82s data]$grep -n "\bdo" f1.txt 1:dou111 2:dou333333 3:dou555555555 4:dou7 5:dou [root@centos82s data]$grep -n "\bdou1" f1.txt 1:dou111 [root@centos82s data]$grep -n "\<dou1" f1.txt 1:dou111 [root@centos82s data]$grep -n "1\b" f1.txt 1:dou111 [root@centos82s data]$grep -n "1\>" f1.txt 1:dou111
♦ () 分組
♦ 後向引用:\1,\2,...
♦ \| 或者
♦ a\|b a或b
♦ C\|cat C或cat
♦ \(C\|c\)at Cat或cat
[root@centos82s data]$cat f1.txt doudoudoudou dououdououou oudoudoudoud #查看包含dou連續出現3次的行 [root@centos82s data]$grep "\(dou\)\{3\}" f1.txt doudoudoudou oudoudoudoud [root@centos82s data]$cat f1.txt cat c tomCat Tom dou Cat #查詢包含大寫C和cat的行 [root@centos82s data]$grep "C\|cat" f1.txt cat tomCat Cat #查詢Cat和cat的行 [root@centos82s data]$grep "\(C\|c\)at" f1.txt cat tomCat Cat [root@centos82s data]$grep "\(C\|c\)At" f1.txt [root@centos82s data]$
去掉了普通正則表達式的"\"轉義字符
♦ . 任意單個字符
♦ [] 指定範圍內的字符,如[dou],表示匹配d,o,u這三個字符中的任何一個
♦ [^] 排除[]中的字符,如[dou],表示匹配d,o,u 這個三個字符除外的任何一個
♦ [:alnum:] 字母和數字
♦ [:alpha:] 字母
♦ [:lower:] 小寫字母
♦ [:upper:] 大寫字母
♦ [:blank:] 空格和tab
♦ [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
♦ [:digit:] 十進制數字,即0-9
♦ [:xdigit:] 十六進制數字
♦ [:cntrl:] 不可打印的控制字符(退格、刪除...)
♦ [:graph:] 可打印的非空白字符
♦ [:print:] 可打印的字符
♦ [:punct:] 標點符號
用在要指定次數的字符後面,表明字符要出現的次數
次數匹配規則元字符
♦ * 匹配前面字符N次,包括0次
♦ ? 匹配前面字符0次或1次
♦ + 匹配前面字符至少1次
♦ {n} 匹配前面字符連續n次,n爲數字
♦ {m,n} 匹配前面字符次數要大於等於m,小於等於n
♦ ^ 行首錨定,用於模式的最左側
♦ $ 行尾錨定,用於模式的最右側
♦ \< 或 \b 詞首錨定,用於單詞模式的左側
♦ \> 或 \b 詞尾錨定,用於單詞模式的右側
♦ () 分組
♦ 後向引用:\1,\2,...
♦ | 或者
♦ a|b a或b
♦ C|cat C或cat
♦ (C|c)at Cat或cat
[root@centos82s data]$vim hello.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-07 #FileName: hello.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # #經典寫法 echo "hello,world" #流行寫法 echo "Hello,world!" #執行方法1 [root@centos82s data]$bash hello.sh hello,world Hello,world! #執行方法2 [root@centos82s data]$cat hello.sh|bash hello,world Hello,world! #執行方法3 [root@centos82s data]$bash < hello.sh hello,world Hello,world! #執行方法4,指定執行權限給hello.sh [root@centos82s data]$/data/hello.sh -bash: /data/hello.sh: Permission denied [root@centos82s data]$chmod +x hello.sh [root@centos82s data]$/data/hello.sh #絕對路徑 hello,world Hello,world! [root@centos82s data]$./hello.sh #相對路徑 hello,world Hello,world! #執行方法5,本方法能夠實現執行遠程主機的shell腳本 [root@centos82s ~]$cp /data/hello.sh /var/www/html [root@centos82s ~]$curl http://10.0.0.115/hello.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-07 #FileName: hello.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # #經典寫法 echo "hello,world" #流行寫法 eco "Hello,world!" echo "哈嘍我怎麼顯示了呢"
只檢測腳本中的語法錯誤,但沒法檢查出命令錯誤,不真正執行腳本
[root@centos82s data]$cat hello.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-07 #FileName: hello.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # #經典寫法 echo "hello,world #缺乏" #流行寫法 echo "Hello,world!" #-n,語法錯誤,命令不繼續執行 [root@centos82s data]$bash -n hello.sh hello.sh: line 16: unexpected EOF while looking for matching `"' hello.sh: line 17: syntax error: unexpected end of file #命令錯誤,命令繼續執行 [root@centos82s data]$./hello.sh hello,world ./hello.sh: line 16: eco: command not found 哈嘍我怎麼顯示了呢 #-x,檢查出錯的命令 [root@centos82s data]$bash -x hello.sh + echo hello,world hello,world + eco 'Hello,world!' hello.sh: line 16: eco: command not found + echo 哈嘍我怎麼顯示了呢 哈嘍我怎麼顯示了呢
總結:腳本常見錯誤有三種
♦ 語法錯誤,會致使後續的命令不繼續執行,能夠用bash -n檢查錯誤,提示的出錯行數不必定準確
♦ 命令錯誤,默認後續的命令還繼續執行,用bash -n 沒法檢查出來,可使用bash -x 進行觀察
♦ 邏輯錯誤,只能使用 bash -x 進行觀察
變量表示命名的內存空間,將數據放在內存空間中,經過變量名引用獲取數據
變量類型:
♦ 內置變量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,$?,HISTSIZE
♦ 用戶自定義變量
變量數據類型:
♦ 字符
♦ 數值:整型、浮點型、bash不支持浮點數
♦ 不能使用程序中的保留字和內置變量
♦ 只能使用數字、字母、下劃線,且不能以數字開頭,不支持「-」
♦ 統一命名規則:駝峯命名,studentname,大駝峯,StudengName,小駝峯,studentName
♦ 變量名大寫
♦ 局部變量小寫
、 ♦ 函數名小寫
標準劃分變量類型的生效範圍
♦ 普通變量:生效範圍爲當前shell進程;對當前shell以外的其它shell進程和其子shell進程均無效
♦ 環境變量:生效範圍爲當前shell進程及其子進程
♦ 本地變量:生效範圍爲當前shell進程中的某代碼片斷,一般指函數
變量賦值:
直接字符串: name="root"
變量引用: name="$USER"
命令引用: name=`COMMAND`` 或者 name=$(COMMADN)
注意:變量賦值是臨時生效,退出終端後,變量會自動刪除,腳本中的變量會隨着腳本結束
變量引用:$name 或 ${name}
弱引用和強引用
♦ "$name" 弱引用,其中變量會被替換爲變量值
♦ '$name' 強引用,變量不會替換爲變量值,保持原字符串
#賦值字符串 [root@centos82s ~]$NAME="小白" [root@centos82s ~]$echo $NAME 小白 [root@centos82s ~]$echo hello $NAME hello 小白 [root@centos82s ~]$echo "hello,$NAME" hello,小白 [root@centos82s ~]$echo 'hello,$NAME' hello,$NAME #變量引用 [root@centos82s ~]$USERNAME="$NAME" [root@centos82s ~]$echo $USERNAME 小白 #給變量賦值命令 [root@centos82s ~]$HOST=`hostname` [root@centos82s ~]$echo $HOST centos82s #顯示定義的全部變量 HOST=centos82s NAME=小白 USERNAME=小白 #刪除變量 [root@centos82s ~]$unset USERNAME
♦ 可使子進程或子子進程繼承父進程的變量,但父進程沒法使用子進程變量
♦ 子進程修改從父進程繼承的變量,新的值會傳遞給子子進程
♦ 通常使用在系統配置文件,腳本中不多使用
#聲明並賦值 [root@centos82s ~]$export name=小白 [root@centos82s ~]$echo $name 小白 [root@centos82s ~]$declare -x name=小黑 [root@centos82s ~]$echo $name 小黑 #先賦值,後設置爲環境變量 [root@centos82s ~]$name=小分 [root@centos82s ~]$export name [root@centos82s ~]$echo $name 小分 #顯示全部環境變量 [root@centos82s ~]$env [root@centos82s ~]$printenv [root@centos82s ~]$export [root@centos82s ~]$declare -x #刪除變量 [root@centos82s ~]$unset name
bash內建的環境變量
[root@centos82s ~]$echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@centos82s ~]$echo $SHELL /bin/bash [root@centos82s ~]$echo $USER root [root@centos82s ~]$echo $UID 0 [root@centos82s ~]$echo $HOME /root [root@centos82s ~]$echo $PWD /root [root@centos82s ~]$echo $SHLVL 1 [root@centos82s ~]$echo $LANG en_US.UTF-8 [root@centos82s ~]$echo $MAIL /var/spool/mail/root [root@centos82s ~]$echo $HOSTNAME centos82s [root@centos82s ~]$echo $HISTSIZE 1000
只讀變量:只能聲明定義,後續不能修改和刪除,即常量
#聲明變量並賦值 [root@centos82s ~]$readonly name="小明" [root@centos82s ~]$declare -r age="20" #不能修改和刪除 [root@centos82s ~]$name="小黑" -bash: name: readonly variable [root@centos82s ~]$unset name -bash: unset: name: cannot unset: readonly variable
位置變量:在bash shell中內置的變量,在腳本代碼中調用經過命令行傳遞給腳本的參數
♦ $0 命令自己,包括路徑
♦ $1,$2... 對應第一個,第二個參數,shint [n]換位置
♦ $* 傳遞給腳本的全部參數,全部參數合併爲一個字符串
♦ $@ 傳遞給腳本的全部參數,每一個參數爲獨立字符串
♦ $# 傳遞給腳本的參數個數
注意:$@ ,$* 只在被雙引號包裹起來的時候纔有差別
♦ set -- 清空全部位置變量
[root@centos82s data]$cat wz.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-08 #FileName: wz.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # #內置變量 echo "1var is $1" echo "2var is $2" echo "3var is $3" echo "10var is ${10}" echo "11var is ${11}" echo "The number of vaer is $#" echo "All vars are $*" echo "All vars are $@" echo "The scriptname is `basename $0`" [root@centos82s data]$bash wz.sh {a..z} 1var is a 2var is b 3var is c 10var is j 11var is k The number of vaer is 26 All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z The scriptname is wz.sh [root@centos82s data]$bash < . wz.sh {a..z} 1var is a 2var is b 3var is c 10var is j 11var is k The number of vaer is 26 All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z The scriptname is wz.sh #$*和$@的區別 [root@centos82s data]$cat f1.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-08 #FileName: f1.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # # echo "f1.sh:all args are $@" echo "f1.sh:all args are $*" bash file.sh "$*" [root@centos82s data]$cat f2.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-08 #FileName: f2.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # # echo "f2.sh:all args are $@" echo "f2.sh.all args are $*" bash file.sh "$@" [root@centos82s data]$cat file.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-08 #FileName: file.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # # echo "file.sh:1st arg is $1" [root@centos82s data]$bash f1.sh a b c f1.sh:all args are a b c f1.sh:all args are a b c file.sh:1st arg is a b c #把全部參數合併做爲一個字符串 [root@centos82s data]$bash f2.sh a b c f2.sh:all args are a b c f2.sh.all args are a b c file.sh:1st arg is a #仍是獨立的字符串參數
#建立一個腳本,輸出信息爲命令自己包括路徑 [root@centos82s data]$cat lin.sh #!/bin/bash # #************************************************************************* #Author: dadoudou #QQ: #Date: 2020-08-08 #FileName: lin.sh #URL: #Description: The test script #Copyright (C) 2020All rights reserved #************************************************************************* # # echo $0 #指定lin.sh文件的兩個軟鏈接 [root@centos82s data]$ln -s lin.sh lina.sh [root@centos82s data]$ln -s lin.sh linb.sh #同一文件的軟鏈接,執行的腳本相同,能夠實現不一樣的功能 [root@centos82s data]$bash lina.sh lina.sh [root@centos82s data]$bash linb.sh linb.sh
15.2.9 退出狀態碼
瀏覽網頁時會有表示網頁錯誤信息的數字,稱爲狀態碼,在shell腳本中也有相應狀態,進程執行 後,將使用變量$?保存執行後狀態碼的相關數字,不一樣的值反應成功或失敗,$?取值0-255
♦ 腳本中遇到exit命令,腳本會當即終止;終止退出狀態碼取決於exit命令後面的數字,可本身定義
♦ 若是沒有給腳本指定退出狀態碼,狀態碼取決於最後一條命令的狀態碼
♦ $?=0 #表明成功
♦ $?=[1-255] #表明失敗
[root@centos82s data]$echo $? 0 [root@centos82s data]$hostnamee -bash: hostnamee: command not found [root@centos82s data]$echo $? 127