天天看點

《LinuxProbe》—RHCE 學習 Day7

第三章 管道符、重定向與環境變量

一、輸入輸出重定向

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 儲存的曆史指令記錄條數
MAIL 郵件儲存路徑
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  (網卡重新開機指令)