-
输入:对一个文件输入,除了键盘输入外,还可以通过一个文件输入
-
输出:执行一个命令,会有相应的输出到屏幕上。输出有标准的正确输出和错误输出。
-
重定向:把一个输出结果,再输出到另一个文件或一个终端
1、重定向
linux中有三种标准输入输出:
-
STDIN就是标准输入,默认从键盘读取信息
-
STDOUT是标准输出,默认将输出结果输出至终端,也就是显示器之类的东西
-
STDERR是标准的错误信息,默认也会显示在终端上。
由于STDOUT与STDERR都会默认显示在终端上,为了区分:
0 |
表示STDIN,标准输入 |
1 |
表示STDOUT,标准输出 |
2 |
表示STDERR,标准错误 |
& |
表示所有的正确和错误输出 |
#禁止覆盖重定向现有文件
#如果还是要强制覆盖,使用">|"
set -C
#允许覆盖重定向
set +C
2、输出重定向
2.1、标准正确输出重定向
-
1> 覆盖式重定向。不加前面的1,默认就是正确输出
-
1>> 追加式重定向。
2.2、标准错误输出重定向
-
2> 覆盖
-
2>> 追加
2.3、怎么判断一个命令的输出是正确输出还是错误输出呢?
例1:
#将标准正确输出,重定向到find.out
#将标准错误输出,重定向到fine.err
find /etc -name passwd >find.out 2>find.err
例2:
#如果还有输出,说明这个重定向方式没起作用的,也就是说这是一个错误的输出,反之,就是一个正确的输出。
adfkldf >> /tmp/t.txt
例3:
#只是判断上一次命令有没有执行成功,不能判断输出是一个标准正确还是错误输出。
echo $?
例4:
#把输出结果丢到垃圾筒
ls > /dev/null
2.4、怎么同时把标准正确和错误的输出重定向到同一个文件呢?
find /home -name kiosk 1>>/tmp/f1 2>>/tmp/f1
-
这种方式会打乱输出,先重定向正确输出,才会输出错误输出。
find /home -name kiosk &> /tmp/f1
-
这种方法就不会打乱输出了
-
&表示所有正确和错误的输出
有时候希望将一个错误输出重新定向到正确输出,就是将2的结果重定向至1中,就有了"2>1"这样的思路,如果按照上面的写法,系统会默认将错误输出重定向到一个名字为1的文件中,而非标准输出中。因此需要加&进行区分,就有了 2>&1
#把一个错误输出转换成正确输出,然后再以正确输出重定向到/tmp/f1文件
find /home -name kiosk > /tmp/f1 2>&1
3、输入重定向
从一个文件的标准输出,再把这个输出作为输入到另一个文件
3.1、cat
cat,默认,将键盘的输入,输出到屏幕上
#通过键盘输入,重定向到f1这个文件,以ctrl+d结束
cat > /tmp/f1
#把/etc/passwd这个文件内容作为输入给cat,然后重定向到f1这个文件
cat > /tmp/f1 < /etc/passwd
#定义一个结束符,当输入EOF,键盘输入就会结束。
#注意:EOF不是固定字符,可以自己随便定义
cat > /tmp/f1 <<”EOF”
3.2、tr
tr用来从标准输入中通过替换或删除操作进行字符转换
-
默认为替换
-
-d,删除指定字符
-
-s 删除所有重复出现字符序列,只保留第一个
#删除换行符和制表符
cat file | tr -d "\n\t" > new_file
#删除空行
#空行,也有一个换行符,将多个连续的换行符删掉,也就是把空行删除了
cat file | tr -s "\n" > new_file
#将/etc/fstab文件中的所有a,换成A,b换成B,c换成C
#tr命令,替换字符
tr abc ABC < /etc/fstab
#将所有小写字母,替换成大写输出
tr 'a-z' 'A-Z' < /etc/fstab
4、管道
4.1、|
把管道符前面的命令的标准输出,当作后面命令的输入。
cat /etc/passwd | more
4.2、tee
tee命令读取标准输入,把这些内容同时输出到标准输出和(多个)文件中
要注意的是:在使用管道时,前一个命令的标准错误输出不会被tee读取。
#tee,默认覆盖保存
cat /etc/passwd | tee f.txt
#-a,追加
pwd | tee -a f.txt
5、read命令
接收标准输入(键盘)的输入,得到输入后,read命令将数据放入一个标准变量中
#将键盘的输入,存放到name这个变量中
read name
#取变量的值
echo $name
#-p,打印一句话,然后等用户输入
read -p "Enter your name:" name