萬用字元與特殊符號

上善若水~小輝發表於2020-09-06

第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(選項)(引數)

選項:

-c或--bytes或——chars只顯示Bytes數

-l或——lines只顯示列數

-w或——words只顯示字數

[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
PS:萬用字元不支援雙引號在find中支援

      

 

相關文章