首頁 > 軟體

Linux基礎教學學習筆記3——重定向與管道

2020-06-16 18:06:28

Linux基礎教學學習筆記3——重定向與管道

1、輸出重定向

    重定向正確內容:

    cat xx.file > yy.file 相當於cat xx.file 1>yy.file將檔案內容重定向到yy.file,將會覆蓋原有檔案內容;

    cat xx.file 》yy.file 將檔案內容追加重定向到yy.file,不會覆蓋原有檔案內容;
    重定向錯誤的結果

        xxx 2> yy.file 執行錯誤的命令產生的錯誤結果重定向到yy.file檔案

          xxx 2》 yy.file 
        XXX  >>yy  2>>bb
  正確與錯誤都重定向到相同檔案
這種寫法比較常用: [root@clz ~]# cat /etc/passwd &>>/tmp/xx

這種學法不常用,將錯誤的當成正確的輸出:[root@clz ~]# cat /etc/passwd >/tmp/xx 2>&1

    可以從以下的範例中更加深入的理解正確的輸入重定向:

    在/dev/pts/1上執行以下命令:

[root@clz ~]# tail -f /var/log/messages >/tmp/xx 2>/tmp/yy

    在/dev/pts/0上檢視執行該命令的進程號:
[root@clz fdinfo]# ps aux | grep tail|grep -v 'grep'
root      5567  0.1  0.0 107932  620 pts/1    S+  15:37  0:00 tail -f /var/log/messages

    根據進程號,進入到/proc目錄下找到進程號對應的資料夾:
[root@clz fdinfo]# cd /proc/5567

    進入fd/資料夾,執行ls -l命令,可以看到連結檔案:0代表輸入,1代表標準正確的輸出,2,代表標準錯誤的輸出,3、表示命令操作的檔案,如果對多個檔案進行操作,則會有4,5...顯示其他的檔案

        在dev目錄下面,可以看到以下邏輯的標準輸入輸出裝置,當一個進程執行時,self就會替換成該進程的進程號:
[root@clz fd]# ls -al /dev/std*
lrwxrwxrwx. 1 root root 15 Dec 30  2014 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Dec 30  2014 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Dec 30  2014 /dev/stdout -> /proc/self/fd/1

2、輸入重定向
將檔案內容重定向輸入到某個命令
[root@clz ~]# tr 'a-z' 'A-Z' </tmp/passwd 
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN

          <<HERE文件
[root@clz ~]# cat >/tmp/xx<<EOF
> ERSARERS
> RER
> EOF

    也可以這樣寫
[root@clz ~]# cat <<EOF >/tmp/xx
> ERSARERS
> RER
> EOF

3、管道   
        grep -n 在查詢的內容前加行數 -i忽略大小寫,-A 3 查詢的內容後再顯示的行數,B 3 顯示查詢的內容前的行數 -v 排除關鍵字後的內容,-q不顯示輸出;
[root@clz ~]# grep -n -A 1 -B 1 root /etc/passwd 
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
--
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin

[root@clz ~]# grep -v root /etc/passwd

前面輸出的內容傳通過管道傳遞給後面的命令,但是前面的命令生成的內容沒有儲存下來;
[root@clz ~]# ifconfig | grep 'inet'|grep -v 'inet6'| awk 'BEGIN{print "IPttnetmask"}{print $2,"t",$4}END{}'
IPnetmask
10.35.89.32  255.255.255.128
10.35.89.33  255.255.255.0
127.0.0.1  255.0.0.0

        通過使用tee命令可以講前面命令生成的結果儲存下來,加-a 選項表示追加不覆蓋,然後在過濾輸出結果;

[root@clz ~]# ifconfig | grep 'inet'|grep -v 'inet6'| tee -a /tmp/yy|awk 'BEGIN{print "IPttnetmask"}{print $2,"t",$4}END{}'


IT145.com E-mail:sddin#qq.com