[TOC]linux
shell是一個命令解釋器,提供用戶和機器之間的交互(shell腳本是shell的一種表現)正則表達式
.bash_history
存放命令記錄的文件,若是終端非exit,logout正常退出,命令會記錄不全。HISTSIZE
, 查看 echo $HISTSIZE
若是顯示超過1000,是由於命令暫時存在內存中,還沒寫進文件,history-c
可清空內存裏記錄,可是不會清除.bash_history
裏的記錄/etc/profile
中修改,要修改後當即生效從新進終端或執行 source /etc/profile
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
增長此變量,可記錄對應命令的執行時間, 例: 1005 2019/11/12 10:29:47 w
chattr +a ~/.bash_history
即便超過1000條也沒有權限刪除yum install -y bash-completion
須要重啓系統生效 systemctl restart network
alias restartnet="systemctl restart network"
取消alias:unalias restartnet
~/.bashrc
自定義的alias放到~/.bashrc
shell
# .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias restartnet="systemctl restart network" # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi
sleep 100 &
a='a b c'
裏面帶空格要用單引號括起來 [root@mydb1 ~]# a="a$bc" [root@mydb1 ~]# echo $a a [root@mydb1 ~]# a='a$bc' [root@mydb1 ~]# echo $a a$bc 在取值時,單引號和雙引號結果不同,因此在取值時要用單引號
[root@mydb1 ~]# a=1 [root@mydb1 ~]# b=2 [root@mydb1 ~]# echo $a$b 12 [root@mydb1 ~]# a='a$bc' [root@mydb1 ~]# echo $a$b a$bc2 [root@mydb1 ~]# c="a$bc" [root@mydb1 ~]# echo $c a [root@mydb1 ~]# c="a$b"c [root@mydb1 ~]# echo $c a2c
全局變量export b=2vim
[root@mydb1 ~]# w 14:44:15 up 24 days, 23:49, 2 users, load average: 0.07, 0.04, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.182 10:18 7:11 0.37s 0.37s -bash root pts/1 192.168.1.182 14:44 0.00s 0.03s 0.01s w [root@mydb1 ~]# echo $SSH_TTY 查看當前終端的tty /dev/pts/1
[root@localhost ~]# yum -y install psmisc [root@localhost ~]# pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─VGAuthService ├─agetty ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─master─┬─pickup │ └─qmgr ├─polkitd───6*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─vmtoolsd [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# bash //bash命令進入到子shell [root@localhost ~]# pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─VGAuthService ├─agetty ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─master─┬─pickup │ └─qmgr ├─polkitd───6*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───bash───bash───pstree //這裏能夠看出在子shell上執行了pstree命令 ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─vmtoolsd [root@localhost ~]# a=linux [root@localhost ~]# echo $a linux [root@localhost ~]# bash [root@localhost ~]# echo $a 非全局變量下,進入子shell,沒法獲取父shell中a=linux的值,這是由於在非全局變量下,當前定義的變量只在當前shell中生效,而不能在子shell生效 [root@localhost ~]# export b=123 父shell下定義全局變量 b=123,這樣定義全局變量只在當前終端有效,從新打開新的終端無效。 [root@localhost ~]# echo $b 123 [root@localhost ~]# bash 進入子shell,仍然能夠得到父shell定義的b=123的值 [root@localhost ~]# echo $b 123 [root@localhost ~]# export c=456 在子shell中定義c=456 [root@localhost ~]# echo $c 456 [root@localhost ~]# exit 退出子shell進入父shell exit [root@localhost ~]# echo $c 在父shell中沒法得到在子shell中定義c=456的值,父shell與子shell的關係是從上到下的,而不能從下到上
unset b
unset 變量名/etc/profile
用戶環境變量,交互,登陸才執行,輸入用戶名,ip,port,密碼就會自動加載,而後profile又會自動的調用bashrc。/etc/bashrc
用戶不用登陸,執行shell就生效,只要執行shell腳本,就會調用bashrc裏面的配置~/.bashrc
~/.bash_profile
. .bash_profile或者source .bash_profile~/.bash_history
~/.bash_logout
定義用戶退出時須要作出的一些動做,好比:退出時刪除命令歷史,就可把刪除歷史命令的命令,放在.bash_logout裏面PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
vim /etc/bashrc
裏定義 * 任意個任意字符
? 任意一個字符
# 註釋字符
\ 脫義字符
要使c='$a$b'的結果爲$a$b除了加單引號,還可使用脫意符c=\$a\$b。| 管道符
cut 分割
,-d 分隔符 -f 指定段號 -c 指定第幾個字符
[root@localhost ~]# cat /etc/passwd |head -2 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1 root bin [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1,2 root:x bin:x [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1,5 root:root bin:bin [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1-5 root:x:0:0:root bin:x:1:1:bin [root@localhost ~]# cat /etc/passwd |head -2 |cut -c 4 t :
sort 排序
, -n 以數字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
[root@localhost ~]# cat /etc/passwd |head -4 |sort adm:x:3:4:adm:/var/adm:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/root:/bin/bash [root@localhost ~]# cat /etc/passwd |head -4 |sort -n adm:x:3:4:adm:/var/adm:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/root:/bin/bash [root@localhost ~]# cat /etc/passwd |head -4 |sort -nr root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
wc -l 統計行數
-m 統計字符數 -w 統計詞centos
[root@localhost ~]# cat 1.txt 內容有6個字符 123 abc [root@localhost ~]# cat -A 1.txt 123$ abc$ [root@localhost ~]# wc -m 1.txt 8 1.txt 統計有8個字符,不要忘記隱藏的換行符
[root@localhost ~]# cat 1.txt
123
abc ,f23
[root@localhost ~]# wc -w 1.txt 統計多少個詞,以空格區分
3 1.txtbash
uniq 去重
, -c統計行數ssh
[root@localhost ~]# uniq 1.txt 直接uniq沒有去重 123 abc ,f23 123 abc 1 2 1
[root@localhost ~]# sort 1.txt |uniq 去重首先要排序,uniq一般要與sort一塊兒使用
1
123
2
abc
abc ,f23ide
[root@localhost ~]# sort 1.txt |uniq -c 先排序再去重再統計行數
2 1
2 123
1 2
1 abc
1 abc ,f23centos7
tee 和 > 相似
,重定向的同時還在屏幕顯示rest
[root@localhost ~]# cat 1.txt 123 abc ,f23 123 abc 1 2 1
[root@localhost ~]# sort 1.txt |uniq -c |tee a.txt |tee的做用至關於>,可是它會把重定向的內容顯示在屏屏幕上
2 1
2 123
1 2
1 abc
1 abc ,f23
[root@localhost ~]# sort 1.txt |uniq -c |tee -a a.txt |tee -a 至關於>>
2 1
2 123
1 2
1 abc
1 abc ,f23
[root@localhost ~]# cat a.txt
2 1
2 123
1 2
1 abc
1 abc ,f23
2 1
2 123
1 2
1 abc
1 abc ,f23
tr 替換字符
,tr 'a' 'b',大小寫替換tr '[a-z]' '[A-Z]'
[root@localhost ~]# echo "aminglinux" |tr 'a' 'A' 替換單個 Aminglinux [root@localhost ~]# echo "aminglinux" |tr '[al]' '[AL]' 替換多個 AmingLinux [root@localhost ~]# echo "aminglinux" |tr '[a-z]' '[A-Z]' 替換指定範圍 AMINGLINUX [root@localhost ~]# echo "aminglinux" |tr '[a-z]' '1' 也能夠替換成數字 1111111111
split 切割
,-b大小(默認單位字節),-l行數, -d添加數字後綴
[root@localhost test]# split -b 2M 2.txt 指定切割後每一個文件的大小 [root@localhost test]# ls 2.txt xaa xab xac xad xae [root@localhost test]# ll -h 總用量 20M -rw-r--r--. 1 root root 10M 2月 24 08:57 2.txt -rw-r--r--. 1 root root 2.0M 2月 24 09:04 xaa -rw-r--r--. 1 root root 2.0M 2月 24 09:04 xab -rw-r--r--. 1 root root 2.0M 2月 24 09:04 xac -rw-r--r--. 1 root root 2.0M 2月 24 09:04 xad -rw-r--r--. 1 root root 2.0M 2月 24 09:04 xae [root@localhost test]# split -b 2M 2.txt 2019. 指定切割後每一個文件的大小以及文件的前綴 [root@localhost test]# ls 2019.aa 2019.ab 2019.ac 2019.ad 2019.ae 2.txt xaa xab xac xad xae [root@localhost test]# split -l 10000 2.txt 201911. 指定切割文件的行數以及文件的前綴 [root@localhost test]# ls 201911.aa 201911.ab 201911.ac 201911.ad 201911.ae 201911.af 201911.ag 201911.ah 2.txt
[root@localhost test]# for i in `seq 1 10` > do > echo $i > done 1 2 3 4 5 6 7 8 9 10 [root@localhost test]# for i in `seq 1 10`; do echo $i; done [root@localhost test]# ls 2.txt ; wc -l 2.txt 2.txt 77517 2.txt
> >> 2> 2>> &>
[ ]
指定字符中的一個,[0-9],[a-zA-Z],[abc]|| 和 && ,用於命令之間
[root@localhost test]# ls 2.txt || wc -l 2.txt 2.txt [root@localhost test]# ls 2a.txt || wc -l 2.txt ls: 沒法訪問2a.txt: 沒有那個文件或目錄 77517 2.txt || 若是前面執行成功,就不執行後面。若是前面執行不成功,纔會執行後面
[root@localhost test]# ls 2a.txt && wc -l 2.txt
ls: 沒法訪問2a.txt: 沒有那個文件或目錄
[root@localhost test]# ls 2.txt && wc -l 2.txt
2.txt
77517 2.txt
前面執行不成功,後面就不會去執行,前面執行成功,後面纔會去執行
[root@localhost test]# [ -d aminglinux ] || mkdir aminglinux[root@localhost test]# ls201911.aa 201911.ac 201911.ae 201911.ag 2.txt201911.ab 201911.ad 201911.af 201911.ah aminglinux[root@localhost test]# [ -d aminglinux ] && mkdir aminglinuxmkdir: 沒法建立目錄"aminglinux": 文件已存在