Linux的重定向與管道


(1).輸出重定向

  定義:將命令的標准輸出結果保存到指定的文件中,而不是直接顯示在顯示器上。

  輸出重定向使用>和>>操作符。

  語法:cmd > filename,表示將標准輸出寫入文件,如果此文件已存在,將覆蓋原文件的內容。如果不存在,則新建該文件。

     cmd >> filename,表示將標准輸出追加到文件,如果文件不存在,則新建該文件。

實例1:查看當前主機的CPU類型保存到cpu.txt文件中,而不是直接顯示到屏幕上。

//如果想要直接查看CPU信息
[xf@xuexi ~]$ cat /proc/cpuinfo
//那么相應的輸出重定向如下
[xf@xuexi ~]$ cat /proc/cpuinfo > cpu.txt

實例2:將內核版本信息追加到cpu.txt

//如果想要查看系統基本信息
[xf@xuexi ~]$ uname -r
3.10.0-957.5.1.el7.x86_64
[xf@xuexi ~]$ uname -a
Linux xuexi 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
//那么相應的追加如下
[xf@xuexi ~]$ uname -a >> cpu.txt

實例3:清空一個文件

[xf@xuexi ~]$ > cpu.txt 

(2).輸入重定向

   定義:將命令中接收輸入的途徑有默認鍵盤改為其他文件,而不是等待從鍵盤輸入。

  輸入重定向使用<操作符。

實例:

[xf@xuexi ~]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[xf@xuexi ~]$ grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

mysql數據庫導入數據,格式如下

[xf@xuexi ~]$ mysql -uroot -p123456789 < a.sql

(3).EOF

  EOF本意是End Of File,表明到了文件末尾。EOF通常與<<結合使用,<<EOF表示后續的輸入作為子命令或子shell的輸入,知道遇到EOF,再次返回主shell,可將其理解為分界符。既然是分界符,那么形式自然不是固定的,這里可以將EOF進行自定義,但是前后的分界符必須成對出現且不能和shell命令沖突。

 實例1:

[xf@xuexi ~]$ cat > a.txt << EOF
> This is a file.
> EOF
[xf@xuexi ~]$ cat a.txt 
This is a file.
[xf@xuexi ~]$ cat >> a.txt << EOF
> My name is xf.
> EOF
[xf@xuexi ~]$ cat a.txt 
This is a file.
My name is xf.
[xf@xuexi ~]$ cat > b.txt << ccc
> This is a file.
> EOF
> ccc
[xf@xuexi ~]$ cat b.txt 
This is a file.
EOF

實例2:在腳本中我們可以通過重定向輸入來打印消息菜單。可以自定義。

[xf@xuexi ~]$ vim c.sh
//文件內容如下
#! /bin/bash

cat << EOF
===================================
mysql
httpd
oracle
===================================
EOF
//保存退出
[xf@xuexi ~]$ chmod +x c.sh
[xf@xuexi ~]$ ./c.sh 
===================================
mysql
httpd
oracle
===================================

(4).錯誤重定向

  定義:將命令執行過程中出現的錯誤信息(選項或參數錯誤)保存到指定文件,而不是直接顯示到顯示器。

  錯誤重定向使用2>和2>>操作符(2表示的是標准錯誤的文件描述符)

  語法:cmd 2> filename,表示將標准錯誤寫入文件,如果此文件已存在,將覆蓋原文件的內容。如果不存在,則新建該文件。

     cmd 2>> filename,表示將標准錯誤追加到文件,如果文件不存在,則新建該文件。

  在實際應用中,錯誤重定向可以用於收集執行的錯誤信息,為排錯提供依據;對於shell腳本還可以將無關緊要的錯誤信息重定向到空文件/dev/null,以保持腳本輸出的簡潔。

實例1:將錯誤顯示的內容與正確顯示的內容分開

[xf@xuexi ~]$ ls /etc/passwd xxxx
ls: 無法訪問xxxx: 沒有那個文件或目錄
/etc/passwd
[xf@xuexi ~]$ ls /etc/passwd xxxx > a.txt
ls: 無法訪問xxxx: 沒有那個文件或目錄
[xf@xuexi ~]$ cat a.txt 
/etc/passwd
[xf@xuexi ~]$ ls /etc/passwd xxxx 2> a.txt 
/etc/passwd
[xf@xuexi ~]$ cat a.txt 
ls: 無法訪問xxxx: 沒有那個文件或目錄

