命令歷史、文件類查看工具、文件和目錄類管理工具、通配符、IO重定向 ...
命令歷史
shell進程會記錄用戶提交執行過的命令
可以是用history查看:
[root@localhost dev]# history 1 ss -tnl 2 ifconfig 3 vi /etc/sysconfig/network-scripts/ifcfg-ens33 4 reboot 5 systemctl stop firewalld 6 systemctl disable firewalld 7 ifconfig 8 ifconfig 9 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 $HISTSIZE 1000
HISTFILE:持久保存命令歷史的文件,當退出登錄的時候,此次的命令歷史才會被寫入到HISTFILE中
[root@localhost dev]# echo $HISTFILE /root/.bash_history
[root@localhost dev]# cat /root/.bash_history ss -tnl ifconfig vi /etc/sysconfig/network-scripts/ifcfg-ens33 reboot systemctl stop firewalld systemctl disable firewalld ifconfig ifconfig startx ping 114.114.114.114 top ifconfig ifconfig --help type ls type ifconfig ...... bash export name echo $name bash
HISTFILESIZE:命令歷史文件的大小
[root@localhost dev]# echo $HISTFILESIZE 1000
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/c mkdir: 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
失敗:1-255
命令執行完成之後,其狀態返回值保存於bash的特殊變數$?中
[root@localhost tmp]# ls /tmp/x/ y1 y2 [root@localhost tmp]# echo $? 0 [root@localhost tmp]# ls /tmp/y ls: 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/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 ...... 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/passwd tcpdump: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/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常用選項: head -n #:顯示前#行或者是head -#
tail
查看文件的後n行
tail [OPTION]... [FILE]...
[root@localhost tmp]# tail /etc/passwd colord: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 file Device: fd00h/64768d Inode: 19840519 Links: 1 Access: (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 -0400 Modify: 2017-07-01 08:00:52.140151303 -0400 Change: 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 file Device: fd00h/64768d Inode: 17251556 Links: 1 Access: (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 -0400 Modify: 2012-12-12 12:00:30.000000000 -0500 Change: 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目錄下創建一個與源文件同名的文件,並複製其數據
多源複製:
cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE...如果DIRECTORY不存在,則報錯
如果DIRECTORY存在:
如果DIRECTORY是非目錄文件,則報錯
如果DIRECTORY是目錄文件,分別複製每個文件至目標目錄中,並保持原名
常用選項:
-i:互動式複製
-f:強制覆蓋目標文件
-r,-R:遞歸複製目錄
-d:複製符號鏈接文件本身,而非指向的源文件
-a:-dR --preserve=all, archive,用於實現歸檔;
--preserv=
mode:許可權
ownership:屬主和屬組
timestamps: 時間戳
context:安全標簽
xattr:擴展屬性
links:符號鏈接
all:上述所有屬性
mv
move
移動文件,可用來重命名文件
SYNOPSIS mv [OPTION]... [-T] SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY mv [OPTION]... -t DIRECTORY SOURCE...常用選項:
-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:<<,可以作為指定文件的結束符,常用於shell編程
[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 < /PATH/FROM/SOMEFILE
用法2:tr -d SET1 < /PATH/FROM/SOMEFILE 刪除SET1中的字元,區分大小寫
管道
連接程式,實現將前面一個命令的輸出直接定向後一個程式當做輸出數據流
COMMAND1 | COMMAND2 | COMMAND3 ...
[root@localhost tmp]# echo 'abcd' | tr 'a-z' 'A-Z' | tr -d 'AD' BC
tee
顯示程式的輸出並將其複製到一個或多個文件中
[root@localhost tmp]# echo 'abcd' | tee /etc/fstab | tr 'ab' 'AB' ABcd [root@localhost tmp]# cat /etc/fstab abcd
如上例子,使用tee命令輸出到/etc/fstab,又將標準輸入作為了後面tr的輸入。