1.三种I/O设备
读入数据:Input(标准输入STDIN-0)
输出数据:Output(标准输出STDOUT-1、标准错误STDERR-2)
2.重定向
1> 或 > 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
以上如果文件已存在,文件内容会被覆盖:
set -C 禁止将内容覆盖已有文件,但可追加,利用 |> 仍可强制覆盖
set +C允许覆盖,默认
追加:
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
例子:
(1)STDOUT、STDERR重定向至不同位置
COMMAND > /path/to/file.out 2>/path/to/error.out
(2)合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1
COMMAND >> /path/to/file.out 2>&1
3.合并多个程序
(CMD1;CMD2……)或{CMD1;CMD2;……;}合并多个程序的STDOUT
ls 1> /dev/pts/1
ls /data > /dev/pts/1
标准错误重定向
rm -f /data/f1.log 2> /data/all.log
合并多个命令的结果到一个文件里
(cal 2019;cal 2020) >a.txt
{ ls;hostname;} >b.txt
清除大文件
cat /dev/null > /data/a.log
分别重定向
ls /data/ /xxx >stdout.log 2>stderr.out
将标准输出和错误都重定向到一个文件
ls /data /xxx >/data/all.log 2>&1
ls /data /xxx 2>/data/all.log 1>&2
ls /data/xxx &>/data/all.log
ls /data/xxx 2>&1 >/data/all.log
标准输入重定向
1.转换和删除字符tr(-d删除;-s去重;)
例1:把/etc/issue中的小写字母转换为大写字母
tr 'a-z' 'A-Z' < /etc/issue
例2:删除fstab文件中所有abc中任意的字符
tr -d abc < /etc/fstab
例3:替换为一个字符
tr -s ' ' < df.log
例4:替换为某个字符(这里是:)
tr -s ' ' : <df.log
2.将windows文本转化为Linux文本格式
cat windows.txt
file windows.txt
3.标准输入重定向:
cat > file
hello
word
按ctrl+d为输入 退出
cat < file > file2 (读取file内容,重定向到file2)
cat < file >> file2 (读取file内容,追加到file2)
4.多行重定向:使用“<<终止词”,终止词可以是一个或多个,如:!,@,$,EOF(end of file),magedu等
mail -s "Please call" admin@magedu.com <<EOF
>Hi wang
>zhang
>EOF
5.tee命令重定向到多个目标:
cat <<EOF |tree /etc/a.txt
>hello
>word
>EOF
管道符
1.将命令1的STDOUT作为命令2的STDIN:命令1 |命令2 |命令3
2.STDERR默认不能通过管道转发,可利用2>&1或|&
命令1 2>&1 | 命令2
命令1 |& 命令2
例1:df >df.log
tr -s ' ' < df.log
df | tr -s ' '
例2:ls /data /xxx |tr 'a-z' 'A-Z'
ls /data /xxx 2>&1|tr 'a-z' 'A-Z'
ls /data /xxx |& tr 'a-z' 'A-Z'
3.找文件夹:find ./ -type d -name passwd*
4.找文件:find ./ -name passwd* -print
5.修改用户密码为文件中的内容:
方法1:
cat passwd.txt #要改的密码
passwd --stdin root <passwd.txt #修改方法
方法2:
echo hi |passwd --stdin root
6.管道符中的-符号:后边这个-,表示提取前一个命令的stdout
tar -cvf - /home |tar -xvf - #表现形式,将/home文件夹整个复制到当前位置(时间戳不会变;也可用于文件夹的更新)
7.例:tr 可用于删除,去重,替换;seq用于取整数,seq -s 指定分隔符号
求1到100的和:
方法一:echo {1..100}|tr ' ' +|bc
方法二:seq -s + 1 100|bc
求1到100奇数的和:
方法一:echo {1..100..1}|tr ' ' +|bc
方法二:seq -s + 1 2 100|bc
求1到100偶数的和:
方法一:echo {2..100..1}|tr ' ' +|bc
方法二:seq -s + 2 2 100 |bc
作业
1.将/etc/issue中内容转换为大写,并保存到/tmp/issue.out中
tr 'a-z' 'A-Z' </etc/issue >/tmp/issue.out
2.将系统的登录状态用户的信息转换为大写后,保存到/tmp/who.out
查看系统的登录状态:
(1)w(2)who(3)last(4)lastlog
who|tr 'a-z' 'A-Z'>/tmp/who.out
3.将/root/下文件列表显示为一行,并用空格隔开
ll /root/|tr '\n' ' '
4.计算1到100的总和
方法一:echo {1..100}|tr ' ' +|bc
方法二:seq -s + 1 100|bc #其中-s表示指定分隔符
5.删除a.txt文件中的换行
tr -d "\r" <a.txt
6.只显示字符串中的数字和空格(tr -c取字符集的补集;-d删除所有属于第一字符集的字符;-s去重;-t替换)
cat df.txt|tr -cd "[0-9],' '"
7.将PATH中的路径单独显示为一行
echo $PATH|tr ':' '\n'
8.替换sed和正则匹配