實例2:正確的內容寫入一個文件,錯誤的內容寫入另一個文件

[xf@xuexi ~]$ ll /etc/passwd xxxx > right.txt 2> err.txt
[xf@xuexi ~]$ cat right.txt 
-rw-r--r--. 1 root root 2257 2月  13 16:19 /etc/passwd
[xf@xuexi ~]$ cat err.txt 
ls: 無法訪問xxxx: 沒有那個文件或目錄

(5).null黑洞和zero空文件

  把/dev/null看做“黑洞”,所有寫入它的內容都會永遠丟失。而嘗試從該文件讀取內容也什么都讀不到。然而/dev/null對命令行和腳本都非常有用。

   /dev/zero在類UNIX操作系統中,是一個特殊的文件,當你讀它時,它會提供無限的空字符(NULL,ASCII NUL,0x00)。典型用法是用它來產生一個特定大小的空白文件。

實例1:使用dd命令產生一個50M的空白文件,空白文件可以臨時當做設備文件使用

[xf@xuexi ~]$ dd if=/dev/zero of=1.txt bs=M count=50
記錄了50+0 的讀入
記錄了50+0 的寫出
52428800字節(52 MB)已復制,0.0508383 秒,1.0 GB/秒
[xf@xuexi ~]$ ll -h 1.txt 
-rw-rw-r--. 1 xf xf 50M 2月  26 10:17 1.txt
[xf@xuexi ~]$ cat 1.txt 
[xf@xuexi ~]$ 

  /dev/zero也可以用於清除分區頭。

(6).&>和>&符號

  &表示等同於的意思。除了&>和>&以外還有&>>

實例1:把標准輸出與標准錯誤寫入到同一個文件,此實例使用&>和>&有多種寫法

[xf@xuexi ~]$ ls /tmp xxxx >1.txt 2>&1
[xf@xuexi ~]$ ls /tmp xxxx 2>2.txt 1>&2
[xf@xuexi ~]$ ls /tmp xxxx &> 3.txt
[xf@xuexi ~]$ ls /tmp xxxx >& 4.txt
[xf@xuexi ~]$ cat 1.txt 
ls: 無法訪問xxxx: 沒有那個文件或目錄
/tmp:
ssh-2yPDLej8lp2k
systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-bolt.service-3sZXoj
systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-chronyd.service-rUnYOY
systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-colord.service-go7dw4
systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-cups.service-o7nKmx
systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-fwupd.service-GN4Clw
systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-rtkit-daemon.service-59x6Qx
tracker-extract-files.0
tracker-extract-files.1000
VMwareDnD
vmware-root_6784-2823359541
vmware-root_6814-2822835244
vmware-root_6819-3879179857
vmware-root_6821-3879048790
vmware-root_6829-3845623896
vmware-root_6834-2865236895
vmware-root_6839-3854340548
vmware-root_6843-3879573071
vmware-root_6844-2831682966
vmware-root_6849-4156467083
vmware-root_6850-3100130775
vmware-root_6851-4148143625
vmware-root_6855-4156336012
vmware-root_6863-4122911106
vmware-root_6874-3099737545
vmware-root_6883-4147619377
vmware-root_6889-4122255805
yum_save_tx.2019-02-21.14-15.ehxi5q.yumtx
yum_save_tx.2019-02-25.09-56.0qBBLA.yumtx
yum_save_tx.2019-02-26.10-23.gFGrHz.yumtx
[xf@xuexi ~]$ diff 1.txt 2.txt 
[xf@xuexi ~]$ diff 1.txt 3.txt 
[xf@xuexi ~]$ diff 1.txt 4.txt 

實例2:把標准輸出與標准錯誤追加到文件中

