命令歷史
shell進程會記錄用戶提交執行過的命令
可以是用history查看:
[root@localhost dev]# history 1 ss -tnl2 ifconfig3 vi /etc/sysconfig/network-scripts/ifcfg-ens33 4 reboot 5 systemctl stop firewalld6 systemctl disable firewalld7 ifconfig8 ifconfig9 startx 10 ping 114.114.114.114 11 top ...... 140 who -b 141 who -r 142 date 143 w 144 history
?
定制history的功能
HISTSIZE:shell進程可以保留的命令歷史的條數
[root@localhost dev]# echo $HISTSIZE1000
HISTFILE:持久保存命令歷史的文件,當退出登錄的時候,此次的命令歷史才會被寫入到HISTFILE中
[root@localhost dev]# echo $HISTFILE/root/.bash_history
[root@localhost dev]# cat /root/.bash_history ss -tnlifconfigvi /etc/sysconfig/network-scripts/ifcfg-ens33 reboot systemctl stop firewalld systemctl disable firewalldifconfigifconfigstartxping 114.114.114.114topifconfigifconfig --help type lstype ifconfig...... bash export nameecho $name bash
HISTFILESIZE:命令歷史文件的大小
[root@localhost dev]# echo $HISTFILESIZE1000
?
history常用命令用法
-c:清空命令歷史
-d offset:刪除指定命令歷史,offset為指定的行數
-r:從文件讀取命令歷史至歷史列表中
-w:把歷史列表中的命令追加至歷史文件中
history #:顯示最近的#條命令
?
調用命令歷史列表中的命令
!#:再次執行歷史列表中第#條命令
!!:再一次執行上一條命令
!STRING:再一次執行命令歷史列表中最近一個以STRING開頭的命令
?
調用上一條命令的最后一個參數
快捷鍵:按一下ESC再按點.
或者使用字符串:!$
?
控制命令的記錄方式
[root@localhost /]# echo $HISTCONTROL ignoredups
ignoredups:忽略重復的命令;
ignorespace:忽略以空白字符開頭的命令;
ignoreboth:以上兩者同時生效;
?
補全功能
命令補全
shell程序在接受到用戶執行命令的請求時,最左側的字符串會被當做命令
命令查找機制:首先查找內部命令,根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名
[root@localhost /]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
?使用Tab鍵補全
?
路徑補全
?在給定的起始路徑下,以對應路徑下的打頭字符串來逐一匹配起始路徑下每個文件
?
目錄管理類命令
mkdir
make directories 創建目錄
mkdir [OPTION]… DIRECTORY…
常用選項:
-p:自動按需創建父目錄
[root@localhost tmp]# mkdir -p /tmp/x/y/z [root@localhost tmp]# cd /tmp/x/y/z/[root@localhost z]#
?-v:顯示詳細過程,verbose
[root@localhost z]# mkdir -pv /tmp/a/b/cmkdir: created directory ‘/tmp/a’mkdir: created directory ‘/tmp/a/b’mkdir: created directory ‘/tmp/a/b/c’
-m MODE:直接給定權限
注意:路徑基名方為命令的作用對象,基名之前的路徑必須得存在
?
rmdir
remove empty direcories
移除空目錄
常用選項:
-p:刪除某目錄后,如果其父目錄為空,則一并刪除之
-v:顯示過程
[root@localhost b]# rmdir -pv /tmp/a/b/c/rmdir: removing directory, ‘/tmp/a/b/c/’rmdir: removing directory, ‘/tmp/a/b’rmdir: removing directory, ‘/tmp/a’rmdir: removing directory, ‘/tmp’rmdir: failed to remove directory ‘/tmp’: Device or resource busy
?
命令行展開
{}:可承載一個以逗號分隔的路徑,并能夠將其展開為多個路徑
例如:/tmp/{a,b}相當于 /tmp/a ?/tmp/b
例子:
如何創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b?
[root@localhost tmp]# mkdir -p /tmp/x/{y1/{a,b},y2}
如何創建a_c, a_d, b_c, b_d?
[root@localhost tmp]# mkdir -p /tmp/{a,b}_{c,d}
?如何創建如下目錄結構:
/tmp/mysysroot/ |-- bin|-- etc| `-- sysconfig| `-- network-scripts|-- sbin|-- usr| |-- bin| |-- lib| |-- lib64| |-- local| | |-- bin| | |-- etc| | |-- lib| | `-- sbin| `-- sbin `-- var|-- cache|-- log `-- run
mkdir -p /tmp/mysysroot/{bin,etc/sysconfig/networkscripts,sbin,usr/{bin,lib,lib64,local/{bin,etc,lib,sbin},sbin},var/{cache,log,run}}
?
?tree
?可使用tree來查看目錄的層級結構
?
-L #,指定要顯示的層級
?
?命令的執行狀態結果
bash通過狀態返回值來輸出此結果:
成功:0
失?。?-255
命令執行完成之后,其狀態返回值保存于bash的特殊變量$?中
[root@localhost tmp]# ls /tmp/x/y1 y2 [root@localhost tmp]# echo $?0[root@localhost tmp]# ls /tmp/yls: cannot access /tmp/y: No such file or directory [root@localhost tmp]# echo $?2
?
引用
?引用命令的執行結果:
?$(COMMAND)或者`COMMAND`
?
?強引用,單引號:
[root@localhost ~]# echo '$PATH'$PATH
?弱引用,雙引號:
[root@localhost ~]# echo "$PATH"/usr/local/sbin:/usr/loca
?
快捷鍵
ctrl+a:跳轉至命令行行首
ctrl+e:跳轉至命令行行尾
ctrl+u:刪除行首至光標所在處之間的所有字符
ctrl+k:刪除光標所在處至行尾的所有字符
ctrl+l:清屏,相當于clear
?
文件查看類命令
?cat
cat [OPTION]… [FILE]…
查看文件內容,直接顯示到文件底部
常用選項:
-n:可以顯示行數
[root@localhost tmp]# cat /etc/passwdroot: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/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...... gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
?
tac
tac [OPTION]… [FILE]…
反向查看文件內容
[root@localhost tmp]# tac /etc/passwdtcpdump:x:72:72::/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin ...... adm:x:3:4:adm:/var/adm:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin root:x:0:0:root:/root:/bin/bash
?
more
?分屏查看文件內容
?
head
head ?[OPTION]… [FILE]…
查看文件的前n行,默認為前10行
[root@localhost tmp]# head /etc/passwdroot: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/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown: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
?
tail
查看文件的后n行
tail ?[OPTION]… [FILE]…
[root@localhost tmp]# tail /etc/passwdcolord:x:992:987:User for colord:/var/lib/colord:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin setroubleshoot:x:991:986::/var/lib/setroubleshoot:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin sssd:x:990:985:User for sssd:/:/sbin/nologin gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
常用選項:
tail -n #:顯示最后#行或者是tail -#
-f:查看文件尾部內容,結束后不退出,跟隨顯示新增的行
?
stat
display file or file system status
文件:兩類數據
元數據:metadata,文件的狀態,創建時間,修改時間,大小,權限等
數據:文件里面的內容
[root@localhost tmp]# stat /etc/passwd File: ‘/etc/passwd’ Size: 2235 Blocks: 8 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 19840519 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:passwd_file_t:s0 Access: 2017-07-06 09:25:43.555083116 -0400Modify: 2017-07-01 08:00:52.140151303 -0400Change: 2017-07-01 08:00:52.141154779 -0400 Birth: -
stat顯示的就是文件的元數據,包含文件路徑,大小,blocks數目,IO block,文件類型,inode號,權限,uid,gid和三個時間戳等
三個時間戳:
access:最近一次訪問的時間
modify:最近一次修改文件的時間
change:文件最近一次改變的時間,即改變元數據的時間
?
touch
change file timestamps ?修改時間戳
touch [OPTION]… FILE…
文件不存在則創建文件,當直接使用命令去touch一個文件的時候,修改的是所有的時間戳
常用選項:
-c:指定的文件路徑不存在時不予以創建
-a:僅修改access time
-m:僅修改modify time
-t ? STAMP
? ? ? ?[[CC]YY]MMDDhhmm[.ss]
(不能修改change time,只當元數據發生變化時,才會改變)
[root@localhost tmp]# touch -t 201212121200.30 test.txt -m [root@localhost tmp]# stat test.txt File: ‘test.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty fileDevice: fd00h/64768d Inode: 17251556 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:user_tmp_t:s0 Access: 2017-07-07 03:17:12.640883844 -0400Modify: 2012-12-12 12:00:30.000000000 -0500Change: 2017-07-07 03:19:17.667997201 -0400 Birth: -[root@localhost tmp]#
?
文件管理工具
cp
復制文件或者目錄
單源復制:
cp [OPTION]… [-T] SOURCE DEST
如果DEST不存在,則先創建此文件,并復制源文件的數據流至DEST文件中
如果DEST存在:
? ? 如果DEST是非目錄文件,則覆蓋DEST文件
? ? 如果DEST是目錄文件,則在DEST目錄下創建一個與源文件同名的文件,并復制其數據
多源復制:
如果DIRECTORY不存在,則報錯
如果DIRECTORY存在:
? ? ?如果DIRECTORY是非目錄文件,則報錯
? ? ?如果DIRECTORY是目錄文件,分別復制每個文件至目標目錄中,并保持原名
常用選項:
-i:交互式復制
-f:強制覆蓋目標文件
-r,-R:遞歸復制目錄
-d:復制符號鏈接文件本身,而非指向的源文件
-a:-dR –preserve=all, archive,用于實現歸檔;
–preserv=
?? ? ? mode:權限
?? ? ?? ownership:屬主和屬組
?? ? ?? timestamps: 時間戳
?? ? ?? context:安全標簽
?? ? ?? xattr:擴展屬性
?? ? ?? links:符號鏈接
?? ? ?? all:上述所有屬性
?
mv
move
移動文件,可用來重命名文件
常用選項:
-i:交互式
-f:強制覆蓋文件
?
rm
remove
移除文件
rm [OPTION]… FILE…
常用選項:
-i:交互式移除文件
-f:強制刪除文件
-r:遞歸刪除
注意:所有不用的文件建議不要直接刪除,可以移動至某個專用的目錄(用來做回收站的目錄)
?
Globbing
文件名通配:是對整體文件名匹配,不是部分匹配
匹配字符:
*:匹配任意長度的任意字符
?:匹配任意單個字符
[ ]:匹配指定范圍內的任意單個字符‘
? ? ? [a-z],[A-Z],[0-9],[a-z0-9] ? 不區分大小寫
? ? ? 特殊格式:
? ? ?[[:upper:]]:所有大寫字母
? ? ?[[:lower:]]:所有小寫字母
? ? ?[[:alpha:]]:所有字母
? ? ?[[:digit:]]:所有數字
? ? ?[[:alnum:]]:所有的字母和數字
? ? ?[[:space:]]:所有空白字符
? ? ?[[:punct:]]:所有標點符號
[^]:中括號加托字符,匹配指定范圍外的任意單個字符
? ? ?[^0-9]:匹配數字之外的任意單個字符 ?
? ? ?[^[:upper:]]:匹配大寫字母以外的任意單個字符
練習:顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現一位任意字符的文件或目錄;
ls -d /var/l?[[:lower:]]
?練習:復制/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/conf.d/目錄下;
cp -r /etc/[mnrp]*.conf /tmp/conf.d/
?
IO重定向及管道
IO即輸入和輸出設備,可用于輸入的設備一般有鍵盤、文件系統上的常規文件、網卡等,可用于輸出的設備有顯示器、文件系統上的常規文件、網卡等;
程序的三種數據流:
輸入的數據流:標準輸入(stdin),鍵盤;
輸出的數據流:標準輸出(stdout),顯示器;
錯誤的輸出流:錯誤輸出(stderr),顯示器;
文件描述符:fd,file descriptor
標準輸入:0
標準輸出:1
錯誤輸出:2
?
?IO重定向
輸出重定向:
> ? ?覆蓋輸出
>> ? ?追加輸出
小特性:
set -C:禁止覆蓋輸出重定向至已存在的文件
set +C:開啟覆蓋輸出重定向至已存在的文件(默認)
錯誤輸出重定向:
2> ? ?覆蓋輸出
2>> ? ?追加輸出
合并正常輸出流和錯誤輸出流
1.
&> ? ?覆蓋輸出
&>> ? ?追加輸出
2.
COMMADN > /PATH/TO/somefile ?2>&1 :如果命令執行成功則覆蓋輸出至somefile,執行不成功也覆蓋輸出至somefile
COMMAND >> /PATH/TO/somefile 2>&1:如果命令執行成功則追加覆蓋至somefile,執行不成功也追加輸出至somefile
注意:特殊設備:/dev/null ?當不需要命令的執行結果,只需要知道命令的執行狀態,則可以重定向至/dev/null,/dev/null相當于一個垃圾桶。
輸入重定向:
Here Document:
[root@localhost tmp]# cat <<EOF> how are you> my name is Frank> EOF how are you my name is Frank
?
?tr
tr [OPTION]… SET1 [SET2]
把輸入的數據當中的字符,凡是在SET1定義范圍內出現的,通通對位轉換為SET2出現的字符,不修改原文件
用法1: tr SET SET2
?
用法2:tr -d SET1 ?
?
管道
連接程序,實現將前面一個命令的輸出直接定向后一個程序當做輸出數據流
COMMAND1 | COMMAND2 | COMMAND3 …
[root@localhost tmp]# echo 'abcd' | tr 'a-z' 'A-Z' | tr -d 'AD' BC
?顯示程序的輸出并將其復制到一個或多個文件中
[root@localhost tmp]# echo 'abcd' | tee /etc/fstab | tr 'ab' 'AB' ABcd [root@localhost tmp]# cat /etc/fstab abcd
?如上例子,使用tee命令輸出到/etc/fstab,又將標準輸入作為了后面tr的輸入。