輸出重定向 輸入重定向 管道簡單介紹 -20160729

輸出重定向 輸入重定向 管道簡單介紹

標準輸入和輸出

我們先來了解下輸入和輸出的概念:

在計算機中我們了解到計算機的組成部分:其中有輸入 輸出設備。

 

 

 

輸出重定向

對于程序來說:

程序 :指令 + 數據

對于數據來說,數據可以由我們通過鍵盤輸入,或者程序直接使用存儲設備上的數據,我們稱為讀入 數據,程序處理數據后需要返回一個結果,這個結果需要輸出出來,我們稱為輸出數據。

linux系統中,打開的文件都有一個fd:file descriptor (文件描述符)

例如:我們使用 nano打開一個文件

 

#通過ps  aux 可以看到我們使用的程序 nano

root      21498  0.2  0.3 116404  3052 pts/0    S+   14:10   0:00 nano test

#查看fd的標示狀態

[root@wCentos7 ~]# ll /proc/21498/fd

total 0

lrwx——. 1 root root 64 Jul 30 14:11 0 -> /dev/pts/0

lrwx——. 1 root root 64 Jul 30 14:11 1 -> /dev/pts/0

lrwx——. 1 root root 64 Jul 30 14:10 2 -> /dev/pts/0

[root@wCentos7 ~]#

Linux給程序提供三種I/O設備

