第三章 管道符、重定向與環境變量
一、輸入輸出重定向
1)知識點簡述
2)知識點詳述
3)輸入重定向中用到的符号及其作用
符号 | 作用 |
指令 < 檔案 | 将檔案作為指令的标準輸入 |
指令 << 分界符 | 從标準輸入中讀入,直到遇見分界符才停止 |
指令 < 檔案1 > 檔案2 | 将檔案1作為指令的标準輸入并将标準輸出到檔案2 |
4)輸出重定向中用到的符号及其作用
符号 | 作用 |
指令 > 檔案 | 将标準輸出重定向到一個檔案中(清空原有檔案的資料) |
指令 2> 檔案 | 将錯誤輸出重定向到一個檔案中(清空原有檔案的資料) |
指令 >> 檔案 | 将标準輸出重定向到一個檔案中(追加到原有内容的後面) |
指令 2>> 檔案 | 将錯誤輸出重定向到一個檔案中(追加到原有内容的後面) |
指令 >> 檔案 2>&1 或 指令 &>> 檔案 | 将标準輸出與錯誤輸出共同寫入 |
5)示例:
- 标準輸出重定向——覆寫寫入
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# cat readme.txt
Welcome to LinuxProbe.Com
- 标準輸出重定向——追加寫入
[root@linuxprobe ~]# echo "Quality linux learning materials" >> readme.txt
[root@linuxprobe ~]# cat readme.txt
Welcome to LinuxProbe.Com
Quality linux learning materials
- 錯誤輸出重定向
[root@linuxprobe ~]# ls -l xxxxxx > /root/stderr.txt
cannot access xxxxxx: No such file or directory
[root@linuxprobe ~]# ls -l xxxxxx 2> /root/stderr.txt
[root@linuxprobe ~]# cat /root/stderr.txt
ls: cannot access xxxxxx: No such file or directory
- 混合(全部)輸出重定向(追加模式)
[root@localhost ~]# ls -l linuxprobe
ls: cannot access 'linuxprobe': No such file or directory
[root@localhost ~]# ls anaconda-ks.cfg
anaconda-ks.cfg
[root@localhost ~]# ls -l anaconda-ks.cfg &>> readme.txt
[root@localhost ~]# ls -l linuxprobe &>> readme.txt
[root@localhost ~]# cat readme.txt
-rw-------. 1 root root 1395 Apr 9 23:07 anaconda-ks.cfg
ls: cannot access 'linuxprobe': No such file or directory
[root@localhost ~]#
- 混合(全部)輸出重定向(覆寫模式)
[root@localhost ~]# ls -l linux.probe
ls: cannot access 'linux.probe': No such file or directory
[root@localhost ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1395 Apr 9 23:07 anaconda-ks.cfg
[root@localhost ~]# ls -l anaconda-ks.cfg &> readme.txt
[root@localhost ~]# ls -l linux.probe &> readme.txt
[root@localhost ~]# cat readme.txt
ls: cannot access 'linux.probe': No such file or directory
[root@localhost ~]#
- 标準輸入重定向
指令 < 檔案
[root@localhost ~]# wc -l < readme.txt
1
[root@localhost ~]# wc -l readme.txt
1 readme.txt
[root@localhost ~]#
指令 < 檔案1 >(或>>) 檔案2
[root@localhost ~]# cat readme.txt
ls: cannot access 'linux.probe': No such file or directory
abcdef
[root@localhost ~]# cat < readme.txt > linxu.probe
[root@localhost ~]# cat < readme.txt > linxu.probe
[root@localhost ~]# cat linxu.probe
ls: cannot access 'linux.probe': No such file or directory
abcdef
[root@localhost ~]# cat < readme.txt >> linxu.probe
[root@localhost ~]# cat < readme.txt >> linxu.probe
[root@localhost ~]# cat linxu.probe
ls: cannot access 'linux.probe': No such file or directory
abcdef
ls: cannot access 'linux.probe': No such file or directory
abcdef
ls: cannot access 'linux.probe': No such file or directory
abcdef
[root@localhost ~]#
指令 << 分界符 (注:分界符是EOF)
[root@localhost ~]# cat << EOF
> a
> b
> c
> d
> EOF
a
b
c
d
[root@localhost ~]#
指令 >> 檔案 << EOF
[root@localhost ~]#
[root@localhost ~]# cat >> Cyril << EOF
> readme.txt
> xiaogua
> abcdefghijk
> Linuxprobe.com
> eof
> EOF
[root@localhost ~]# cat Cyril
readme.txt
xiaogua
abcdefghijk
Linuxprobe.com
eof
[root@localhost ~]#
二、管道指令符 (|)
1、格式:指令A | 指令B| 指令C
把前一個指令原本要輸出到螢幕的資訊作為後1個指令的标準輸入。
2、應用示例:
1)統計有多少個使用者可以登入到伺服器?
提示:/etc/passwd 檔案中記錄了所有的使用者資訊,其中最後1列決定了使用者能否登入到伺服器。
root:x:0:0:root:/root:/bin/bash
/bin/bash 可正常登入伺服器
/sbin/nologin 不能登入,隻能以該使用者身份使用某些服務
[root@localhost ~]# grep /sbin/nologin /etc/passwd | wc -l
40
[root@localhost ~]# grep /bin/bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
linuxprobe:x:1000:1000:linuxprobe:/home/linuxprobe:/bin/bash
[root@localhost ~]# grep /bin/bash /etc/passwd | wc -l
2
[root@localhost ~]#
2)統計目錄下有多少個檔案
ls -l 和 ls 統計的結果不一樣是因為ls -l 可以看到. (彙總檔案)
ls 指令執行後顯示的列數與視窗大小有關,但不影響數量的統計
[root@localhost etc]# ls > xiaomi
[root@localhost etc]# wc -l xiaomi
260 xiaomi
[root@localhost etc]# ls | wc -l
260
[root@localhost etc]# ls -l | wc -l
261
[root@localhost etc]#
3)為使用者設定密碼
直接設定密碼是必須配合管道符(|)使用--stdin參數
注:man passwd
--stdin
This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
[root@localhost etc]# echo redhat | passwd linuxprobe
Changing password for user linuxprobe.
New password: BAD PASSWORD: The password is shorter than 8 characters
Retype new password: Password change aborted.
passwd: Authentication token manipulation error
[root@localhost etc]# echo redhat | passwd --stdin linuxprobe
Changing password for user linuxprobe.
passwd: all authentication tokens updated successfully.
[root@localhost etc]#
4)從指令執行後顯示的衆多資訊中過濾需要内容(px aux | grep bash)
[root@localhost etc]# ps aux | wc -l
324
[root@localhost etc]# ps aux | grep bash
root 979 0.0 0.1 17172 2384 ? S 01:19 0:00 /bin/bash /usr/sbin/ksmtuned
root 2848 0.0 0.2 26668 5540 pts/0 Ss 01:25 0:00 bash
root 4095 0.0 0.2 26644 5280 pts/1 Ss+ 02:07 0:00 bash
root 4625 0.0 0.2 26540 5440 pts/2 Ss+ 02:31 0:00 bash
root 4787 0.0 0.0 12112 1096 pts/0 S+ 02:37 0:00 grep --color=auto bash
[root@localhost etc]#
三、指令行通配符
1、Linux系統中的通配符及含義
通配符 | 含義 |
* | 任意字元(空值、無窮多個) |
? | 單個任意字元 |
[a-z] | 單個小寫字母 |
[A-Z] | 單個大寫字母 |
[a-Z] | 單個字母 |
[0-9] | 單個數字 |
[a,b,c,d,e] | a,b,c,d,e中的某個字母 |
[1,3,5] | 1,3,5是的某個數字 |
[[:alpha:]] | 任意字母 |
[[:upper:]] | 任意大寫字母 |
[[:lower:]] | 任意小寫字母 |
[[:digit:]] | 所有數字 |
[[:alnum:]] | 任意字母加數字 |
[[:punct:]] | 标點符号 |
2、應用示例
1)檢視所有硬碟的相關權限屬性
[root@linuxprobe ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 May 4 15:55 /dev/sda
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe ~]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
2)搜尋/etc/目錄中所有以.conf結尾的配置檔案
[root@linuxprobe ~]# ls -l /etc/*.conf
-rw-r--r--. 1 root root 55 Feb 1 2019 /etc/asound.conf
-rw-r--r--. 1 root root 25696 Dec 12 2018 /etc/brltty.conf
4)批量建立多個檔案(需要使用大括号,并且字段之間用逗号間隔)
[root@linuxprobe ~]# touch {AA,BB,CC}.conf
[root@linuxprobe ~]# ls -l *.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 AA.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 BB.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 CC.conf
5)批量輸出指定資訊
[root@linuxprobe ~]# echo file{1,2,3,4,5}
file1 file2 file3 file4 file5
四、常用轉義字元
1、約定:
指令:小寫
變量:大寫 (标準約定俗成)
$$: 顯示目前指令的PID值 (确認一下)
$用于定義變量
2、常用的轉義字元
反斜杠(\) | 使反斜杠後的一個變量變為單純的字元。 |
單引号(' ') | 轉義其中所有為單純的字元串。 |
雙引号(" ") | 有空格則加上,做為一個整體。 |
反引号(` `) | 執行裡面的指令,取傳回結果。 |
3、應用示例
1)轉義字元 (\)
[root@linuxprobe ~]# PRICE=5
[root@linuxprobe ~]# echo "Price is $PRICE"
Price is 5
[root@linuxprobe ~]# echo "Price is $$PRICE"
Price is 3767PRICE
[root@linuxprobe ~]# echo "Price is \$$PRICE"
Price is $5
2)轉義字元( ``)
[root@linuxprobe ~]# echo `uname -a`
Linux linuxprobe.com 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
3)轉義字元("")
[root@linuxprobe ~]# echo AA BB CC
AA BB CC
[root@linuxprobe ~]# echo "AA BB CC"
AA BB CC
解釋:
echo AA BB CC 在執行時,可能把“AA BB CC”當作一個參數整體直接輸出到螢幕,也有可能分别将AA、BB和CC輸出到螢幕。
4)統計目前空閑記憶體值
[root@localhost etc]# free -m
total used free shared buff/cache available
Mem: 1966 1223 282 17 459 564
Swap: 2047 13 2034
[root@localhost etc]# free -m | grep Mem:
Mem: 1966 1224 282 17 459 563
[root@localhost etc]# free -m | grep Mem: | awk '{print $4}'
281
[root@localhost etc]# HAHA=`free -m | grep Mem: | awk '{print $4}'`
[root@localhost etc]# echo $HAHA
281
[root@localhost etc]# HOHO=$(free -m | grep Mem: | awk '{print $4}')
[root@localhost etc]# echo $HOHO
281
五、重要環境變量
1、約定俗成
在Linux系統中,變量名稱一般都是大寫的,指令則都是小寫的,這是一種約定俗成的規範。
2、Linux指令的執行過程
步驟 | 解釋 |
第1步 | /路徑/指令 (指令路徑及檔案,如:/bin/ls) |
第2步 | 别名指令 (Alias) |
第3步 | 内部指令(built-in) |
第4步 | 外部指令(超過99.99%的指令都是外部指令,儲存在服務某個檔案中,如何保證外部指令可以快速執行靠的是$PATH變量 |
1)指令别名
建立别名:alias别名=指令
取消别名:unalias别名
[root@linuxprobe ~]# unalias rm
[root@linuxprobe ~]# rm initial-setup-ks.cfg
2)檢視指令類型(内部、外部)
[root@linuxprobe ~]# type echo
echo is a shell builtin
[root@linuxprobe ~]# type uptime
uptime is /usr/bin/uptime
3)關于$PATH變量(存放外部指令所在位置)
PATH,可了解成“解釋器的小助手”,作用是告訴Bash解釋器待執行的指令可能存放的位置,然後Bash解釋器就會這些位置中逐個查找。PATH是由多個路徑值組成的變量,路徑值之間用冒号間隔,對這些路徑的增加和删除操作将影響到Bash解釋器對Linux指令的查找。
[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
[root@linuxprobe ~]# PATH=$PATH:/root/bin
[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin
4)為什麼不能添加目前目錄(.)到PATH中呢?
,盡管可以将目前目錄(.)添加到PATH變量中,進而在某些情況下可以讓使用者免去輸入指令所在路徑的麻煩。但是,如果hei客在比較常用的公共目錄/tmp中存放了一個與ls或cd指令同名的muma檔案,而使用者又恰巧在公共目錄中執行了這些指令,那麼就極有可能中招了。
3、最重要的10個環境變量
變量名稱 | 作用 |
HOME | 使用者的主目錄(即家目錄) |
SHELL | 使用者在使用的Shell解釋器名稱 |
HISTSIZE | 輸出的曆史指令記錄條數 |
HISTFILESIZE | 儲存的曆史指令記錄條數 |
郵件儲存路徑 | |
LANG | 系統語言、語系名稱 |
RANDOM | 生成一個随機數字 |
PS1 | Bash解釋器的提示符 |
PATH | 定義解釋器搜尋使用者執行指令的路徑 |
1)HOME變量
[root@linuxprobe ~]# echo $HOME
/root
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ echo $HOME
/home/linuxprobe
2)變量的友善之處
[root@linuxprobe ~]# mkdir /home/workdir
[root@linuxprobe ~]# WORKDIR=/home/workdir
[root@linuxprobe ~]# cd $WORKDIR
[root@linuxprobe workdir]# pwd
/home/workdir
3)使用export 指令設定全局變量
[root@linuxprobe ~]# export WORKDIR
[root@linuxprobe ~]# su linuxprobe
[linuxprobe@linuxprobe ~]$ cd $WORKDIR
[linuxprobe@linuxprobe workdir]$ pwd
/home/workdir
4)取消全局變量
[root@linuxprobe ~]# unset WORKDIR
[root@linuxprobe ~]#
4、注意事項
1)修改環境變量配置檔案後,可使用source 配置檔案路徑 強制生效
2)nmcli connection up ens160 (網卡重新開機指令)