Linux-標準IO和管道

Linux

打開的文件都有一個fd:file description(文件描述符)

[root@centos7 data]#exec 8<>/data/hosts

[root@centos7 data]#ll /proc/$$/fd

total 0

lrwx——. 1 root root 64 Mar 30 14:22 0 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 14:22 1 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 14:22 2 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 16:58 255 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 17:17 8 -> /data/hosts

[root@centos7 data]#cat /proc/$$/fd/8

127.0.0.1?? localhost localhost.localdomain localhost4 localhost4.localdomain4

::1???????? localhost localhost.localdomain localhost6 localhost6.localdomain6

其實就是軟鏈接

 

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

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

標準輸出(STDOUT)-1 默認輸出到終端窗口

標準錯誤(STDERR)-2 默認輸出到終端窗口

I/O重定向:改變默認位置

 

標準輸出重定向:>,或者1>

ls > /dev/pts/5

ls > /data/ls.out

 

標準錯誤重定向:2>

 

追加不覆蓋:>>

 

對的和錯的分別重定向

ls /error /data >>/data/f1 2>>/data/f2

 

對的和錯的放在一起

ls /error /data >all.log 2>&1

注意次序!

 

新寫法:

ls /error /data &>all.log

(ls /error /data 2>&1)>all.log

 

set -C???? 不允許覆蓋,但允許追加

|>????????? 強制覆蓋

set+C???? 允許覆蓋

 

/dev/null????? 垃圾箱,無底洞,不希望輸出和保存的數據可導到這里

 

cat 啥都不跟的話會回顯,就既有標準輸入,又有標準輸出

 

tr命令

tr 轉換和刪除字符

tr [OPTION]… SET1 [SET2]

選項:

-c -C –complement:取字符集的補集

-d –delete:刪除所有屬于第一字符集的字符

-s –squeeze-repeats:把連續重復的字符以單獨一個字符表示

-t –truncate-set1:將第一個字符集對應字符轉化為第二字符集對應的字符[root@centos7 data]#tr ‘a-z’ ‘A-Z’

asdf1234

ASDF1234

 

[root@centos7 ~]#tr ‘a-z’ ‘A-Z’ < anaconda-ks.cfg > /data/log

[root@centos7 ~]#cat /data/log

 

[root@centos7 doc]#tr -dc ‘abc’

23423aabc3sff

aabc

 

[root@centos7 doc]#tr -s “abc”

aaabbbacde

abacde

 

[root@centos7 data]#hexdump -C win.txt

00000000? 61 0d 0a 62 0d 0a 63????????????????????????????? |a..b..c|

00000007

[root@centos7 data]#tr -d ‘\15’ < win.txt >win2.txt

[root@centos7 data]#hexdump -C win2.txt

00000000? 61 0a 62 0a 63??????????????????????????????????? |a.b.c|

00000005

[root@centos7 data]#tr -d ‘\r’ < win.txt >win3.txt

[root@centos7 data]#hexdump -C win3.txt

00000000? 61 0a 62 0a 63??????????????????????????????????? |a.b.c|

00000005

 

[root@centos7 data]#cat win3.txt

a? b??? ?c

[root@centos7 data]#tr -s ‘ ‘ <win3.txt

a b c

 

[root@centos7 data]#df > df.log

[root@centos7 data]#tr -s ‘ ‘ : < df.log

Filesystem:1K-blocks:Used:Available:Use%:Mounted:on

/dev/sda2:51474912:3405572:45431516:7%:/

devtmpfs:523248:0:523248:0%:/dev

tmpfs:537748:0:537748:0%:/dev/shm

tmpfs:537748:14544:523204:3%:/run

tmpfs:537748:0:537748:0%:/sys/fs/cgroup

/dev/sda1:999320:130824:799684:15%:/boot

/dev/sda3:20511312:45420:19400932:1%:/data

tmpfs:107552:12:107540:1%:/run/user/42

tmpfs:107552:0:107552:0%:/run/user/0

/dev/sr0:8490330:8490330:0:100%:/mnt

 

[root@centos7 qjy]#echo abcdef | tr ‘abcd’ ‘xyz’

xyzzef

[root@centos7 qjy]#echo abcdef | tr -t ‘abcd’ ‘xyz’

xyzdef

 

多行重定向

mail [-s] “hello” qjy@magedu.com << EOF

EOF

 

mail [-s] “hello” qjy@magedu.com < mail.txt

 

郵件里可用命令,如`hostname`

 

管道

 

cat mail.txt | mail -s ‘hello’ root

 

| 管道只處理標準輸出STDOUT,不處理STDERR,所以要想處理錯誤信息的話要重定向錯誤成標準輸出:

ls /boot /error 2>&1 | tr ‘a-z’ ‘A-Z’

或新寫法:

ls /boot /error |& tr ‘a-z’ ‘A-Z

比較老的系統如RHEL 5.4等可能不支持’

 

例:計算從1+2+..+100

echo {1..100} | tr ‘ ‘ + | bc

seq -s + 100 | bc

也可用循環

 

less :一頁一頁地查看輸入

ls -l /etc | less

mail:通過電子郵件發送輸入

echo “test email” | mail -s “test” user@example.com

lpr:把輸入發送給打印機

echo “test print” | lpr -P printer_name

 

管道中-符號

示例:

將/home里面的文件打包,但打包的數據不是記錄到文件,而是傳送到stdout,經過管道后,將tar -cvf – /home傳送給后面的tar -xvf – ,后面的這個 – 則是取前一個命令的 stdout,因此,就不需要使用臨時file了

tar -cvf – /home | tar -xvf –

 

重定向到多個目標(tee)

命令1 | tee [-a ] 文件名 | 命令2

把命令1的STDOUT保存在文件中,做為命令2的輸入

-a 追加

使用:

保存不同階段的輸出

復雜管道的故障排除

同時查看和記錄輸出

 

 

例:創建隨機小寫字母文件名

[root@centos7 data]#touch `openssl rand -base64 12 | tr -dc ‘[:lower:]’`

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/94976

(0)
qjyqjy
上一篇 2018-04-05
下一篇 2018-04-05

相關推薦

  • 第三章文件管理學習筆記

    文件系統結構元素

    創建和查看文佳

    復制、轉移和刪除文件

    使用Nautilus來管理文件

    軟和硬鏈接

    Linux筆記 2018-04-01
  • linux基礎2

    1.文件管理常用命令: <1>mkdir,rmdir mkdir:make directory mkdir [OPTION]… DIRECTORY… -p:自動按需創建父目錄; -v:verbose,顯示詳細過程; -m MODE;直接給定權限; 注意:路徑基名方為命令的作用對象;基名之前的路徑必須存在; rmdir:re…

    Linux筆記 2018-07-01
  • 第三周博客作業

    1、列出當前系統上所有已登錄的用戶名,注意:同一用戶登陸多次,則只顯示一次即可。
    2、取出最后登錄到當前系統的用戶的相關信息。
    3、取出當前系統上被用戶當作默認shell的最多的那個shell。
    4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全部改為大寫后保存至/tmp/maxusers.txt文件中。
    5、取出當前主機的IP地址,提示:對ifconfig命令的結果進行切分。
    6、列出/etc目錄下所有以.conf結尾的文件的文件名,并將其名字轉換為大寫后保存至/tmp/etc.conf文件中。
    7、顯示/var目錄下一級子目錄或文件的總個數。
    8、取出/etc/group文件中第三個字段數值最小的10個組的名字。
    9、將/etc/fstab和/etc/issue文件的內容合并為同一個內容后保存至/tmp/etc.test文件中。
    10、請總結描述用戶和組管理類命令的使用方法并完成以下練習:

    Linux筆記 2018-03-27
  • bash腳本進階

    過程式編程語言:順序執行選擇執行if判斷if 判斷條件;那么條件為真的分支代碼fi if 判斷條件;then條件為真的分支代碼else條件為假的分支代碼fi多分支if 判斷條件1; then條件為真的分支代碼elif 判斷條件2; then條件為真的分支代碼elif 判斷條件3; then條件為真的分支代碼else以上條件都為假的分支代碼ficase 變量引…

    2018-05-11
  • 隨堂筆記1

    記馬哥Linux運維課程第一周知識點(持續更新中) CPU 中央處理單元ROM 只讀 不可變 只能使用,不能修改RAM 易失性 運行內存 處理的數據皆為0、1 內部轉換為二進制 obase=2 output ibase=2 input 輔助存儲器 硬盤 倉庫 主存儲器 車間 處理數據 機架式Rack服務器 1U=1.75英寸=44.45mm C/S結構 cl…

    Linux筆記 2018-07-22
  • 第一章,計算機基礎知識學習筆記

    章節導航
    1.計算機系統
    2.計算機硬件組成
    3.操作系統
    4.Linux相關介紹
    5.Linux哲學思想
    6.獲取Linux
    7.虛擬機

    Linux筆記 2018-03-30
欧美性久久久久