標準輸入(STDIN——-> 0 默認接受來自于鍵盤的輸入

標準輸出(STDOUT—–> 1 默認輸出到終端窗口

標準錯誤(STDERR—–> 2 默認輸出到終端窗口

 

我們是可以通過修改 I/O輸出和輸入可以 修改默認位置的,意思就是:

我們可以修改程序輸入的數據可以不來至鍵盤;

程序的正確輸出可以不輸出到屏幕上;

程序的錯誤輸出可以不輸出到屏幕上。

 

把輸出(正確的)和錯誤輸出重定向到文件

語法如下: 命令 操作符號   文件名

支持的炒作符號:

> : STDOUT重定向到文件;

2> : STDERR重定向到文件;

&> : 把以上兩類輸出重定向到文件

注意: > :文件內容會被覆蓋,不過我們也可以設置不覆蓋

Set  -C  : 禁止將內容覆蓋已有文件,但可以追加

Set  +C :  允許覆蓋

 

>| : 強制覆蓋

>> : 在原來的基礎上,追加新內容,不覆蓋原來的內容

 

 

舉例說明:

標準輸出和錯誤輸出各自重定向到不同位置:

[root@wCentos7 ~]# ls -l /   #默認輸出至屏幕上的消息
total 36 
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Jul 21 11:35 boot
drwxr-xr-x.  19 root root 3240 Jul 28 08:36 dev
drwxr-xr-x. 129 root root 8192 Jul 30 12:53 etc
drwxr-xr-x.   8 root root   87 Jul 30 10:44 home
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul 21 11:23 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Aug 12  2015 media
drwxr-xr-x.   2 root root    6 Aug 12  2015 mnt
drwxr-xr-x.   3 root root   15 Jul 21 11:31 opt
dr-xr-xr-x. 447 root root    0 Jul 28 08:36 proc
dr-xr-x---.  14 root root 4096 Jul 30 10:25 root
drwxr-xr-x.  38 root root 1120 Jul 29 20:14 run
lrwxrwxrwx.   1 root root    8 Jul 21 11:23 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Aug 12  2015 srv
dr-xr-xr-x.  13 root root    0 Jul 28 08:36 sys
drwxr-xr-x.  18 root root 4096 Jul 30 11:21 testdir
drwxrwxrwt.  23 root root 4096 Jul 30 14:28 tmp
drwxr-xr-x.  13 root root 4096 Jul 21 11:23 usr
drwxr-xr-x.  20 root root 4096 Jul 28 12:28 var

[root@wCentos7 ~]# ls -l /  >/tmp/dui.log  2>/tmp/cuowu.log
正確的重定向到 dui.log文件
錯誤的重定向到 cuowu.log文件
屏幕上不再顯示任何的信息了
[root@wCentos7 ~]# cat /tmp/dui.log  #查看文件的內容和正確輸出信息是一樣的
total 36
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Jul 21 11:35 boot
drwxr-xr-x.  19 root root 3240 Jul 28 08:36 dev
drwxr-xr-x. 129 root root 8192 Jul 30 12:53 etc
drwxr-xr-x.   8 root root   87 Jul 30 10:44 home
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul 21 11:23 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Aug 12  2015 media
drwxr-xr-x.   2 root root    6 Aug 12  2015 mnt
drwxr-xr-x.   3 root root   15 Jul 21 11:31 opt
dr-xr-xr-x. 448 root root    0 Jul 28 08:36 proc
dr-xr-x---.  14 root root 4096 Jul 30 10:25 root
drwxr-xr-x.  38 root root 1120 Jul 29 20:14 run
lrwxrwxrwx.   1 root root    8 Jul 21 11:23 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Aug 12  2015 srv
dr-xr-xr-x.  13 root root    0 Jul 28 08:36 sys
drwxr-xr-x.  18 root root 4096 Jul 30 11:21 testdir
drwxrwxrwt.  23 root root 4096 Jul 30 14:31 tmp
drwxr-xr-x.  13 root root 4096 Jul 21 11:23 usr
drwxr-xr-x.  20 root root 4096 Jul 28 12:28 var

 

 

[root@wCentos7 ~]# lss -l /  #錯誤默認輸出到屏幕上面來的
bash: lss: command not found...
Similar command is: 'ls'
[root@wCentos7 ~]# lss -l /  >/tmp/dui.log  2>/tmp/cuowu.log
[root@wCentos7 ~]# cat /tmp/cuowu.log  #重定向后,信息保存在文件中了
bash: lss: command not found...
Similar command is: 'ls'

 

對個命令的輸出重定向語法:

[root@wCentos7 ~]# (cat /etc/issue; cal) > /tmp/all.txt (記得多個命令使用括號 分號隔開)
把issue的內容 和 日歷的信息重定向到文件中
[root@wCentos7 ~]# cat /tmp/all.txt 
\S
Kernel \r on an \m
 
========================
welcome to my hostname SA
welcome to my hostname SB
=========================
      July 2016     
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

 

對有些命令不管輸出的是正確的還是錯誤的輸出我們都丟棄掉不保存任何文件也不需要輸出默認輸出方法:

[root@wCentos7 ~]# findsss /etc/ -name passwdbash: findsss: command not found...

#默認錯誤輸出輸出至屏幕上

 

[root@wCentos7 ~]# find /etc/ -name passwd
/etc/passwd
/etc/pam.d/passwd

#默認正確輸出輸出至屏幕上

 

[root@wCentos7 ~]# find /etc/ -name passwd &>/dev/null
[root@wCentos7 ~]# findsss /etc/ -name passwd &>/dev/null

#輸出重定向后,不管是錯誤的還是正確的數據在屏幕上都不輸出了

 

注意:/dev/null是一個特殊的設備,就是一個數據黑洞,吞噬送往該設備的所有數據,以后如果不想讓屏幕有顯示可以,會經常用到這個/dev/unll 的數據吞噬設備

 

 

輸入重定向

關于輸入重定向,默認情況下,有許多的指令時等待默認輸入設備輸入的,比如默認輸入設備鍵盤。等待鍵盤輸入指令有: cat   tr等等命令,我們就以實際的案例來了解輸入重定向如何使用 。

正常情況下你使用cat命令不帶任何參數,cat就會另起一行,你輸入什么,他就輸出什么,和用戶就有一個交換的過程,我們如果把需要輸入的數據保存在文件中,一起輸入到cat中去行不行,是可以的,我們可以這樣操作:

輸入重定向的表示符為: <

Cat命令輸入重定向:

[root@wCentos7 ~]#  cat < /etc/fstab  
               #我們使用 < 就把fatab文件中的內容輸入至cat命名,cat命令在顯示在標準輸出上。
 
#
# /etc/fstab
# Created by anaconda on Thu Jul 21 11:22:48 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b63a2f0c-c9f9-465d-b2b5-3830fedccdd2 /                       xfs     defaults        0 0
UUID=9dec22f7-215e-4a47-97d1-ae09446d62d2 /boot                   xfs     defaults        0 0
UUID=a138a967-21db-41e0-9a4a-7a5eb4979481 /testdir                xfs     defaults        0 0
UUID=bb99272d-4848-49bd-a896-e5f843037cbf swap                    swap    defaults        0 0

tr 命令輸入重定向

[root@wCentos7 yuedir]# tr "a-z"  "A-Z"  < /etc/issue  #把輸入進入的數據小寫字母轉化為大寫字母
\S
KERNEL \R ON AN \M
 
========================
WELCOME TO MY HOSTNAME SA
WELCOME TO MY HOSTNAME SB
=========================

 

管道

管道(使用符號“|”表示)用來連接命令

命令1 | 命令2 | 命令3 |

?將命令1STDOUT發送給命令2STDIN,命令2STDOUT發送到命令3STDIN

?STDERR默認不能通過管道轉發,可利用2>&1 |& 實現

?最后一個命令會在當前shell進程的子shell進程中執行用來

?組合多種工具的功能

舉例說明:

[root@wCentos7 yuedir]#  cat /etc/issue  | tr "a-z" "A-Z"  #小寫轉換為大寫
\S
KERNEL \R ON AN \M
 
========================
WELCOME TO MY HOSTNAME SA
WELCOME TO MY HOSTNAME SB
=========================

 

 

[root@wCentos7 yuedir]# echo 1234567890 | passwd --stdin harry #自動修改密碼
Changing password for user harry.
passwd: all authentication tokens updated successfully.
[root@wCentos7 yuedir]#

 

 

 

總結:

輸入重定向與管道感覺功能上有些沖突,管道的功能更好跟強大,支持的命令比輸入重定向多。

關于管道的更做的功能在實際運用中慢慢體會,比如: tr 命令 ,tee命令等等,后面介紹命令的使用可以更好的理解管道的使用。

原創文章,作者:linux_root,如若轉載,請注明出處:http://www.www58058.com/27694

(0)
linux_rootlinux_root
上一篇 2016-08-04 14:42
下一篇 2016-08-04 14:42

相關推薦

  • grep與文本處理工具

    grep:基本正則表達式,-E  -F egrep:擴展正則表達式,-G -F fgrep: 不支持正則表達式,-F  egrep:          支持擴展的正則表達式實現類似于grep文本過濾功能; grep -E          …

    Linux干貨 2016-12-23
  • ###N25-Bazinga-第一周作業

    ###N25-Bazinga-第一周作業— 1,描述計算機的組成及其功能         計算機基本組成有五部分:     計算機的主要組成部分可以歸納為以下五個部分:控制器、運算器、存儲器、輸入設備、和輸出…

    Linux干貨 2016-12-06
  • 文本處理工具

    文本處理工具 文件查看命令:cat  cat [OPTION]… [FILE]…  -E: 顯示行結束符$  -n: 對顯示出的每一行進行編號  -A:顯示所有控制符  -b:非空行編號  -s:壓縮連續的空行成一行 [root@centous1 soft]#&nb…

    Linux干貨 2016-08-08
  • MAN手冊各章節功能介紹及快捷鍵鍵位整理

       初學linux ,請教別人的時候,遇到人不耐煩回答我等菜菜的問題,都會說一句,“自己去man”,“翻過man了嗎,再來問吧”,哦,my gd,這個man到底是何方超人啊,其實man就是linux自帶的文檔,假如你不知道ls這個命令的用法,你可以試著敲入 man  ls  ,然后來看看,會有啥結果。效果不錯吧,一般…

    Linux干貨 2016-10-18
  • grep,egrp,fgrep 命令與正則表達式

    一 簡介     grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。 Unix的grep家族包括grep、egrep和fgrep…

    Linux干貨 2016-01-19
  • lvs-nat的實現

    nat的知識點

    2018-03-03
欧美性久久久久