linux零基礎學習課程:重定向和檔案的查詢
本人從事IT行業已有十多年,有著豐富的實戰經驗,總結了大量的學習方法,更是積累了很多的學習資料,很高興能在這裡跟大家交流學習,希望能在這裡跟大家共同進步和成長!
全套學習資料移步至公眾號【學神來啦】更多學習資料新增扣扣資源群:661308959
本節所講內容:
11.1檔案描述符 0、1、2
11.2重定向的含義-管道的使用-tee命令
11.3 which-whereis-locate-grep-find查詢命令
11.4 命令判斷
LINUX下一切皆檔案
檔案又可分為:普通檔案、目錄檔案、連結檔案、裝置檔案
LINUX系統使用檔案來描述各種硬體裝置資源,如:/dev/sda /dev/sdb /dev/sr0
11.1 檔案描述符定義
檔案描述符:是核心為了高效管理已被開啟的檔案所建立的索引,用於指向被開啟的檔案,所有執行I/O操作的系統呼叫都通過檔案描述符;檔案描述符是一個簡單的非負整數,用以標明每一個被程序所開啟的檔案,程式剛剛啟動的時候,第一個開啟的檔案是0,第二個是1,依此類推。也可以理解為是一個檔案的身份ID
使用者通過作業系統處理資訊的過程中,使用的互動裝置檔案(鍵盤,滑鼠,顯示器)
11.1.1 輸入輸出標準說明
STDIN 標準輸入 預設的裝置是鍵盤 檔案編號為:0
STDOUT 標準輸出 預設的裝置是顯示器 檔案編號為:1 ,也可以重定向到檔案
STDERR 標準錯誤 預設的裝置是顯示器 檔案編號為:2 ,也可以重定向到檔案
檢視一個程序打開了哪些檔案?
語法: ll /proc/程序ID/fd
例1:
[root@xuegod63 ~]# vim /etc/passwd
[root@xuegod63 ~]# ps -axu | grep passwd
root 4602 2.1 0.2 151600 5300 pts/2 S+ 15:30 0:00 vim /etc/passwd
[root@xuegod63 ~]# ll /proc/4602/fd #檢視開啟的檔案
總用量 0
lrwx------ 1 root root 64 5月 14 15:30 0 -> /dev/pts/2
lrwx------ 1 root root 64 5月 14 15:30 1 -> /dev/pts/2
lrwx------ 1 root root 64 5月 14 15:30 2 -> /dev/pts/2
lrwx------ 1 root root 64 5月 14 15:30 4 -> /etc/.passwd.swp
注: 這些0,1,2,4就是檔案的描述符。一個程序啟動時,都會開啟 3 個檔案:標準輸入、標準輸出和標準出錯處理。這3 個檔案分別對應檔案描述符為 0、1和2也就是巨集替換 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。
/proc/程序ID/fd #這個fd目錄下,專門存檔案描述符
注:對檔案描述符的操作就是對檔案本身的操作。 我可以直接通過操作檔案描述來修改檔案。
例3:檢視和臨時設定一個程序最多可以開啟幾個檔案,即:一個程序可以開啟的檔案描述符限制[root@xuegod63 ~]# ulimit -n #檢視一個程序最多可以同時開啟的檔案數
1024
[root@xuegod63 ~]# ulimit -n 2048 #修改一個程序最多可以同時開啟的檔案數為2048
[root@xuegod63 ~]# ulimit -n
2048
永久修改,會在第三階段講系統調優時講。
11.2 重定向的含義-管道的使用-tee命令
11.2.1 輸出重定向
定義:將命令的正常輸出結果儲存到指定的檔案中,而不是直接顯示在顯示器的螢幕上
重定向輸出使用”>” “>>” 操作符號
語法: > 檔名 #表示將標準輸出的內容,寫到後面的檔案中,如果此檔名已經存在,將會覆蓋原檔案中的內容
>> 檔名 #表示將標準輸出的內容,追加到後面的檔案中。若重定向的輸出的檔案不存在,則會新建該檔案
例1:檢視當前主機的CPU的型別儲存到cpu.txt檔案中(而不是直接顯示到螢幕上)
[root@xuegod63 ~]# cat /proc/cpuinfo > cpu.txt
例2:將核心的版本資訊追加到cpu.txt
[root@xuegod63 ~]# uname -a >> cpu.txt
例3:清空一個檔案
[root@xuegod63 ~]# > cpu.txt
11.2.2 輸入重定向
例1:將命令中接收輸入的途徑由預設的鍵盤改為其他檔案.而不是等待從鍵盤輸入
[root@xuegod63 mnt]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@xuegod63 mnt]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
例2:mysql中資料匯入
例: [root@xuegod63 ~]# mysql -uroot -p123456 < xuegod.sql #將xuegod.sql匯入mysql資料庫中。 這個命令現在不能執行,大家先知道有這種寫法就可以了。後期在第二階段講mysql時,會講。
11.2.3 EOF
EOF本意是 End Of File,表明到了檔案末尾。”EOF“通常與”<<“結合使用,“<<EOF“表示後續的輸入作為子命令或子shell的輸入,直到遇到”EOF“,再次返回到主調shell,可將其理解為分界符(delimiter)。既然是分界符,那麼形式自然不是固定的,這裡可以將”EOF“可以進行自定義,但是前後的”EOF“必須成對出現且不能和shell命令衝突。
例1:以<<EOF開始,以EOF結尾 。
[root@bogon ~]# cat > a.txt <<EOF
> dfsd
> sdfs
> sdf
> dfs
> EOF
[root@bogon ~]# cat a.txt
dfsd
sdfs
sdf
dfs
例2:以ccc作為分界符
[root@localhost ~]# cat a.txt <<ccc
> eof
> EOF
> ccc
[root@localhost ~]# cat a.txt
eof
EOF
例3:在指令碼中我們可以通過重定向輸入來列印訊息選單
在使用的時候需要在”<< “右邊跟一對終止符。終止符是可以自定義
[root@xuegod63 mnt]# vim p.sh #寫入以下內容
#!/bin/bash
cat <<efo
========================
1.mysql
2.httpd
3.oracle
=======================
efo
[root@xuegod63 ~]# chmod +x
[root@xuegod63 ~]# p.sh #檢視效果
11.2.4 錯誤重定向
將命令執行過程中出現的錯誤資訊 (選項或引數錯誤) 儲存到指定的檔案,而不是直接顯示到顯示器
作用:錯誤資訊儲存到檔案
操作符: 錯誤重定向符號:2> ; 標準輸入: 1< 或簡寫 < ; 標準輸出: 0> 或 >
2指的是標準錯誤輸出的檔案描述符 (在使用標準的輸入和輸出省略了1、0 編號)
在實際應用中,錯誤重定向可以用來收集執行的錯誤資訊.為排錯提供依據;對於shell指令碼還可以將無關緊要的錯誤資訊重定向到空檔案/dev/null中,以保持指令碼輸出的簡潔
例1: 將錯誤顯示的內容和正確顯示的內容分開
[root@xuegod63 mnt]# ls /etc/passwd xxx
ls: 無法訪問xxx: 沒有那個檔案或目錄
/etc/passwd
[root@xuegod63 mnt]# ls /etc/passwd xxx > a.txt
ls: 無法訪問xxx: 沒有那個檔案或目錄
[root@xuegod63 mnt]# cat a.txt
/etc/passwd
[root@xuegod63 mnt]# ls /etc/passwd xxx 2> a.txt
/etc/passwd
[root@xuegod63 mnt]# cat a.txt
ls: 無法訪問xxx: 沒有那個檔案或目錄
注:使用 2> 操作符時,會像使用 > 一樣覆蓋目標檔案的內容,若追加而不覆蓋檔案的內容即可使用 2>> 操作符
11.2.5 null黑洞和zero空檔案
1、把/dev/null看作"黑洞",所有寫入它的內容都會永遠丟失. 而嘗試從它那兒讀取內容則什麼也讀不到. 然而 /dev/null對命令列和指令碼都非常的有用.
[root@xuegod63 ~]# echo aaaa > /dev/null
[root@xuegod63 ~]# cat /dev/null #什麼資訊也看不到
2、/dev/zero在類UNIX 作業系統中, /dev/zero 是一個特殊的檔案,當你讀它的時候,它會提供無限的空字元(NULL, ASCII NUL, 0x00)。典型用法是用它來產生一個特定大小的空白檔案。
例:使用dd命令產生一個50M的檔案
引數:
if 代表輸入檔案。如果不指定if,預設就會從stdin中讀取輸入。
of 代表輸出檔案。如果不指定of,預設就會將stdout作為預設輸出。
bs 代表位元組為單位的塊大小。
count 代表被複制的塊數。
[root@xuegod63 mnt]# dd if=/dev/zero of=b.txt bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.228653 s, 229 MB/s
[root@xuegod63 mnt]# du -sh b.txt
50M b.txt
[root@xuegod63 mnt]# cat b.txt #什麼也不顯示
例2:正確的內容寫入一個檔案,錯誤的寫入一個檔案
[root@xuegod63 mnt]# ls /tmp xxxx >ok.txt 2> err.txt
11.2.6 &>和>&符號
&表示等同於的意思
例1:把正確和錯誤的訊息輸入到相同的位置
1>&2 把標準輸出重定向到標準錯誤
2>&1 把標準錯誤重定向到標準輸出,如圖:
例2:把正確和錯誤的訊息輸入到相同的位置
[root@xuegod63 mnt]# ls /tmp xxxx >1.txt 2>&1
或:
[root@xuegod63 mnt]# ls /tmp xxxx 2>2.txt 1>&2
例3:互動: 工作中shell指令碼中的 >/dev/null 2>&1 是什麼意思?
[root@xuegod63 ~]# cat /etc/passwd >/dev/null 2>&1
注:將標準輸出和錯誤輸出全部重定向到/dev/null中,也就是將產生的所有資訊丟棄.
11.2.7 管道 | 的使用
語法:command-a | command-b | command-c | ......
注意:
1、管道命令只處理前一個命令正確輸出,不處理錯誤輸出
2、管道右邊的命令,必須能夠接收標準輸入的資料流命令才行
3、管道符可以把兩條命令連起來,它可以連結多個命令使用
[root@xuegod63 ~]# ps -axu | grep sshd
root 1089 0.0 0.2 105996 4088 ? Ss 20:19 0:00 /usr/sbin/sshd -D
root 43262 0.0 0.0 112680 984 pts/1 S+ 21:36 0:00 grep --color=auto sshd
11.2.8 tee命令(瞭解)
功能:讀取標準輸入的資料,並將其內容輸出成檔案。
語法:tee [-a][--help][--version][檔案...]
引數:
-a, --append 內容追加到給定的檔案而非覆蓋
--help 線上幫助
tee指令會從標準輸入裝置讀取資料,將其內容輸出到標準輸出裝置,同時儲存成檔案
例1:將磁碟使用的資訊寫入檔案
[root@xuegod63 ~]# df -h | tee disk.log
例2:將檔案系統使用的資訊追加到檔案
[root@xuegod63 ~]# df -h | tee -a disk.log
注: 可以使用來記錄日誌
11.3 which-whereis-locate-grep-find查詢命令
11.3.2 which-whereis-locate-grep find命令使用
查詢檔案一般有以下幾個命令:
which 檢視可執行檔案的位置
whereis 檢視可執行檔案的位置及相關檔案
locate 配合資料庫快取,快速檢視檔案位置
grep 過濾匹配,它是一個檔案搜尋工具
find 查詢相關檔案
舉例:
[root@xuegod63 ~]# which cd
/usr/bin/cd
[root@xuegod63 ~]# whereis cd
cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
[root@xuegod63 ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.g
locate
locate命令和find -name 功能差不多,是它的另外一種寫法,但是這個要比find搜尋快的多,因為find命令查詢的是具體目錄檔案,而locate它搜尋的是一個數據庫/var/lib/mlocate/mlocate.db,這個資料庫中存有本地所有的檔案資訊;這個資料庫是Linux自動建立並每天自動更新維護。相關的配置資訊在/etc/updatedb.conf,檢視定時任務資訊在/etc/cron.daily/mlocate
[root@xuegod63 mnt]# touch /opt/xuegod.txt
[root@xuegod63 mnt]# locate xuegod.txt #發現找不到
[root@xuegod63 mnt]# updatedb #如果對當天檔案查詢,需要手動更新資料庫updatedb
[root@xuegod63 mnt]# locate xuegod
grep查詢使用
作用:過濾,它能夠使用正則表示式來搜尋文字,並把結果打印出來
引數:
-v 取反
-i 忽略大小寫
^# 以#開頭
#$ 以#結尾
^$ 空行
-n 對過濾的內容加上行號
| 或者的意思
[root@xuegod63 ~]# ps -aux | grep sshd | grep -v grep
root 1089 0.0 0.2 105996 4088 ? Ss 20:19 0:00 /usr/sbin/sshd -D
[root@xuegod63 ~]# grep bash$ /etc/passwd #以bash結尾
[root@xuegod63 ~]# grep "nologin\|root" /etc/passwd | wc -l
36
注: \ 表示轉義符
[root@xuegod63 ~]# egrep "nologin|root" /etc/passwd | wc -l #檢視包括nologin或root的行
36
注:egrep 是 grep加強版本
11.3.2 find命令使用(必會,引數比較多)
格式:find pathname -options [-print]
命令字 路徑名稱 選項 輸出
引數:
pathname: find命令所查詢的目錄路徑,不輸入代表當前目錄例如用 . 來表示當前目錄,用 / 來表示系統根目錄。
find命令選項:
-name 按照檔名查詢檔案。 “名稱”
-perm 按照檔案許可權來查詢檔案。666 777 等
-user 按照檔案屬主來查詢檔案
-group 按照檔案所屬的組來查詢檔案
-mtime -n / +n 按照檔案的更改時間來查詢檔案,
- n 表示檔案更改時間距現在n天以內
+ n 表示檔案更改時間距現在n天以前
-type 查詢某一型別的檔案
b - 塊裝置檔案
d - 目錄
c - 字元裝置檔案
p - 管道檔案
l- 符號連結檔案
f - 普通檔案
-size n 查詢符合指定的檔案大小的檔案
-exec 對匹配的檔案執行該引數所給出的其他linux命令, 相應命令的形式為' 命令 {} \;,注意{ }和 \;之間的空格,{}代表查到的內容
例1:檢視當前目錄下所有的TXT格式的檔案
[root@xuegod63 mnt]# find . -name "*.txt"
./a.txt
./xuegod.txt
2、按照更改時間或訪問時間等查詢檔案
如果希望按照更改時間來查詢檔案,可以使用mtime,atime或ctime選項
mtime: 檔案最後一次修改的時間
atime: 最後一次訪問時間
ctime: 檔案的最後一次變化時間,也就是修改時間
例1:希望在root目錄下查詢更改時間在1天以內,被黑客修改的檔案
[root@xuegod63 ~]# find /root/ -mtime -1
c3、對查詢內容執行相應命令
-exec 這個選項引數後面可以跟自定義的SHELL命令,格式如下:
例2:
[root@xuegod63 ~]# touch {1,2,3}.back
[root@xuegod63 mnt]# find . -name "*.back" -exec ls -l {} \;
例3:
[root@xuegod63 ~]# find . -name "*.back" -exec mv {} /opt \;
[root@xuegod63 ~]# ls /opt/
1.back 2.back 3.back rh xuegod.txt
例4:把查詢到的檔案複製到一個指定的目錄
[root@xuegod63 mnt]# find /root -name "*.txt" -exec cp {} /opt \;
例5:xargs和find命令結合 複製檔案 -i 表示 find 傳遞給xargs的結果 由{}來代替 (瞭解)
[root@xuegod63 ~]# rm -rf /opt/*
[root@xuegod63 ~]# find . -name "*.txt" | xargs -i cp {} /opt
[root@xuegod63 ~]# ls /opt/
例6:查詢多個型別檔案
比較符的使用:
-a and 並且
-o or 或者
+ 超過
- 低於
[root@xuegod63 ~]# touch a.pdf back.sh
[root@xuegod63 ~]# find . -name "*.sh" -o -name "*.pdf"
[root@xuegod63 ~]# find /etc -size +20k -a -size -50k | wc -l
22
[root@xuegod63 ~]# find /etc -size +20k | wc -l
49
例7: 按許可權查詢:-perm
[root@xuegod63 ~]# find /bin/ -perm 755 # 等於0755許可權的檔案或目錄
[root@xuegod63 ~]# find /bin/ -perm -644 #-perm -644 至少有644許可權的檔案或目錄
例:檢視系統中許可權至少為777的檔案或目錄
建立一些測試檔案:
[root@xuegod63 ~]# mkdir ccc
[root@xuegod63 ~]# chmod 777 ccc
[root@xuegod63 ~]# mkdir test
[root@xuegod63 ~]# chmod 1777 test
[root@xuegod63 ~]# touch b.sh
[root@xuegod63 ~]# chmod 4777 b.sh
查詢:
[root@xuegod63 ~]# find /root/ -perm 777
[root@xuegod63 ~]# find /root/ -perm 1777
[root@xuegod63 ~]# find /root/ -perm 4777
例:把系統中許可權不低於777的危險目錄查找出來
[root@xuegod63 ~]# find /root/ -perm -777
例:把系統中許可權不低於777的危險檔案查找出來
[root@xuegod63 ~]# find / -type f -perm -777
例8:查詢的目錄深度:
-maxdepth 1 #只查詢目錄第一層的檔案和目錄
如:查詢/bin目錄下許可權等於755的可執行的檔案
[root@xuegod63 ~]# find /bin/ -maxdepth 1 -perm 755 #/bin後面要有/
[root@xuegod63 ~]# find /bin -maxdepth 1 -perm 755 #這個命令無法滿足我們的需求
例9:查詢系統中所有屬於使用者mk的檔案,並把這個檔案,放到/root/findresults目錄下
注意:/root/findresults這個需要提前建立好。
[root@xuegod63 ~]# mkdir /root/findresults
[root@xuegod63 ~]# find / -user mk -exec cp -a {} /root/findresults/ \;
#引數: -a #複製時,保留原來檔案的所有屬性
報錯:
find: ‘/proc/43475/task/43475/fd/6’: 沒有那個檔案或目錄
find: ‘/proc/43475/task/43475/fdinfo/6’: 沒有那個檔案或目錄
find: ‘/proc/43475/fd/6’: 沒有那個檔案或目錄
find: ‘/proc/43475/fdinfo/6’: 沒有那個檔案或目錄
cp: 無法以目錄"/home/mk" 來覆蓋非目錄"/root/findresults/mk"
互動: 同一個目錄下,可以建立檔案mk和資料夾mk嗎?同一個目錄下建立的檔名和目錄名一樣嗎?
答:不可以
解決:
[root@xuegod63 ~]# find / -user mk #發現
[root@xuegod63 ~]# ll /var/spool/mail/mk #檢視這個檔案
[root@xuegod63 ~]# ll /home/mk
發現/var/spool/mail/mk 和/home/mk 的名字是一樣的。 而兩者都要複製到/root/findresults/下,先複製了/var/spool/mail/mk,所以/home/mk就不能複製了。
[root@xuegod63 ~]# mv /var/spool/mail/mk /var/spool/mail/mk.mail
[root@xuegod63 ~]# rm -rf /root/findresults/*
[root@xuegod63 ~]# find / -user mk -exec cp -a {} /root/findresults/ \;
[root@xuegod63 ~]# mv /var/spool/mail/mk.mail /var/spool/mail/mk #再修改過來
11.4 命令判斷
11.4.1 用到的三個特殊符號: ; && ||
1、 ;分號 不考慮指令的相關性,連續執行, 分號; 不保證命令全部執行成功的
例:[root@xuegod63 mnt]# sync ; shutdown -F
&& 邏輯與====》它是隻有在前面的命令執行成功後,後面的命令才會去執行
例1:如果/opt目錄存在,則在/opt下面新建一個檔案a.txt
[root@xuegod63 ~]# cd /opt/ && touch /opt/a.txt && ls
例2:原始碼編譯經典使用方法
[root@xuegod63 ~]# ./configure && make -j 4 && make install #我現在沒有原始碼包,所以此命令不能執行成功。大家瞭解一下這個經典用法。
2、 || 邏輯或===》如果前面的命令執行成功,後面的命令就不去執行了;或者如果前面的執行不成功,才會去執行後面的命令
例1:
[root@xuegod63 etc]# ls xxx || cd /mnt
ls: 無法訪問xxx: 沒有那個檔案或目錄
[root@xuegod63 mnt]# pwd
/mnt
[root@xuegod63 mnt]# ls /etc/passwd || cd /etc
/etc/passwd
總結:
命令情況
說 明
命令1 && 命令2
如果命令1執行,且執行正確($? = 0),然後執行命令2
如果命令1執行完成,但是執行錯誤($? ≠0),那麼後面的命令是不會執行的
命令1 || 命令2
如果命令1執行,且執行正確($? = 0),那麼命令2不執行
如果命令1執行,但執行錯誤($? ≠ 0),那麼命令2執行
運算順序:LINUX執行命令,是從左到右一個一個執行,從上到下執行
例:[root@xuegod63 ~]# cd /opt/back || mkdir /opt/back && touch /opt/back/back.tar && ls /opt/back
總結:
11.1檔案描述符 0、1、2
11.2重定向的含義-管道的使用-tee命令
11.3 which-whereis-locate-grep-find查詢命令
11.4 命令判斷
更多學習資料移步至公眾號【學神來啦】
————————————————
版權宣告:本文為CSDN博主「Xiadaoanquan123」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/Xiadaoanquan123/article/details/122241651