2021-05-12 14:32:11
Linux基礎教學學習筆記3——重定向與管道
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{}'
相關文章