标准输入和输出
程序:指令+数据
读入数据:input
输出数据:output
打开的文件都有一个fd:file descriptor(文件描述符)
Linux给程序提供三种I/O设备
标准输入(STDIN) -0 默认接受来自键盘的输入
标准输出(STDOUT) -1 默认输出到终端窗口
标准错误(STDERR) -2 默认输出到终端窗口
I/O重定向(redirect):改变默认位置
1.输出结果重定向到其他的终端窗口。
ls > /dev/pts/1 将当前的返回结果,重定向到/dev/pts/1中去。
whoami > /dev/pts/2 将whoami的返回结果,重定向到/dev/pts/2中去。
> f1 创建f1的空文件,便是重定向做的f1空文件,因为前面什么命令都没有,相当于没有输出于是就创建一个空文件。
2.输出结果重定向到某个文件中去。
who > who.log who的结果集,重定向放在who.log文件中。
如果换一换,
whereis > who.log 因为上面已经有who.log的文件,并且已经有内容了。那么这里会直接覆盖文件内容。
如果想文件不变,内容不丢,则
whereis >> who.log 原内容则不丢,把whereis的返回集内容追加在原内容下。
如果不想系统可以覆盖文件或者文件内容:
set -C:可以禁止系统中进行覆盖文件或者文件内容的操作,可以追加。
set +C:取消禁止系统中进行覆盖文件或者文件内容的操作。
如果已经set -C禁止覆盖了,也可以用>|强行覆盖。例:ip a >| who.log
三种I/O设备的STDIN -0、STDOUT -1、STDERR -2编号的用法:
ls /etc/ -R > /data/etclist.txt:将ls的目录递归显示出所有etc下的目录文件信息的返回集,
重定向放到/data/etclist.txt文件中。这是>,是没有编号的,不过默认为1,也就是ls /etc -R 1> /data/etclist.txt
cmd > /data/errlist.txt:cmd命令在Linux中是不存在的,所以会报错,但是报错信息不会存入errlist.txt中,
但是也会创建errlist.txt这个文件,只是没内容,空文件。
如果需要把报错信息也重定向存入文件中,则:
cmd 2> /data/errlist.txt即可。2表示STDERR,错误标准信息。
也可以cmd 2>> /data/errlist.txt。把错误信息重定向追加到原本的errlist.txt内容下。
注意:/dev/null是个垃圾桶文件,不要的信息可以往里丢,比如不想别人看到某个命令的输出结果,例:
rm -rf /data/ 2> /dev/null
命令不全都是对或者错,也有命令是有对有错的。则:
ls /etc /error:则是半对半错。这时,可以这么重定向:
ls /etc /error > /data/etclist 2> /dev/null
同样,可以把对的和错的都重定向到一个文件中:
ls /boot /error &> /data/all.txt
or
ls /boot /error > /data/all2.txt 2>&1 把ls /boot /error中对的结果放在all2.txt中,2>&1表示把2错的变成1对的。2>&1顺序不能乱。必须在后面。
把两条命令都重定向到某个文件中:
(cal 08 2020;cal 10 2020) >> /data/all.txt
标准输入:用文件内容代替键盘,输入到终端窗口。例:
nano f1.txt,f1.txt中2*3 2^8两个内容。
bc就是一个输入命令。那么:
bc < f1.txt
将bc的结果重定向到bclist.txt中。
bc < f1.txt > bclist.txt
多行重定向(就地文本heretxt):
cat > f1 <<EOF:cat后面不跟路径文件就是一个输入输出的命令。cat > f1就是将输入的内容重新输出后重定向给f1文件,
cat > f1 <<EOF,表示多行重定向,可以多行输入,以EOF字符结尾之前的输入内容重新输出后重定向给f1文件。EOF结束。
注意:EOF不是绝对的,只是EOF比较常用,用A、B、E、F都行。
EOF或其他结尾的字符必须单独一行,任何字符符号都不能有,否则就不认为是结束。
例:多行重定向,并且将命令格式写入进去,语句中调用其他命令用``符号,调用变量直接$变量即可:
cat > f1 <<EOF
> My hostname is `hostname`
> My username is $USER
> EOF
tr命令:
tr [option] set1 [set2]:转换或者删除字符。例:
tr 'a-z' 'A-Z':将输入的小写字符转换成大写字符。
那么,可以将文件内容输入到tr命令中。例:
tr 'a-z' 'A-Z' < /etc/issue > /data/etclist.txt:将/etc/issue文件中的小写字母转换成大写字母,并重定向到/data/etclist.txt文件中。
tr的set1和set2选项是一一对应的,例如,tr 'a-c' '1-3':将a转换成1,b转换成2,c转换成3。其他的不转换。set2选项有对应的set1转换,没对应转换的不转换,例:
tr 'a-c' '1-4' 4是多出来的,没有对应,只转换abc三个。
set1选项多出来,和set2选项不对应,例:
tr 'a-d' '1-3' 则d转换成3,set1选项多出来的,和set2选项不对应的值,则转换成set2选项的最后一个值。当然这个规则是可以修改的:
-t的参数,set1选项多出来的值,和set2没有对应的,则不做转换。例:tr 'a-d' '1-3',则d不做转换。
-d的参数,有-d参数时,只有set1选项,没有set2选项,例:tr -d 'abc',输入的所有字符去掉abc,输入:abcdf,输出:df。
-c和-C的参数,去字符集的补集。例:tr -dc '0-9',去掉出去0-9之外的所有字符。注意:这时需要用ctrl+d作为提交,而不是回车,这时Linux识别不了回车。
例:1 xt.,2 j3 r#!$4 mb,只保留数字、b字母和空格:echo '1 xt.,2 j3 r#!$ 4 mb' | tr -dc '[0-9][b][ ]'
用[]可以选择去掉多个,如果字符串中有特殊含义,又不需要它表示出特殊含义,则用单引号括起来。
-s的参数,压缩连体重复的字符。例:tr -s 'abc',压缩连续重复的a和b和c。输入aaaeokcpaobbdsacccccsaqaaa,返回:aeokcpaobdsacsaqa
将who的返回值重定向到wholist.txt中,压缩连续的重复成一个空格并把这个空格转换成+号:tr -s ' ' '~' < wholist.txt
注意:tr输入的某个文件,再次重定向输出给某个文件不能是原文件,例:tr -s ' ' '+' <1+2+3+..100.txt >bc.txt,重定向给bc.txt,不能再次重定向给1+2+3+...+100.txt这个文件。
1+2+3+..+100的题:
echo {1..100} > echolist.txt,将{1..100}的值,重定向给echolist.txt文件。
tr -s ' ' '+' < echolist.txt > bc.txt,将echolist.txt文件中的空格替换成+号后输出结果重定向给bc.txt。
bc < bc.txt
tr -d '\n' :删除回车。win中的文本换行是回车加换行。这时需要把win中的文本换行转换成Linux的换行就得删除win中的回车。
需要删除某文件的回车,直接tr -d '\r' < 某文件即可。(\n是换行)
mail:查看账号邮件。如果有邮件,输入邮件编号即可直接查看邮件内容。退出是quit。
mail -s "邮件名" 接收人$USER:发邮件,下方会让用户输邮件具体内容,以.结束。
管道:
命令1 | 命令2,也就是把命令1的输出传给命令2作为输入,最后输出。当然,也可以一直命令3|命令4|命令5。结论一样。
例如:whoami | tr 'a-z' 'A-Z':就是将whoami的输出结果,作为tr的输出,最后输出ROOT。
例如:1+2+3+..100:echo {1..100} | tr ' ' '+' | bc 。输出5050.
| 这个竖线就是管道符。
注意:管道符左边的命令必须是标准输出。不是标准错误,不是标准输入。管道符右边需要标准输入
注意:如果不确定管道符左边的命令是否是标准输出,可能导致标准错误,那么可以转换成标准输出,把错误信息也可以作为标准输入给管道符右边的命令。
例:errorcmd 2>&1 | tr 'a-z' 'A-Z' or errorcmd |& tr 'a-z' 'A-Z' 两种方法,都行,都可以把错误转换成输出。
less:把文件内容作分页显示,例如:cat /porc/meminfo | less,空格往下翻页,q退出,方向上下键可以一行一行操作,PgUp、PgDn上下翻页。
lpr:把内容发送给打印机。例:echo "test print" lpr -P print_name
- 符号:例:tar -cvf - /home | tar -xvf - tar -cvf - /home,将/home打包,打包的文件名叫- ,tar -xvf - ,解包,将前面的-文件名解包。
- 作为临时文件。这样就不需要专门创建一个临时file了。
tee:
命令1 | tee [-a] 文件1 | 命令2。
把命令1的标准输出保存到文件1中,并且作为命令2的输入使用。-a表示是否追加,没有-a就会将文件1的内容全部覆盖。
类似重定向到文件1中,不过依然在终端窗口输出命令1的结果。后方的命令2可加可不加,只是tee有标准输出,所以后面还可以跟管道。