标准IO重定向、管道符|以及实际应用(改密码,求和,-,取整数,tr(替换、删除、去重))

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和正则匹配
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值