[xf@xuexi ~]$ ll > 1.txt
[xf@xuexi ~]$ cat 1.txt 
總用量 0
-rw-rw-r--. 1 xf xf 0 2月  26 13:34 1.txt
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 公共
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 模板
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 視頻
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 圖片
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 文檔
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 下載
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 音樂
drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
[xf@xuexi ~]$ ls /tmp xxxx &>>1.txt
[xf@xuexi ~]$ cat 1.txt 
總用量 0
-rw-rw-r--. 1 xf xf 0 2月  26 13:34 1.txt
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 公共
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 模板
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 視頻
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 圖片
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 文檔
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 下載
drwxr-xr-x. 2 xf xf 6 9月   6 11:43 音樂
drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
ls: 無法訪問xxxx: 沒有那個文件或目錄
/tmp:
ssh-7dArISEgeS0O
systemd-private-6596f9db642a46ae9174a8ca3ace2009-bolt.service-UElQVL
systemd-private-6596f9db642a46ae9174a8ca3ace2009-chronyd.service-oIQjdt
systemd-private-6596f9db642a46ae9174a8ca3ace2009-colord.service-8hFZOp
systemd-private-6596f9db642a46ae9174a8ca3ace2009-cups.service-7i8U0x
systemd-private-6596f9db642a46ae9174a8ca3ace2009-fwupd.service-SWULra
systemd-private-6596f9db642a46ae9174a8ca3ace2009-rtkit-daemon.service-jYXFJl
tracker-extract-files.0
tracker-extract-files.1000
VMwareDnD
vmware-root_6784-2823359541
vmware-root_6814-2822835244
vmware-root_6819-3879179857
vmware-root_6821-3879048790
vmware-root_6829-3845623896
vmware-root_6834-2865236895
vmware-root_6839-3854340548
vmware-root_6843-3879573071
vmware-root_6844-2831682966
vmware-root_6849-4156467083
vmware-root_6850-3100130775
vmware-root_6851-4148143625
vmware-root_6855-4156336012
vmware-root_6863-4122911106
vmware-root_6874-3099737545
vmware-root_6883-4147619377
vmware-root_6889-4122255805
yum_save_tx.2019-02-21.14-15.ehxi5q.yumtx
yum_save_tx.2019-02-25.09-56.0qBBLA.yumtx
yum_save_tx.2019-02-26.10-23.gFGrHz.yumtx

實例3:shell腳本中的/dev/null 2>&1是什么意思呢?

[xf@xuexi ~]$ ls /etc/passwd >/dev/null 2>&1

注:將標准輸出和標准錯誤全部重定向到/dev/null中,也就是將產生的所有信息丟棄。

 (7).管道符|的使用

  語法: command -a | command -b | command -c | ...

注意:1、管道命令只處理前一個命令標准輸出,不處理標准錯誤

   2、管道右邊的命令,必須是一個能夠接收前一個命令的標准輸出的數據流的命令才行

   3、管道可以把兩個命令連起來,它可以連接多個命令使用

實例1:對應注意1

[xf@xuexi ~]$ ls /tmp xxxx
ls: 無法訪問xxxx: 沒有那個文件或目錄
/tmp:
ssh-7dArISEgeS0O
systemd-private-6596f9db642a46ae9174a8ca3ace2009-bolt.service-UElQVL
systemd-private-6596f9db642a46ae9174a8ca3ace2009-chronyd.service-oIQjdt
systemd-private-6596f9db642a46ae9174a8ca3ace2009-colord.service-8hFZOp
systemd-private-6596f9db642a46ae9174a8ca3ace2009-cups.service-7i8U0x
systemd-private-6596f9db642a46ae9174a8ca3ace2009-fwupd.service-SWULra
systemd-private-6596f9db642a46ae9174a8ca3ace2009-rtkit-daemon.service-jYXFJl
tracker-extract-files.0
tracker-extract-files.1000
VMwareDnD
vmware-root_6784-2823359541
vmware-root_6814-2822835244
vmware-root_6819-3879179857
vmware-root_6821-3879048790
vmware-root_6829-3845623896
vmware-root_6834-2865236895
vmware-root_6839-3854340548
vmware-root_6843-3879573071
vmware-root_6844-2831682966
vmware-root_6849-4156467083
vmware-root_6850-3100130775
vmware-root_6851-4148143625
vmware-root_6855-4156336012
vmware-root_6863-4122911106
vmware-root_6874-3099737545
vmware-root_6883-4147619377
vmware-root_6889-4122255805
yum_save_tx.2019-02-21.14-15.ehxi5q.yumtx
yum_save_tx.2019-02-25.09-56.0qBBLA.yumtx
yum_save_tx.2019-02-26.10-23.gFGrHz.yumtx
[xf@xuexi ~]$ ls /tmp xxxx | grep /tmp
ls: 無法訪問xxxx: 沒有那個文件或目錄  //可以看到標准錯誤沒有被處理,仍然輸出
/tmp:

