一、序章
1.1 一些概念
-
字段分隔符
IFS是shell腳本中的一個重要概念,在處理文本數據時,它是相當有用的。IFS可以是White Space(空白鍵)、Tab( 表格鍵)、Enter( 回車鍵)中的一個或幾個。
IFS(Internal Field Seperator)在Linux的shell中預設的分隔符,用來把command line分解成word(字段)。
IFS的設置方法很簡單,和普通變量設置方法類似:
IFS=":"
建議設置IFS前保存原IFS的值,在使用后及時恢復。
1.2 shell常用快捷鍵
按鍵 | 解釋 |
---|---|
上下方向鍵 | 輸入欄填充歷史命令 |
tab鍵 | 自動補全命令、文件名 |
ctrl+w | 刪除前一個單詞【單詞首字母(符)到光標處】,在shell中以空格分隔單詞,在vi中以符號分隔 |
ctrl+u | 刪除一行(行首到光標處) |
獲取命令幫助,首選 man cmd
次選 cmd -h
cmd --help
1.3 shell特殊符號
符號 | 作用 |
---|---|
\ | 轉義字符,比如在行尾使用\可以轉義回車為換行,可以起下一行繼續使用命令 命令中使用\可以轉義空格,不必使用單雙引號聲明字符串參數 |
; | 順序地獨立執行各條命令, 彼此之間不關心是否失敗, 所有命令都會執行 分隔路徑?待考證 |
&& | 上一條命令成功后才執行下一條命令 |
& | 后台運行,不像Windows是同時執行命令 |
| | 管道 |
|| | 上一條命令失敗后才執行下一條命令 |
> | [cmd] > [file] 重定向,覆蓋,空格嚴格要求 |
>> | [cmd] >> [file] 重定向,追加,空格嚴格要求 |
~ | 用戶home目錄 |
cd - | 返回上一個操作目錄,-等同於 $OLDPWD 但是 - 只能在cd中使用,在其它命令中使用會被視為命令選項 |
! | 上一條命令,!^ !$ !* 上一條命令第一個、最后一個、所有參數!:n 上一條命令的第n個參數!s 打印並執行最近一條以s開頭的命令使用較少,感覺 !s 用法比較實用若要使用!作為邏輯非,有時需要\轉義 |
$ | 腳本中使用較多$$ Shell本身的PID(ProcessID)$! Shell最后運行的后台Process的PID$? 最后運行的命令的結束代碼(返回值)$- 使用Set命令設定的Flag一覽$* 所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。$@ 所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。$# 添加到Shell的參數個數$0 Shell本身的文件名$1~$n 添加到Shell的各參數值。$1是第1參數、$2是第2參數… |
1.4 獲取上一條命令的內容
有時我們寫命令時會想獲取上一條命令的輸出,簡單的我們可以使用管道,如果下一條命令無法從管道接收數據,我們可以使用xargs配合
但是有時我們想將上一條命令的輸出處理后再使用,那么管道不太合適
有兩種辦法,效果都一樣
-
`command`
反引號,執行命令,返回結果 -
$(command)
執行命令,返回結果,和上面不一樣的是,此方法支持嵌套 -
$?
特殊變量,但是這個只是返回值,大多為0或1,無法獲得命令行輸出
二、常用命令
2.1 防火牆
centos7防火牆是firewall
基本設置:https://www.cnblogs.com/heqiuyong/p/10460150.html
# 查看防火牆規則
firewall-cmd --list-all
# 查看防火牆所有開放的端口
firewall-cmd --zone=public --list-ports
# 查看防火牆狀態
firewall-cmd --state
systemctl status firewalld.service
# 開放端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent # 開放5672端口
firewall-cmd --zone=public --remove-port=5672/tcp --permanent #關閉5672端口
firewall-cmd --reload # 配置立即生效
開放端口(段)給指定IP(段)。如開放給局域網192.168.1.1-192.168.1.255。https://www.cnblogs.com/xiaohanlin/p/11641273.html
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080-8081" accept'
# 192.168.1.0表示網段,/24表示子網掩碼二進制中連續1的個數,所以/24即255.255.255.0
# 局域網(也可稱為“私網”或“Lan側”)通常情況都使用私有IP地址:
# A類:10.0.0.0-10.255.255.255
# B類:172.16.0.0-172.31.255.255
# C類:192.168.0.0-192.168.255.255
# 所以表示方式為
# 10.0.0.0/8
# 172.16.0.0/16
# 192.168.0.0/16
# 刪除上述規則:
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080" accept'
# 查看rich-rule規則:
firewall-cmd --permanent --list-rich-rule
開放服務,服務是端口和/或協議入口的組合。區域是定義的網絡連接的可信等級,此外永久、端口轉發參見:https://www.jianshu.com/p/90ed497f49cf
# 獲取所有支持的服務
firewall-cmd --get-services
# 查看開放的服務
firewall-cmd --list-services
# 向默認區域添加開放的服務
firewall-cmd --add-service=
# 刪除開放的服務
firewall-cmd --remove-service=
端口流量轉發。端口可以映射到另一台主機的同一端口,也可以是同一主機或另一主機的不同端口。端口號可以是一個單獨的端口
firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 例
firewall-cmd --add-forward-port='port=80:proto=tcp:toport=10050'
firewall-cmd --add-forward-port='proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080'
# 移除規則add改remove
2.2 進程和端口
# 查看監聽的端口
netstat -lnpt
# 檢查端口被哪個進程占用
netstat -lnpt |grep 5672
# 查看進程的詳細信息
ps 6832
# 中止進程
kill -9 6832
# 查找進程,前三列是UID、PID、PPID,最后一列是CMD
ps -ef|grep
# 殺死相關進程
ps -ef|grep ${0}|grep -v grep|cut -c 9-15|xargs kill -9
# ps -e 顯示所有進程 ; -f : 全格式 ; grep -v grep 結果中去掉含grep的一行,即搜索命令這個進程 ; cut -c 剪切指定字符,這里是提取進程號
# xargs 結合管道使用,將前面的值作為 kill -9 的參數
2.3 后台運行
當我們在終端運行程序時,程序不停,就會一直占用終端。如果關閉終端則程序也會停止
將程序放到后台運行,可以釋放終端,也不用擔心程序會終止
# 格式 nohup [cmd] [重定向] &
# 實例
nohup command > myLog.log 2>&1 & # 返回進程PID
# > myout.file將日志輸出到文件
# 2>&1,將標准錯誤輸出重定向到標准輸出,少了這條命令,錯誤信息不會被輸出到日志中,而是打印到屏幕上
# 1前有&表示重定向的目標不是一個文件,而是一個文件描述符 https://zhuanlan.zhihu.com/p/47765176
# 關閉后台進程只能找出PID然后kill -9
實際由nohup和&構成
&:后台運行,但當用戶退出(掛起)的時候,命令自動也跟着退出
nohup
: 即no hang up,不掛斷的運行
nohup命令可以將日志輸入到文件中,如果不指定輸出文件,默認輸出到當前目錄下的nohup.out文件,如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
其它后台運行的方法:
我們知道 ctrl+c
能結束當前進程。將當前進程 暫停 並放到后台是命令 CTRL+Z
,可暫停多個進程,終端退出進程退出
jobs
# 查看后台進程
# 也可以查看nohub運行的后台進程,注意:jobs只在當前shell有效,一旦關閉終端,再重開jobs無法查找出之前nohub運行的后台進程
fg
#將后台任務切換到前台執行。如果后台中有多個命令,可以用bg %jobnumber將選中的命令調出
bg
#將一個在后台暫停的命令,變成在后台繼續執行。如果后台中有多個命令,可以用bg %jobnumber將選中的命令調出
screen也可以實現后台運行,需要下載
2.4 文件查看
命令 | 解釋 | 常用選項 |
---|---|---|
cat | 輸出文件內容 | -n 顯示行號 |
head | 輸出文件前幾行 | -[numb] 輸出多少行 |
tail | 輸出文件后幾行 | -[numb] 輸出多少行 |
wc | 統計文件字數 | -l 行數;-w 字數;-c 字節數 |
grep | 查找文件內容,輸出匹配的行 | |
more | 瀏覽內容 | |
less | 瀏覽內容 |
我們可以用管道組合幾個命令來實現更多功能,比如查看文件第10和11行 cat a.txt|head -11|tail -2
,這存在一個小問題,就是大家搜文件習慣用cat開頭,其實沒必要,tail、grep都能接文件路徑,沒必要以cat開頭
查看文件中間幾行的最優解:sed -n '[numb],[numb]p' [文件名]
,記得第二數字后接字母p
詳說grep這個強大的命令
grep選項 | 解釋 |
---|---|
-n | 顯示行號 |
-i | 忽略大小寫地匹配 |
-v [string] | 反選,也可以理解為去掉某行 |
-G | 啟用基本正則表達 |
-E | 啟用擴展正則表達,grep -E也可以縮寫為egrep |
-A [numb] | 額外顯示每個匹配行之前[numb]行 |
-B [numb] | 額外顯示每個匹配行之后[numb]行 |
-C [numb] | 額外顯示每個匹配行之前之后[numb]行 |
more和less
單論瀏覽內容的話,cat是最拉跨的,全部輸出
more能翻頁瀏覽,空格往下,b鍵往上,= 顯示當前行號
less功能最為強大,能用pageup、down鍵上下翻頁,支持vi的 / ?搜索,支持 G 跳行,= 顯示行號
2.5 文件編輯 vi/vim sed
1) vi/vim
我們知道vi編輯文件時有三種工作模式

匯總一些好用的命令,命令模式和底行命令模式
按鍵 | 解釋 |
---|---|
u | 撤銷 |
. | 恢復 |
yy | 復制行 |
dd | 刪除行 |
p | 粘貼 |
ctrl+r | 重復上一個動作 |
~ | 更改大小寫 |
:set nu | 顯示所有行號 |
:set nonu | 取消顯示所有行號 |
nG | 移動到行號是n的一行 |
G | 移動到當前文件的最后一行 |
/[string] | 向后搜索 |
?[string] | 向前搜索 |
n | 重復之前的搜索 |
N | 反向重復之前的搜索 |
:set {list|nolist} | 顯示和取消顯示換行等特殊字符 |
:set fileformat={unix|dos} | 將文件格式轉成unix或dos格式 |
最后說說vi的特殊字符怎么輸入
-
Q:為什么需要輸入特殊字符?
A:可能是腳本中需要用到
-
Q:vi中有哪些特殊字符?
A:輸入
:help digraph-table
可以查看,如果是centos7,亂碼,可以發現打開的是.gz格式的幫助文檔,我們直接find搜索出這個gz文件,再gunzip解壓即可查看
char digraph hex dec official name ~
^@ NU 0x00 0 NULL (NUL)
^A SH 0x01 1 START OF HEADING (SOH)
^B SX 0x02 2 START OF TEXT (STX)
^C EX 0x03 3 END OF TEXT (ETX)
第一列為特殊字符,第二列為雙拼,第三列為十六進制表示, 第四列為十進制表示,第五列為該字符的官方名稱。
一些不能顯示的功能按鍵會以^加字符顯示在vi中,並有高亮顏色,直接輸是沒法生效的
-
Q:如何輸入特殊字符?
A:一是在 i 輸入模式下,ctrl+v就會出現高亮的^,按住不放再輸字符即可。
二是在 i 輸入模式下,ctrl+v就會出現高亮的^,松開后,再輸入十進制數即可,注意十進制數如果不滿3位,需要在前面補零
三是 ctrl+k 再加雙拼,但是博主 centos7 沒成功過
上述字符和十進制數都需要查表
2) sed命令
sed命令可以操作文本,默認情況下,sed會讀取文本並根據動作進行操作,結果會輸出在控制台,不會修改文件,使用 -i
選項可以修改文件
-n
默認情況下,sed 會在所有的腳本指定執行完畢后,會自動輸出處理后的內容,而該選項會屏蔽啟動輸出,需使用 print 命令(p動作)來完成輸出
sed的動作如下
動作 | 說明 | 使用 |
---|---|---|
a | 新增,在指定行的下一行,一般不用引號 | sed -i 4a\new\ line file.txt 4代表第四行,a代表新增 第一個反斜杠區分動作和動作參數,其實也可以用 4a\ new\ line "4a new line" 甚至 "4anew line" ,這都是作為一個參數給sed,最好分隔動作和字符串便於閱讀 |
i | 插入,在指定行的上一行 | 同上 |
s | 替換 | s/pattern/replacement/flags 除了/也可以用 # % 等符號作分隔每一行都會進行一次匹配和替換,默認啟用正則,因為有正則符號,所以一般用引號 常用flags:g,表示所有匹配的都進行替換,默認只替換每行的第一個匹配 n,數字,表示從第幾個匹配才開始替換,也可和g一起使用,如2g |
用數字模式指定區間 | 指定動作在哪行執行 | 2代表第二行;2,4代表第二到第四行,包括第四行;2,$表示第二行到最后一行;3~2表示從第三行開始,每后兩行,即每隔一行,即3和后面的奇數行;1~1表示從第一行開始,每后一行,即整個文件 |
用文本模式指定區間 | 指定動作在哪行執行 | sed '/123/ihello' 1.txt 在包含123的行之前插入hello,如果有多行包含123,則包含123的每一行之前都會插入hello |
! | 反選 行 | 可能需要\轉義! |
p | 會打印與替換命令中指定的模式匹配的行,此標記通常與 -n 選項一起使用 | sed -n 5,$p file.txt 打印第五行到最后一行 |
2.6 其它雜項
-
echo字符轉義
echo -e "\n"
,-e開啟字符轉義 -
cp強制覆蓋
\cp -rf [src] [dest]
反斜杠是直接使用cp命令,而非~/.bashrc
中的-i別名
三、使用技巧
3.1 自定義快捷指令
即重命名命令,編輯用戶家目錄下的 .bashrc 文件,添加,例如
alias tr='tree --dirsfirst -Cpu -L 2'
運行 source .bashrc
生效
使用時還可以繼續追加選項,如 tr -t,就等於 tree --dirsfirst -Cpu -L 2 -t