Shelllinux
shell是一個命令解釋器,提供用戶和機器之間的交互正則表達式
支持特定語法,好比邏輯判斷、循環shell
每一個用戶均可以有本身特定的shellvim
CentOS7默認shell爲bash(Bourne Agin Shell)緩存
還有zsh、ksh等bash
命令歷史
網絡
history 最多能夠存一千條,若是不正常退出(exit,logout)命令歷史保存的就不會完整的保存ssh
文件路徑:ls /root/.bash_history#cat /root/.bash_historyide
由echo $HISTSIZE 環境變量配置規定spa
如何修改這個數值編輯它的配置文件,vi /etc/profile,/搜到HISTSIZ它能夠修改,必須退出終端或者輸入命令source /etc/profile纔會生效
history -c #能夠把當前內存裏的命令歷史的緩存清空,但並不會刪除存命令的配置文件
history 僅僅是顯示的命令的ld,如何記錄一條命令它是什麼時間運行的,能夠運行這條命令:HISTTIM EFORMAT= "%Y/%m/%d %H:%M:%S " 但只是在當前終端生效
永久生效須要編輯配置文件:vim /etc/profile
/搜索一下HISTSIZE
把命令HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "放到那,以下圖
source /etc/profile#生效
chattr +a ~/.bash_history #永久保存命令歷史,不讓別人刪除
!! #兩個歎號意思是上一條命令,命令歷史最後一條命令
!n #運行指定的命令,n表示數字,假如說我想運行第936條命令
936 ls 937 yum history 938 history 939 echo $HISTSIZ 940 echo $HISTSIZE 941 logout 942 exit 943 history [root@aaa-01 ~]# !936 ls 111 1_heard.txt 1.txt.xz 2.txt 2.txt.xz 999 9.txt anaconda-ks.cfg a.txt
!echo #在命令歷史裏邊倒着找第一個以echo開頭的命令,正好是940條
940 echo $HISTSIZE 941 logout 942 exit 943 history 944 ls 945 echo $HISTSIZE 946 history [root@aaa-01 ~]# !echo echo $HISTSIZE 1000
命令補全和別名
tab鍵,敲一下,敲兩下
命令、參數補全須要先安裝:yum install -y bash-completion
重啓生效:reboot
alias別名給命令從新起個名字,例如你把重啓網絡服務的命令定義成restartnet
取消別名:unalias 加定義的別名
alias在哪裏定義的?
第一個地方是用戶的家目錄下~/.bashrc文件
第二個是: ls /etc/profile.d/
自定義的alias放到~/.bashrc
reboot重啓一下
alias別名給命令從新起個名字
通配符
· Is *.txt 以.txt結尾的文件
[root@aaa-01 ~]# ls *.txt 1_heard.txt 2.txt 9.txt a.txt [root@aaa-01 ~]# ls *txt 1_heard.txt 2.txt 9.txt a.txt [root@aaa-01 ~]# ls *txt* 1_heard.txt 1.txt.xz 2.txt 2.txt.xz 9.txt a.txt [root@aaa-01 ~]# ls 1* 1_heard.txt 1.txt.xz 111: yum.log
· Is ?.txt 一個任意的字符,bb就不行,
· Is [0-9].txt 0到9範圍內的,[23]就是2和3,2或者3,有一個3也行,有一個2也行,二者有一個知足就行
或者:ls [a-z].txt ls [A-Z].txt ls [0-9a-zA-Z].txt
[root@aaa-01 ~]# ls [a-z].txt a.txt [root@aaa-01 ~]# ls [A-Z].txt ls: 沒法訪問[A-Z].txt: 沒有那個文件或目錄 [root@aaa-01 ~]# ls [0-9a-zA-Z].txt 2.txt 9.txt a.txt [root@aaa-01 ~]#
· Is {1,2}.txt 這個範圍當中的一個「或」的意思
[root@aaa-01 ~]# ls {2,a}.txt 2.txt a.txt [root@aaa-01 ~]# [root@aaa-01 ~]# ls {2,a,3,9}.txt ls: 沒法訪問3.txt: 沒有那個文件或目錄 2.txt 9.txt a.txt
輸出重定向
>解釋:重定向的意思,把前面這個文件的輸出結果直接輸入到後邊這個文件裏邊去,
· cat 1 .txt > 2.txt 把1.txt裏的內容重定向到2.txt裏邊去,>它會把文件內容刪除掉重寫
>>追加的意思,它不會把你原來的內容刪除,例如cat 1.txt >> 2.txt ,把1.txt的內容追加到2.txt中
2>解釋:錯誤重定向它會把命令產生的錯誤信息指定輸出到文件裏去
例如輸入錯誤命令Isaaa,而後把它的結果輸入到a.txt
[root@aaa-01 ~]# lsaaa 2> a.txt [root@aaa-01 ~]# cat a.txt -bash: lsaaa: 未找到命令 [root@aaa-01 ~]#
2>>錯誤追加劇定向
[root@aaa-01 ~]# lsaaa 2>> a.txt [root@aaa-01 ~]# cat a.txt -bash: lsaaa: 未找到命令 -bash: lsaaa: 未找到命令 [root@aaa-01 ~]#
正確和錯誤也能夠一塊兒使用
&>正確的和錯誤的結合
輸入重定向
<解釋:輸入重定向,把右邊的一個文件或者文件的內容輸入到左邊的一個命令裏邊去,左邊只能是命令不能是文件
例如:wc -l < a.txt,意思是查看a.txt的行數 ,或者查看a.txt的大小du -sh < a.txt
管道符
管道符:把一個文件的輸出的內容傳遞給後邊的命令
例如:查看1.txt有多少行cat 1.txt |wc -l ; cat 1.txt |grep 'aaa' 首先把1.txt的內容輸出出來,再交給後邊的命令。grep過濾指定關鍵詞的命令,只要含有aaa的都過濾出來
[root@aaa-01 ~]# cat 1.txt |wc -l 5 [root@aaa-01 ~]# cat 1.txt |grep 'aaa' aaa
做業控制
ctrl+z #暫停一個任務 fg #調回來 假如說你在編輯1.txt文件忽然想查看一下當前目錄下的東西
[root@aaa-01 ~]# vim 1.txt [1]+ 已中止 vim 1.txt [root@aaa-01 ~]# ls 111 1.txt 2.txt 999 anaconda-ks.cfg 1_heard.txt 1.txt.xz 2.txt.xz 9.txt a.txt [root@aaa-01 ~]# fg
ctrl+z #支持中止多個任務
jobs查看後臺的任務
[root@aaa-01 ~]# jobs [1]- 已中止 vim 1.txt [2]+ 已中止 vim a.txt
bg[id]把任務調到後臺,而且運行,直接bg執行的是最後的任務
若是他是動態的任務,他的輸出還會在屏幕上顯示,可是你能夠輸命令
fg[id]把任務調到前臺
[root@aaa-01 ~]# jobs [1] 運行中 sleep 200 & [2]- 已中止 sleep 100 [3]+ 已中止 sleep 300 [root@aaa-01 ~]# fg 3 sleep 300
sleep 100 中止100秒什麼都不幹
命令後面加&直接丟到後臺運行
變量
PATH,HOME,PWD,LOGNAME
env命令能夠獲取到系統的經常使用變量,=等號左邊是變量的名字(變量名=變量),系統的變量一般都是大寫的字母,變量的值就不必定了,多是字母多是字符串,多是數字
[root@aaa-01 ~]# env XDG_SESSION_ID=1 HOSTNAME=aaa-01 SELINUX_ROLE_REQUESTED= TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.232.1 55022 22 SELINUX_USE_CURRENT_RANGE= SSH_TTY=/dev/pts/0 USER=root
set命令也能夠查看變量,不只查看系統變量還能夠查看用戶自定義的變量,
自定義變量例如a=111,但他不是系統變量只是用戶自定義的變量,只能在set查看的變量裏找到在env裏找不到
[root@aaa-01 ~]# a=111 [root@aaa-01 ~]# echo $a 111
變量名規則:字母、數字下劃線,首位不能爲數字
[root@aaa-01 ~]# a1=2 [root@aaa-01 ~]# a_1=3 [root@aaa-01 ~]# _a1=4 [root@aaa-01 ~]# echo $a1 2 [root@aaa-01 ~]# echo $a_1 3 [root@aaa-01 ~]# echo $_a1 4 #首位是數字就會報錯 [root@aaa-01 ~]# 1aa=2 -bash: 1aa=2: 未找到命令 [root@aaa-01 ~]# 2aa=3 -bash: 2aa=3: 未找到命令
變量值有特殊符號時須要用單引號括起來
[root@aaa-01 ~]# a=a b c -bash: b: 未找到命令 [root@aaa-01 ~]# a='a b c' [root@aaa-01 ~]# echo $a a b c
變量的累加用$
[root@aaa-01 ~]# a='a$bc' [root@aaa-01 ~]# b='1$23' [root@aaa-01 ~]# echo $a$b a$bc1$23
自定義成多個變量組成的變量時用「」雙引號,單引號識別不出來
[root@aaa-01 ~]# a=123 [root@aaa-01 ~]# b=bc [root@aaa-01 ~]# c='$a$b' [root@aaa-01 ~]# echo $c $a$b [root@aaa-01 ~]# c="$a$b" [root@aaa-01 ~]# echo $c 123bc
或者把變量單獨引發來「」
[root@aaa-01 ~]# b=bc [root@aaa-01 ~]# c=a"$b"c [root@aaa-01 ~]# echo $c abcc
還能夠這麼寫,根據上邊定義好的ab變量,在單獨想加個c
[root@aaa-01 ~]# c="$a$b"c [root@aaa-01 ~]# echo $c a$bc1$23c
自定義的變量只能在當前終端生效,新打開的不會生效
全局變量
sshd——sshd——bash——pstree #咱們遠程登陸sshd經過與sshd得到了一個bash,而後咱們又在這個終端下運行了一個bash
當咱們在登陸一個子shell的時候發現他不能得到自定義變量的值了,這叫作非全局變量或者叫作本地變量僅僅在你終端下生效
如何把它設置成全局變量用命令:export b=2,這樣無論你在子目錄下仍是子子目錄下都會生效
可是新打開一個終端仍是不會生效由於他們的sshd爲並列關係
它所謂的全局變量指的是向下的,在你這個shell的基礎上去生成子shell子子shell的時候定義的全局變量纔會生效
可是你在子shell中定義了一個全局變量,而後往上退一級到shell下來時就不生效了,全局變量是不會向上全局的
unset #取消自定義變量,後邊跟變量名
環境變量配置文件
/etc/profile 用戶環境變量,交互,登陸才執行
/etc/bashrc 用戶不用登陸,執行shell就生效
~/.bashrc
~/.bash_profile
~/.bash_history
~/.bash_logout
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
特殊符號
* 通配符,任意個任意字符例如: *.txt a.*
? 任意一個字符 ?.txt1也行a也行 只要是一個字符就行
# 註釋字符,不生效
\ 脫義字符
| 管道符
幾個和管道符有關的命令
cut 分割,-d 分隔符 -f 指定段號 -c 指定第幾個字符
root@aaa-01:~# cat /etc/passwd |head -2 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin root@aaa-01:~# cat /etc/passwd |head -2 |cut -d ":" -f 1 root bin root@aaa-01:~# cat /etc/passwd |head -2 |cut -d ":" -f 1,2 root:x bin:x root@aaa-01:~# cat /etc/passwd |head -2 |cut -d ":" -f 1-3 root:x:0 bin:x:1 root@aaa-01:~# cat /etc/passwd |head -2 |cut -c 1 r b root@aaa-01:~# cat /etc/passwd |head -2 |cut -c 2 o i
sort 排序, 默認按照ASCII排序
-n 以數字排序若是有字母她會認爲是0
-r反序最大的在前邊最小的在後邊 -t 分隔符 -kn1/-kn1,n2
root@aaa-01:~# sort -n 1.txt > } adm:x:3:4:adm:/var/adm:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin root:x:0:0:root:/root:/bin/bash #$saasd sync:x:5:0:sync:/sbin:/bin/sync 2233 111222 121333 root@aaa-01:~# sort -nr 1.txt 121333 111222 2233 sync:x:5:0:sync:/sbin:/bin/sync #$saasd root:x:0:0:root:/root:/bin/bash mail:x:8:12:mail:/var/spool/mail:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin } >
wc
wc -l 統計行數
wc -m 統計字符數,會統計隱藏的換行符$
wc -w 統計詞,以空白字符做爲分隔符
原本咱們寫了6個字符123abc,咱們在wc -m 的時候其實他會算上換行符$,cat -A查看文件全部的東西包括隱藏的
uniq 去重,它須要先先排序纔會去重複,跟sort結合使用,-c統計行數
root@aaa-01:~# sort 2.txt 1 1 123 2 abc root@aaa-01:~# sort 2.txt |uniq 1 123 2 abc root@aaa-01:~# sort 2.txt |uniq -c 2 1 1 123 1 2 1 abc
tee 和>重定向相似,但它重定向的同時還在屏幕顯示加一個管道符 |
root@aaa-01:~# cat 2.txt |tee 1.txt 123 abc 1 2 1 root@aaa-01:~# cat 1.txt 123 abc 1 2 1
-a追加
root@aaa-01:~# cat 2.txt |tee -a 1.txt 123 abc 1 2 1 root@aaa-01:~# cat 1.txt 123 abc 1 2 1 123 abc 1 2 1
tr 替換字符,tr 'a' 'b',大小寫替換tr '[a-z]' '[A-Z]'
split 切割,-b大小(默認單位字節),-l行數
特殊符號
$ 變量前綴,!$組合,正則裏面表示行尾
;多條命令寫到一行,用分號分割
[root@aaa-01 ~]# ls -l 1.txt; wc -l 2.txt -rw-r--r--. 1 root root 28 5月 30 11:14 1.txt 5 2.txt
~ 用戶家目錄,後面正則表達式表示匹配符
& 放到命令後面,會把命令丟到後臺
> >> 2> 2>> &>
[ ] 指定字符中的一個,[0-9],[a-zA-Z],[abc]
|| 和 && ,用於命令之間
||只有在前邊的命令執行不成功的時候纔會執行後邊的命令
[ -d aminglinux ]表示判斷是一個目錄是否存在,若是不存在就建立aminglinux目錄
&&只有在第一條命令對的成功的時候纔會執行第二條命令
由於aminglinux目錄已經存在了因此因此不會執行的二條命令