實例2:對應注意3

[xf@xuexi ~]$ ps -aux | grep sshd
root       7418  0.0  0.2 112860  4312 ?        Ss   13:19   0:00 /usr/sbin/sshd -D
xf        10913  0.0  0.0 112728   988 pts/0    S+   14:39   0:00 grep --color=auto sshd
[xf@xuexi ~]$ ps -aux | grep sshd | grep root
root       7418  0.0  0.2 112860  4312 ?        Ss   13:19   0:00 /usr/sbin/sshd -D

(8).tee

tee [選項] [文件]

選項:

-a,--append 內容追加到給定的文件而非覆蓋
-i,--ignore-interrupts 忽略中斷信號
--help 幫助
--version 版本信息

  將標准輸入復制到每個指定文件,並顯示到標准輸出

實例1:將磁盤使用的信息寫入文件

[xf@xuexi ~]$ df -h | tee disk.log
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda3        17G  4.7G   13G   28% /
devtmpfs        975M     0  975M    0% /dev
tmpfs           991M     0  991M    0% /dev/shm
tmpfs           991M   11M  980M    2% /run
tmpfs           991M     0  991M    0% /sys/fs/cgroup
/dev/sr0        4.2G  4.2G     0  100% /mnt
/dev/sda1      1014M  276M  739M   28% /boot
tmpfs           199M   20K  199M    1% /run/user/1000
[xf@xuexi ~]$ cat disk.log 
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda3        17G  4.7G   13G   28% /
devtmpfs        975M     0  975M    0% /dev
tmpfs           991M     0  991M    0% /dev/shm
tmpfs           991M   11M  980M    2% /run
tmpfs           991M     0  991M    0% /sys/fs/cgroup
/dev/sr0        4.2G  4.2G     0  100% /mnt
/dev/sda1      1014M  276M  739M   28% /boot
tmpfs           199M   20K  199M    1% /run/user/1000

實例2:將磁盤使用的信息追加到文件

[xf@xuexi ~]$ df -h | tee -a disk.log
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda3        17G  4.7G   13G   28% /
devtmpfs        975M     0  975M    0% /dev
tmpfs           991M     0  991M    0% /dev/shm
tmpfs           991M   11M  980M    2% /run
tmpfs           991M     0  991M    0% /sys/fs/cgroup
/dev/sr0        4.2G  4.2G     0  100% /mnt
/dev/sda1      1014M  276M  739M   28% /boot
tmpfs           199M   20K  199M    1% /run/user/1000
[xf@xuexi ~]$ cat disk.log 
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda3        17G  4.7G   13G   28% /
devtmpfs        975M     0  975M    0% /dev
tmpfs           991M     0  991M    0% /dev/shm
tmpfs           991M   11M  980M    2% /run
tmpfs           991M     0  991M    0% /sys/fs/cgroup
/dev/sr0        4.2G  4.2G     0  100% /mnt
/dev/sda1      1014M  276M  739M   28% /boot
tmpfs           199M   20K  199M    1% /run/user/1000
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda3        17G  4.7G   13G   28% /
devtmpfs        975M     0  975M    0% /dev
tmpfs           991M     0  991M    0% /dev/shm
tmpfs           991M   11M  980M    2% /run
tmpfs           991M     0  991M    0% /sys/fs/cgroup
/dev/sr0        4.2G  4.2G     0  100% /mnt
/dev/sda1      1014M  276M  739M   28% /boot
tmpfs           199M   20K  199M    1% /run/user/1000

注:可以用來記錄日志

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM