标准i/o和管道(代码片段)

author author     2022-11-29     650

关键词:

3月14日
标准I/O和管道

1.在linux里每打开一个文件,就会响应开启一个文件描述符(fd)
例:
打开/var/log/message

[[email protected] data]# tail -f /var/log/messages 
Mar 11 20:37:36 centos7 NetworkManager[6246]: <info>  [1552307856.6123] dhcp4 (ens33):   nameserver ‘192.168.172.1‘
Mar 11 20:37:36 centos7 NetworkManager[6246]: <info>  [1552307856.6123] dhcp4 (ens33):   domain name ‘localdomain‘
Mar 11 20:37:36 centos7 NetworkManager[6246]: <info>  [1552307856.6123] dhcp4 (ens33): state changed bound -> bound
Mar 11 20:37:36 centos7 dbus[6238]: [system] Activating via systemd: service name=‘org.freedesktop.nm_dispatcher‘ unit=‘dbus-org.freedesktop.nm-dispatcher.service‘
Mar 11 20:37:36 centos7 dhclient[19931]: bound to 192.168.172.136 -- renewal in 791 seconds.

另起一个终端,在/proc中找到tail相对应的进程,进入fd目录

[[email protected] 21099]# cd /proc/`pidof tail`/fd
[[email protected] fd]# ll
total 0
lrwx------ 1 root root 64 Mar 11 20:42 0 -> /dev/pts/0
lrwx------ 1 root root 64 Mar 11 20:42 1 -> /dev/pts/0
lrwx------ 1 root root 64 Mar 11 20:42 2 -> /dev/pts/0
lr-x------ 1 root root 64 Mar 11 20:42 3 -> /var/log/messages   此为打开的文件,3就是文件描述符
lr-x------ 1 root root 64 Mar 11 20:42 4 -> anon_inode:inotify

在Linux中有3个标准的I/O描述符
0:标准输入:键盘输入,也可用文件输入
1:标准输出:默认输出当前端口,也可通过重定向输出至文件或其他终端。
2:错误输出:默认输出当前端口,也可通过重定向输出至文件或其他终端。

1.标准输出重定向: >
标准输出重定向在输出内容时会覆盖文件内的内容,如果要追加,需使用>>

标准输出的一些使用方法:

一、使用标准输出清空文件
使用标准输出清空文件有两种方法:
1.使用/dev/null清空文件

[[email protected] data]# ll list.txt
-rw-r--r-- 1 root root 24 Mar 11 20:58 list.txt
[[email protected] data]# cat /dev/null > list.txt 
[[email protected] data]# ll list.txt
-rw-r--r-- 1 root root 0 Mar 11 20:59 list.txt

2.直接使用>清空文件

[[email protected] data]# ll list.txt 
-rw-r--r-- 1 root root 24 Mar 11 21:02 list.txt
[[email protected] data]# > list.txt 
[[email protected] data]# ll list.txt
-rw-r--r-- 1 root root 0 Mar 11 21:02 list.txt

注意:使用此方法清空文件时,在某些shell中不支持

二、使用标准输出创建文件
标准输出可以创建空文件,实现方法如下:
1.使用>来创建文件

[[email protected] data]# ls
[[email protected] data]# > test
[[email protected] data]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 11 21:15 test

2.由于用>创建文件时,如果文件存在则会清空文件,为防止误操作,所以使用>>来创建空文件,此时即使文件存在也不会被覆盖,只会在文件后追加空行。
1.创建空文件

[[email protected] data]# >> test
[[email protected] data]# ll test
-rw-r--r-- 1 root root 0 Mar 11 21:24 test
2.重定向创建文件时,若文件存在:
[[email protected] data]# ll test 
-rw-r--r-- 1 root root 17 Mar 11 21:28 test
[[email protected] data]# > test
[[email protected] data]# ll test
-rw-r--r-- 1 root root 0 Mar 11 21:28 test   文件被清空

若要在使用标准输出时,文件不被覆盖可以使用以下设置
1.set -C :无法覆盖,但可以追加。但使用>|符号时扔可强制覆盖

[[email protected] data]# set -C
[[email protected] data]# echo "hello word" > test       
-bash: test: cannot overwrite existing file         无法覆盖
[[email protected] data]# echo "hello word" >| test      强制覆盖
[[email protected] data]# cat test
hello word
[[email protected] data]# echo "hello word" >> test      追加
[[email protected] data]# cat test
hello word
hello word

2.set +C :可以覆盖。

[[email protected] data]# echo "hi" > test
-bash: test: cannot overwrite existing file
[[email protected] data]# set +C
[[email protected] data]# echo hi > test
[[email protected] data]# echo test
test

标准错误重定向使用方法:
将错误输出至文件内

[[email protected] data]# ls -a
.  ..
[[email protected] data]# ls /error
ls: cannot access /error: No such file or directory
[[email protected] data]# ls /error 2> error.log
[[email protected] data]# cat  error.log 
ls: cannot access /error: No such file or directory

既有正确又有错误输出时合并重定向使用方法:

  1. right error > /path/to/file 2>&1
    把标准输出输出到file,再把错误输出的转变为标准输出一起输出到file
    [[email protected] /]# ls /data /error  > /data/test 2>&1 
    [[email protected] /]# cat /data/test
    ls: cannot access /error: No such file or directory
    /data:
    right
    test
  2. right error 2> /path/to/file >&2
    把错误输出输出到file,再把标准输出转变为错误输出一起输出到file
    [[email protected] /]# ls /data /error  2> /data/test >&2 
    [[email protected] /]# cat /data/test 
    ls: cannot access /error: No such file or directory
    /data:
    right
    test

    3.right error &> /path/to/file
    把正确的输出和错误的输出一起输出到 file

    [[email protected] /]# ls /data /error  &> /data/test
    [[email protected] /]# cat /data/test 
    ls: cannot access /error: No such file or directory
    /data:
    right
    test

    多条命令的执行结果存入一个文件内需要使用()

    [[email protected] data]# (hostname;uname -r) > file2
    [[email protected] data]# cat file2
    centos7.localdomain
    3.10.0-957.el7.x86_64

    所以以下写法也能实现合并正确和错误输出
    4.(right error 2>&1)> /path/to/file
    将错误输出转换为正确的一起输出至file

    
    [[email protected] data]# (ls /data /error 2>&1) > /data/file
    [[email protected] data]# cat /data/file
    ls: cannot access /error: No such file or directory
    /data:
    file
5.(right error >&2) 2> /path/to/file
将正确输出转换为错误的一同输出至file
```bash
[[email protected] data]# (ls /data /error >&2) 2> /data/file
[[email protected] data]# cat /data/file 
ls: cannot access /error: No such file or directory
/data:
file

单行重定向
单行重定向是将内容逐行传输给一个文件
cat > file

多行重定向
多行重定向是先输入每一行的内容然后一起定向到一个文件内
cat << eof > file 其中eof为文件结束符

示例:

[[email protected] ~]# cat << eof > file1
> hello word
> $HOSTNAME
> eof
[[email protected] ~]# cat file1
hello word
centos7.localdomain

管道 |
管道就是将前一项命令的结果当作后一项命令的输入

[[email protected] data]# echo abc | tr a-z A-Z
ABC

管道无法实现将错误命令结果也传递到后一项命令中要实现的话需要使用|&符号

[[email protected] data]# asdf sdf | tr a-z A-Z
bash: asdf: command not found...
Similar command is: ‘sadf‘
[[email protected] data]# asdf sdf |& tr a-z A-Z
BASH: ASDF: COMMAND NOT FOUND...
SIMILAR COMMAND IS: ‘SADF‘
Tee命令:
命令格式:
tee [OPTION]... [FILE]...
说明:
从标准输入读取数据分别输出至标准输出和文件中
选项 说明
-a 追加

示例:
1

[[email protected] data]# echo a..d | tee test
a b c d
[[email protected] data]# cat test
a b c d

2.tee命令默认在输出结果保存至文件中是会覆盖上一次的内容可以使用-a进行追加操作

[[email protected] data]# cat test
a b c d
[[email protected] data]# echo 1..3 | tee test
1 2 3
[[email protected] data]# cat test
1 2 3
[[email protected] data]# echo a..d | tee -a test
a b c d
[[email protected] data]# cat test
1 2 3
a b c d

tr命令:
命令格式:

   tr [OPTION]... SET1 [SET2]
说明:
转换或删除字符
选项 说明
-t 对位替换
-d 删除
-c 取反
-s 压缩

示例:
1.当SET1比SET2位数多时,SET1最后一位自动替换SET2的最后一位

[[email protected] ~]# tr ‘abcd‘ ‘123‘
abcdd
12333

2.要防止上述情况发生可以使用-t选项对位替换

[[email protected] ~]# tr -t ‘abcd‘ ‘123‘
abcddd
123ddd

3.-d对被SET1匹配中的内容进行删除

[[email protected] ~]# tr -d ‘abc‘
abcde
de

4.-c将除SET1以外的内容替换成SET2,在使用-c时需要用ctrl+d来执行

[[email protected] ~]# tr -c ‘abc‘ ‘d‘
abcdefg
abcddddd[[email protected] ~]# 

配合-d可以实现删除除了SET1之外的字符

5.-s将连续且相同的字符压缩

[[email protected] ~]# tr -s ‘abc‘
aaaaaaaaabbbbbbbccccccccdabd
abcdabd

6.在使用tr命令时还能使用通配符的方法进行替换

[[email protected] ~]# echo "abcdef" > test
[[email protected] ~]# tr ‘[:lower:]‘ ‘[:upper:]‘ < test
ABCDEF
[[email protected]

标准i/o和管道(代码片段)

标准I/O和管道>重定向操作符>,>>还能创建新文件>覆盖>>追加set-C禁止将内容覆盖已有文件,但可追加(相当于一个开关)>|file强制覆盖set+C允许覆盖1>标准输出重定向到一个文件里面2>标准错误重定向到一个文... 查看详情

标准io重定向和管道(代码片段)

标准I/O重定向和管道1标准输入和输出程序:指令+数据读入数据:Input输出数据:Output打开的文件都有一个fd:filedescriptor(文件描述符)Linux给程序提供三种I/O设备标准输入(STDIN)-0默认接受来自终端窗口的输入标准输出(STDOUT)-1... 查看详情

i/o重定向及管道(代码片段)

打开的文件都有一个fd:filedescriptor(文件描述符)标准输入:keyborad,0标准输出:monitor,1标准错误输出:monitor,2I/O重定向:改变标准位置输出重定向:COMMAND>NEW_POS,COMMAND>>NEW_POS:覆盖重定向,目标文件中的原有文件内... 查看详情

标准i/o和管道

1、标准输入和输出1>程序:指令+数据(指令服务于数据)  读入数据:input  输出数据:output2>三种I/O设备  Linux给程序提供三种I/O设备    标准输入(STDIN)-0默认接受来自键盘的输入    标准输出(STDOUT)-... 查看详情

标准i/o和管道

...使用四.使用管道链接命令五.tee命令的使用三种I/O设备(1)标准输入和输出程序:指令+数据a.指令:决定了功能是什么数据:b.读入数据:input输出数据:output(2)打开的文件都由一个(3)Linux给程序提供三种I/O设备:标准输入(STDIN)... 查看详情

标准i/o和管道

1:三种I/O设备标准输入(STDIN) -0 默认接受来自键盘的输入标准输出(STDOUT)-1 默认输出到终端窗口标准错误(STDERR)-2 默认输出到终端窗口I/O重定向:改变默认位置 >把正确结果输出到文件2>把错误输出到文件&... 查看详情

第四章标准i/o和管道

笔记整体起始时间:2018年4月2日18:55:25 本章内容       三种I/O设备       把I/O重定向至文件       使用管道 标准输入和输出&nbs 查看详情

重定向和管道(代码片段)

...在另一个地方显示。在系统设定当中,默认的输出设备:标准输出(STDOUT,用1描述),默认的输入设备:标准输入(STDIN,用0描述),标准错误输出(STDERR,用2描述),标准输入一般是用键盘,标准输出和错误输出一般在显示... 查看详情

初学linux之标准i/o和管道

标准输入和输出程序是由指令+数据组成程序的数据流有三种:输入数据流:<–标准输入(stdin),一般默认是键盘输出数据流:–>标准输出(stdout),一般默认到终端窗口错误输出流:–>标准错误(stderr),一般默认到... 查看详情

标准io和管道

标准I/O和管道##一,标准输入和输出##程序:指令+数据读入数据:Input输出数据:Output打开的文件都有一个fd:filedescriptor(文件描述符)Linux给程序提供三种I/O设备标准输入(STDIN)-0默认接受来自键盘的输入标准输出(STDOUT)-1默... 查看详情

10标准i/o输入输出重定向及管道

标准输入及输出linux提供三种I/O设备标准输入stdin-0默认接受来自终端的输入标准输出stdout-1默认输出到终端窗口标准错误stderr-2默认输出到终端窗口I/O重定向redirectI/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的... 查看详情

linux——标准i/o以及管道

标准I/O以及管道目录一、什么是I/O二、什么是管道三、三种I/O设备四、把I/O输出错误重定向入文件五、tr六、从文件中导入STDIN七、使用管道链接命令八、tee一、什么是I/O    I/O(input/output),即输入/输出端口。&nbs... 查看详情

linux学习第五节课-标准i/o和管道

                               Linux学习第五节课--- 查看详情

管道及i/o重定向

...制指令寄存器:CPU暂时存储器系统设定:默认输出设备:标准输出STDOUT1 标准输入设备:标准输入STDIN   0 标准错误输出:STDERR 查看详情

linux下的i/o与管道

阅读目录1.标准输入输出2.输入输出重定向3.tr命令4.管道和tee5.练习 1、标准输入输出   (1)linux给程序提供三种I/O设备      标准输入:(STDIN)   —0  默认接受来自键盘的输... 查看详情

linux中io重定向和管道(代码片段)

...据:Input输出数据:OutputLinux给程序提供三种I/O设备:1、标准输入(STDIN):-0默认为接受键盘输入2、标准输出(STDOUT):-1默认为输出到 查看详情

linux基础知识-i/o重定向,管道

系统设定 默认输出设备:标准输出,STDOUT,1 默认输入设备:标准输入,STDIN,0 标准错误输出:STDERR,2 标准输入:键盘标准输出和错误输出:显示器I/O重定向:Linux:>:覆盖输出[[email protected]~]#ll/var/>/tmp/var.out[[e... 查看详情

标准i/o及管道的使用用法

...出数据:Output Linux给程序提供的三种I/O设备  标准输入,-O默认接受来自键盘的输入  标准输出,-1默认输出到终端窗口  标准错误, 查看详情