第1章 find 按照時間查找
1.1 時間查找
-mtime
-ctime
-atime
語法格式: 經常用來處理日志(日志不重要 或者只保留7天的日志)
find /oldboy -type f -mtime +n(n是數字 代表天的意思)
+7 7天前被修改過的文件
-7 7天內被修改過的文件
-mtime 1 文件的修改時間為距離當前時間1天 24-48小時的文件
-mtime 0 文件的修改時間為距離當前時間不到1天 24小時之內的文件
-mtime +1 文件的修改時間為距離當前時間2天 48小時以前的文件
-mtime -1 文件的修改時間為距離當前時間小於1天的文件 24小時內的文件
[root@oldboyedu-lnb ~]# touch 1day.txt [root@oldboyedu-lnb ~]# ll total 0 -rw-r--r-- 1 root root 0 Aug 5 09:16 1day.txt -rw-r--r-- 1 root root 0 Jul 25 00:00 oldboy.txt drwxr-xr-x 2 root root 36 Aug 4 11:50 test -rw-r--r-- 1 root root 0 Jul 25 00:00 test.txt [root@oldboyedu-lnb ~]# find ./ -type f -mtime +7 ./test.txt ./oldboy.txt [root@oldboyedu-lnb ~]# find ./ -type f -mtime -7 ./1day.txt [root@oldboyedu-lnb ~]# find ./ -type f -mtime 0 ./1day.txt [root@oldboyedu-lnb ~]# find ./ -type f -mtime -1 ./1day.txt
常見面試題: 查找/var/log/data/下修改時間為7天前文件並刪除
find ./ -type f -mtime +7|xargs rm find ./ -type f -mtime +7|xargs -i cp {} /tmp
1.2 !在find中取反 === -no
[root@oldboyedu-lnb test]# find ./ ! -type f # 查找文件 取反后查找 除文件外所有類型 find查找inode刪除 [root@oldboyedu-lnb ~]# rm -f `find ./ -inum 33575024`
第2章 通配符
2.1 shell的內置功能
查找文件名 而不是查看過濾文件內容
Linux的命令都支持通配符
$()和`` 相同
.. #當前目錄的上一級目錄
! #find 與awk 中表示取反,linux 命令行表示歷史記錄? #任意一個字符,通配符
# #表示注釋
| #管道,或者(正則)
$ #以..結尾(正則),$LANG $取變量內容
^ #以…..開頭(正則)
~ #當前用戶的家目錄
``(反引號) $() #引用命令的結果
&& 並且 同時成立
[] #表示一個范圍,集合 [abcdefg] [a-g] (正則,通配符) {} #產生一個序列,(通配符)
命令1|命令2 ###管道符號 傳遞的是普通的字符串,文本 來自於前一個命令
|xargs ###管道符號 與xargs 傳遞的是把字符串變成了 文件名
. #當前目錄,任意一個字符(正則)
.. #當前目錄的上一級目錄
* #任意0 個或多個字符(文本)(通配符)
> #輸出重定向 會清空原來的內容 然后在向文件里面追加內容
>> #追加輸出重定向 追加到文件的最后一行
< #輸入重定向 tr xargs
<< #cat 用來給文件追加多行文本
# #注釋 linux 會忽視他。給人看的。解釋說明。
# root 超級用戶的 提示符
$ shell
$變量 ====>取變量里面的內容
手 鞋盒子 拿出鞋 ====>取變量里面的內容awk $取列 $數字
/etc /bin /usr/local
cd / && tar zcf /tmp/and.tar.gz etc bin usr/local
ifdown eth0 && ifup eth0
``(反引號) 引用命令的結果 ls -l `which cat ` ------$()
; 分號,分隔多個命令 pwd;pwd;pwd ;hostname ;
- cd - ; su -
" 雙引號
~ 當前用戶的家目錄 老家
^ 正則表達式
/ 根 路徑分隔符
\ 轉義符號 \班長 ===> 學生
? 通配符 正則表達式
+ 正則表達式
2.1.1 取反(find awk) find 在linux 中bash 命令行使用
find /oldboy /etc ! -name "oldboy.txt"
awk '!/oldboy/' filename
2.1.2 表示強制
vi/vim
vi 強制退出 !+字母 調取最近以此字母開頭的命令
2.1.3 歷史命令
* 代表任意字符(0 個或多個)
ls *.txt
find -name "*.log"
[abcd] 匹配 abcd 中任何一個字符
表示范圍 a 到 z,-表示范圍的意思
[a-z] [] 匹配中括號中任意一個字符 ls file0[678] ls file0[0-9]
{…} 表示生成序列。以逗號分隔,且不能有空格
[!abcd] 或[^abcd] 表示非,表示不匹配括號里面的任何一個字符
2.2 環境准備
mkdir /oldboy/20200118 cd /oldboy/20200118 touch stu{00..10}.txt oldboy{00..10}.log ll touch oldboy.txt stu.txt *表示任何字符串/文本(0或多個)
2.2.1 找出以stu開頭的文件
[root@oldboyedu-lnb 20200118]# ll stu* -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt
2.2.2 找出以stu開頭並且以.txt結尾的文件
[root@oldboyedu-lnb 20200118]# touch stu{1..5}.log [root@oldboyedu-lnb 20200118]# ll stu*.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt
2.2.3 查找所有以.txt 結尾的文件
[root@oldboyedu-lnb 20200118]# ll *.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 oldboy.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt [root@oldboyedu-lnb 20200118]# ll *txt -rw-r--r-- 1 root root 0 Aug 5 10:04 oldboy.txt
2.2.4 使用find查找.txt結尾的文件
[root@oldboyedu-lnb 20200118]# find ./ -type f -name "*.txt" ./stu00.txt ./stu01.txt [root@oldboyedu-lnb 20200118]# find -name "*.txt" ./stu00.txt ./stu01.txt
2.2.5 使用find查找以stu開頭的文件、查找以stu開頭並且以.log 結尾的文件
[root@oldboyedu-lnb 20200118]# find -name "stu*" ./stu00.txt ./stu01.txt [root@oldboyedu-lnb 20200118]# find -name "stu*.log" ./stu1.log ./stu2.log
2.2.6 找出當前目錄下面 文件名中包含(只要有就行)oldboy的文件 ---模糊
[root@oldboyedu-lnb 20200118]# ll *oldboy* -rw-r--r-- 1 root root 0 Aug 5 10:16 awk-oldboy -rw-r--r-- 1 root root 0 Aug 5 10:16 lidao-oldboy.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 oldboy00.log [root@oldboyedu-lnb 20200118]# find -name "*oldboy*" ./oldboy10.log ./oldboy.txt ./awk-oldboy ./lidao-oldboy.txt
2.3 ?任何一個字符/文本/字母
2.3.1 .匹配st后任意單個字符並以.txt結尾的文件
[root@oldboyedu-lnb 20200118]# ll st?.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu.txt [root@oldboyedu-lnb 20200118]# ll st??.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu1.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu2.log
2.3.2 查找單個字符的命令
[root@oldboyedu-lnb 20200118]# ll /bin/? -rwxr-xr-x. 1 root root 41480 Apr 11 2018 /bin/[ -rwxr-xr-x. 1 root root 19904 Apr 11 2018 /bin/w [root@oldboyedu-lnb 20200118]# ll /bin/???
2.4 wc 命令 # 重要 常用
wc命令用來計算數字, 利用wc指令我們可以計算文件的Byte數,字數或是列數,若不指定文件名稱,或是所給予的文件名為”-”,則wc指令會從標准輸入設備讀取數據.
wc 語法
wc(選項)(參數)
選項:
[root@oldboyedu-lnb 20200118]# cat 1.txt 12345678 123 12345 [root@oldboyedu-lnb 20200118]# cat 1.txt|wc –L(統計總共數目) 8 [root@oldboyedu-lnb 20200118]# cat 1.txt|wc -l 3
2.5 [abcd] 表示一個整體一個筐,這個筐里面有4個情況 表示
查找文件名稱包含a的 或者包含b的 或者包含c的....
查找當前目錄下所有包含1234的文件
[root@oldboyedu-lnb 20200118]# ll stu[1234].log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu1.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu2.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu3.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu4.log [root@oldboyedu-lnb 20200118]# ll stu[1-4].log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu1.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu2.log [root@oldboyedu-lnb 20200118]# ll stu?[0123456789].txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu01.txt [root@oldboyedu-lnb 20200118]# ll stu[01][0123456789].txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu01.txt [root@oldboyedu-lnb 20200118]# ls stu0[0-3] ls: cannot access stu0[0-3]: No such file or directory [root@oldboyedu-lnb 20200118]# ls stu0[0-3]* stu00.txt stu01.txt stu02.txt stu03.txt [root@oldboyedu-lnb 20200118]# ll stu0[0-3]* -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu01.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu02.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu03.txt
2.6 找出文件以s或o開頭。
[root@oldboyedu-lnb 20200118]# ll s* -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt [root@oldboyedu-lnb 20200118]# ll o* -rw-r--r-- 1 root root 0 Aug 5 10:04 oldboy00.log
2.7 {}生成序列(一連串的文本)#cp A{B,C}
[root@oldboy local]# echo {0..9} 復制所有的.tar.gz 和.txt 結尾的文件到家目錄下 [root@oldboyedu-lnb 20200118]# echo {*.tar.gz,*.txt} all.tar.gz 1.txt lidao-oldboy.txt oldboy.txt stu00.txt stu01.txt stu02.txt stu03.txt
stu04.txt stu05.txt stu06.txt stu07.txt stu08.txt stu09.txt stu10.txt stu.txt [root@oldboyedu-lnb 20200118]# ll ~ total 0 drwxr-xr-x 2 root root 6 Aug 5 10:48 alex drwxr-xr-x 2 root root 54 Aug 5 10:49 test [root@oldboyedu-lnb 20200118]# cp {*.tar.gz,*.txt} ~ [root@oldboyedu-lnb 20200118]# #輸出stu01..10 oldboy01..10 alex01..10 [root@oldboyedu-lnb 20200118]# echo {stu,oldboy,alex}{01..10} stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09
oldboy10 alex01 alex02 alex03 alex04 alex05 alex06 alex07 alex08 alex09 alex10
2.8 [!abcd] ! ^表示非
[root@oldboyedu-lnb 20200118]# ll stu0[!0-8].txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu09.txt [root@oldboyedu-lnb 20200118]# ll stu[1-5].txt ls: cannot access stu[1-5].txt: No such file or directory [root@oldboyedu-lnb 20200118]# ll stu[1-5].log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu1.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu2.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu3.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu4.log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu5.log [root@oldboyedu-lnb 20200118]# ll stu[!1-5].log ls: cannot access stu[!1-5].log: No such file or directory [root@oldboyedu-lnb 20200118]# ll stu[!1-4].log -rw-r--r-- 1 root root 0 Aug 5 10:07 stu5.log
2.8.1 對中擴號內的包含s或t或u的進行取反
[root@oldboyedu-lnb 20200118]# ll [!stu]*.txt -rw-r--r-- 1 root root 19 Aug 5 10:27 1.txt -rw-r--r-- 1 root root 0 Aug 5 10:16 lidao-oldboy.tx -rw-r--r-- 1 root root 0 Aug 5 10:16 oldboy.txt [root@oldboyedu-lnb 20200118]# touch s.txt tttt.txt [root@oldboyedu-lnb 20200118]# ll [!stu]*.txt -rw-r--r-- 1 root root 19 Aug 5 10:27 1.txt -rw-r--r-- 1 root root 0 Aug 5 10:16 lidao-oldboy.txt -rw-r--r-- 1 root root 0 Aug 5 10:16 oldboy.txt [root@oldboyedu-lnb 20200118]# ll stu0[^0-8].txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu09.txt
2.8.2 [^^] 第一個代表取反 第二個普通字符
[root@oldboyedu-lnb 20200118]# ll stu0[^0-8].txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu09.txt -rw-r--r-- 1 root root 0 Aug 5 11:05 stu0^.txt [root@oldboyedu-lnb 20200118]# ll stu0[^^0-8].txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu09.txt
2.9 []和{}的區別
常用的:
()小括號 正則中表示一個整體
[]中括號
{}大括號(花括號)
a) 都可以查看文件名
b) {}可以生產序列
c) [] 不能生產序列
使用{}序列的方式查看文件名 {} 是..表示區間序列 [] 是 - 表示區間序列
[root@oldboyedu-lnb 20200118]# ll stu0{0..9}* -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu01.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu02.txt [root@oldboyedu-lnb 20200118]# ll stu0[0-9]* -rw-r--r-- 1 root root 0 Aug 5 10:04 stu00.txt -rw-r--r-- 1 root root 0 Aug 5 10:04 stu01.txt
. 當前的目錄
.. 上一級目錄
.file 隱藏文件 點和文件中間沒有空格
> === 1> 接收正確的輸出結果 到空 到文本中
>> ===2 >> 追加
2> 錯誤的輸出結果 先清空
2>> 錯誤的輸出結果 追加
< tr
<< cat
把結果定向到空
>1.txt 2>&1
>1.txt 2>1.txt
&>1.txt
[root@oldboyedu-lnb 20200118]# cat >>oldboy.txt<<EOF > oldboy > oldgirl > EOF [root@oldboyedu-lnb 20200118]# cat oldboy.txt oldboy oldgirl
2.10 $ 調用變量 大部分命令都可以直接調用變量 而不需要先echo(mkdir /$dir)
[root@oldboyedu-lnb 20200118]# echo $PS1 [\u@\h \W]\$ [root@oldboyedu-lnb 20200118]# echo $LANG en_US.UTF-8 [root@oldboyedu-lnb 20200118]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@oldboyedu-lnb 20200118]# echo test test [root@oldboyedu-lnb 20200118]# dir=test [root@oldboyedu-lnb 20200118]# touch $dir [root@oldboyedu-lnb 20200118]# ll test -rw-r--r-- 1 root root 0 Aug 5 11:37 test
第3章 特殊符號的應用
通配符 |
含義 |
* |
代表任意(0個或多個)字符。ls file* |
? |
代表任意1個字符。ls file0? |
[abcd] |
匹配中括號中任意一個字符。ls file0[678] ls file0[0-9] [root@oldboyedu ~]# ls file0[^67] ==>^尖角號 非,取反 file08 file09 |
{} |
中間為命令區塊組合或內容生成序列 [root@oldboyedu local]# echo {0..9} 0 1 2 3 4 5 6 7 8 9 [root@oldboyedu local]# echo {0,9} 0 9 [root@oldboyedu local]# echo {1,2,3} 1 2 3 [root@oldboyedu local]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z |
特殊符號 |
含義 |
; 分號 |
連續不同命令的分隔符 [root@oldboyedu tmp]# cd /;mkdir test [root@oldboyedu /]# ll -h test 總用量 0 |
# |
配置文件注釋 |
| |
管道, 將前一個命令的結果交給后一命令繼續處理 [root@oldboyedu ~]# cat test.txt |xargs -n 3 1 2 3 4 5 6 7 8 9 10 11 |
~ |
cd ~ 當前用戶的家目錄 |
- |
cd - 用戶上一次所在的目錄,由變量OLDPWD控制 [root@oldboyedu data]# env|grep -i old OLDPWD=/root su - 切換用戶的系統環境 |
.. |
上一級目錄 |
. |
當前目錄 當前目錄的三種寫法 #不加路徑===當前路徑 [root@oldboyedu data]# ls dir2 dir3 ett.txt file3.txt file5.txt hello.txt oldboy.txt # [root@oldboyedu data]# ls . dir2 dir3 ett.txt file3.txt file5.txt hello.txt oldboy.txt [root@oldboyedu data]# ls ./ dir2 dir3 ett.txt file3.txt file5.txt hello.txt oldboy.txt [root@oldboyedu data]# |
$ |
①變量前需要加的符號 $OLDPWD ②普通用戶的命令提示符 [oldboy@oldboyedu ~]$ |
/ |
①根 ②路徑分隔符號. windows是反斜線 "\" |
\ |
①屏蔽系統別名 ②轉義 echo "$OLDPWD " echo "\$OLDPWD " [root@oldboyedu tmp]# echo "$OLDPWD " /root [root@oldboyedu tmp]# echo "\$OLDPWD " $OLDPWD |
> |
輸出重定向 |
>> |
追加輸出重定向 |
< |
輸入重定向 |
<< |
追加輸入重定向 |
' ' |
單引號,不具有變量置換功能,輸出時所見即所得 |
" " |
雙引號,具有變量置換功能,解析變量輸出 |
` ` |
倒引號,``中間是命令,會先執行,等價$() |
! |
①邏輯運算中的“非”(not) ②vi/vim 強制退出 ③!+字母 調出最近一次以此字母開頭的命令 !! 使用最近一次操作的命令 !+數字 調出歷史的第幾條命令 |
&& |
當前一個指令執行成功時,執行后一個指令 [root@oldboyedu tmp]# tou test1&& touch test2 -bash: tou: command not found [root@oldboyedu tmp]# ls data oldboy passwd services.log [root@oldboyedu tmp]# tou test1;touch test2 -bash: tou: command not found [root@oldboyedu tmp]# ls data oldboy passwd services.log test2 |
|| |
當前一個指令執行失敗時,執行后一個指令 [root@oldboyedu tmp]# tou test1||touch test3 -bash: tou: command not found [root@oldboyedu tmp]# ls data oldboy passwd services.log test2 test3 |
' ' 單引號所見即所得 不會解析變量的內容
"" 雙引號和不加引號 都會解析變量的內容
`` 反引號引用命令的結果 $() 里面必須是可執行命令
; 分號分隔多個命令,沒有邏輯聯系 只是一步一步執行 find中的分號是結尾的意思 \;
[root@oldboyedu-lnb 20200118]# ll `which cat` -rwxr-xr-x. 1 root root 54080 Apr 11 2018 /usr/sbin/cat [root@oldboyedu-lnb 20200118]# ll $(which cat) -rwxr-xr-x. 1 root root 54080 Apr 11 2018 /usr/sbin/cat [root@oldboyedu-lnb 20200118]# time=`date +%F` [root@oldboyedu-lnb 20200118]# [root@oldboyedu-lnb 20200118]# echo $time 2020-08-05 [root@oldboyedu-lnb 20200118]# [root@oldboyedu-lnb 20200118]# test="$time-alex" [root@oldboyedu-lnb 20200118]# echo $test 2020-08-05-alex [root@oldboyedu-lnb 20200118]# test='$time-alex' [root@oldboyedu-lnb 20200118]# echo $test $time-alex [root@oldboyedu-lnb 20200118]# echo '$LANG $(which mkdir) {a..z}' $LANG $(which mkdir) {a..z} [root@oldboyedu-lnb 20200118]# echo "$LANG $(which mkdir) {a..z}" en_US.UTF-8 /usr/bin/mkdir {a..z} [root@oldboyedu-lnb 20200118]# echo $LANG $(which mkdir) {a..z} en_US.UTF-8 /usr/bin/mkdir a b c d e f g h i j k l m n o p q r s t u v w x y z [root@oldboyedu-lnb 20200118]# ll "stu*.txt" -rw-r--r-- 1 root root 0 Aug 5 11:54 stu*.txt