标准i/o和管道
Vim f1
[root@centos7~]#]ps aux|grep vim
root 10967(进程编号) 0.1 0.4 151196 4828 pts/0 S+ 11:10 0:00 vim f1
root 11028 0.0 0.0 112660 968 pts/1 R+ 11:10 0:00 grep –color=auto vim
[root@centos7~]#]ls /proc/10967/fd/ -l
total 0
lrwx——. 1 root root 64 Nov 18 11:11 0 -> /dev/pts/0 0是标准输入
lrwx——. 1 root root 64 Nov 18 11:11 1 -> /dev/pts/0 1是标准输出
lrwx——. 1 root root 64 Nov 18 11:10 2 -> /dev/pts/0 2是标准错误输出
lrwx——. 1 root root 64 Nov 18 11:11 3 -> /root/.f1.swp //并没有真正打开f1文件,而是在/root下创建了一个.f1.swp的文件,.f1.swp关闭,才会真正存到f1文件中。
[root@centos7~]#]ls -a
. .bash_logout .dbus .f1.swp Music Videos
标准输出重定向
> //>或<必须跟文件名。
[root@centos7~]#]ls > /dev/pts/2 //ls命令结果输出到/dev/pts/2(终端窗口)来显示
[root@centos7~]#]tree -d /etc/ > /app/tree.log //标准输出重定向到文件中
[root@centos7~]#]ls > /app/tree.log //文件内容被ls命令结果覆盖
[root@centos7~]#]cat /app/tree.log
[root@centos7~]#echo “My hostname is `hostname`” > /app/system.log //uname -r系统版本
[root@centos7~]#]cat /app/system.log
My hostname is centos7 主机名
>> //追加
>> //创建新文件
[root@centos7~]#]hostname > f1
[root@centos7~]#]cat f1
centos7
[root@centos7~]#]set -C //禁止覆盖
[root@centos7~]#]ls > f1
-bash: f1: cannot overwrite existing file
[root@centos7~]#]ls >> f1 //可以追加
[root@centos7~]#]echo xxxx >| f1 //强制覆盖
[root@centos7~]#]set +C //允许覆盖
[root@centos7~]#]> f1
标准错误重定向
2>
[root@centos7~]#]ls nonono 2> f1
[root@centos7~]#]cat f1
ls: cannot access nonono: No such file or directory
正确结果和错误结果同时输出
[root@centos7~]#]ls nononon anaconda-ks.cfg &> f1 //新写法
[root@centos7~]#]cat f1
ls: cannot access nononon: No such file or directory
anaconda-ks.cfg
[root@centos7~]#]( error;hostname ) > f1 2>&1 //把错误的结果转换成正确的结果输出,2>&1放在命令后边。1>&2正确转换错误
[root@centos7~]#]cat f1
bash: error: command not found…
centos7
(echo error 1>&2)> /dev/null //打印出error,>重定向正确结果。
(echo error 1>&2)2> /dev/null //错误结果放垃圾箱,2>重定向错误结果
[root@centos7~]#](errcmd;hostname) 2>&1 > f1 //注意2>&1放的位置
bash: errcmd: command not found…
[root@centos7~]#]( (errcmd;hostname)2>&1) > f1 //((errcmd;hostname) > f1 2>&1
[root@centos7~]#]cat f1
bash: errcmd: command not found…
centos7
[root@centos7~]#](ls;pwd;hostname) >> f1 //批量输出重定向加括号
[root@centos7~]#]( error;hostname ) &> f1 //正确和错误的信息都放到f1里
[root@centos7~]#]( error;hostname ) &>> f1 //正确和错误的信息累加到f1里
((errcmd;hostname) >> f1 2>&1 //正确和错误的信息累加到f1里
[root@centos7~]#]( error;hostname ) > f1 2> f2 //正确的结果放f1,错误结果放f2
[root@centos7~]#]cat f2
bash: error: command not found…
[root@centos7~]#]cat f1
centos7
ll /dev/null //垃圾箱
[root@centos7~]#]ls > /dev/null //结果指向垃圾箱不进行显示
[root@centos7~]#]rpm -i /misc/cd/Packages/dos2unix-6.0.3-7.el7.x86_64.rpm &> /dev/null
tr命令(转换和删除字符)
[root@centos7~]#]tr 1 a
123124121212312
a23a24a2a2a23a2
[root@centos7~]#]tr -t 123 ab //-t截断
12345123
ab345ab3
[root@centos7~]#]tr ‘1-9’ ‘a-i’
122389345645
abbchicdefde
[root@centos7/app]#]tr -s ‘a’ //压缩重复字符
aassddfffaasaaaadfffaaaffwe
assddfffasadfffaffwe
[root@centos7/app]#]tr -sc ‘a’ //-c除了a,都压缩
aaddssfffddddeegg
aadsfdeg
[root@centos7/app]#]tr -dc ‘a’ //除了a全删,结束命令按Ctrl+d。
aaafsfsfdsdfwefaafsdfsdfagwrgr
werefwefwe
sdff
aaaaaaaa[root@centos7/app]#]
[root@centos7/app]#]tr -dc ‘a\n’ //除了a和换行全删,保留a和换行。回车即执行
asfdasfasf
aaa
[root@centos7/app]#]tr ‘\n’ ‘\t’ < f1
aaa bbb ccc ddd [root@centos7/app]#]tr ‘\n’ ‘\v’ < f1
aaa
bbb
ccc
ddd
[root@centos7/app]#]
[root@centos7/app]#]tr ‘a-z’ ‘A-Z’ < fstab //标准输入重定向,fstab文件中小写字母转换为大写。
[root@centos7/app]#]tr -d ‘a-z’ < fstab //删除fstab文件中小写字母
[root@centos7/app]#]tr -d ‘a-z’ < fstab >f1 //删除fstab文件中小写字母,并且输出重定向到f1。不可输出到源文件fstab。
[root@centos7/app]#]tr -d ‘\n’ < f1 //删除f1文件中的换行
aaabbbcccddd[root@centos7/app]#]
Windows和linux文本转换
Rz //win to linux
Sz //linux to win
[root@centos7/app]#]hexdump -C win.txt //16进制查看,0a换行,0d回车
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
[root@centos7/app]#]cat -A win.txt
a^M$ a=61,0d=^M(回车),0a=$(换行)
b^M$
[root@centos7/app]#]hexdump -C linux.txt //linux没有回车。
00000000 61 0a 62 0a 63 0a 0a |a.b.c..|
00000007
[root@centos7/app]#]tr -d ‘\r’ < win.txt > newwin.txt //把回车删掉
[root@centos7/app]#]hexdump -C newwin.txt
00000000 61 0a 62 0a 63 |a.b.c|
00000005
[root@centos7/app]#]hexdump -c win.txt
0000000 a \r \n b \r \n c
0000007
[root@centos7/app]#]dos2unix win.txt
dos2unix: converting file win.txt to Unix format …
[root@centos7/app]#]hexdump -c win.txt
0000000 a \n b \n c
0000005
[root@centos7/app]#]unix2dos win.txt
unix2dos: converting file win.txt to DOS format …
[root@centos7/app]#]hexdump -c win.txt
0000000 a \r \n b \r \n c
0000007
练习 v
1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中 v 2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中 v
3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下: Hello, I am 用户名,The system version is here,please help me to check it ,thanks! 操作系统版本信息 v
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开 v 5、计算1+2+3+..+99+100的总和 v
6、删除Windows文本文件中的‘^M’字符 v
7、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字 和空格 v
8、将PATH变量每个目录显示在独立的一行 v
9、将指定文件中0-9分别替代成a-j v
10、将文件中每个单词(由字母组成)显示在独立的一行,并无空行
1:[root@centos7/app]#]tr ‘a-z’ ‘A-Z’ < /etc/issue >/tmp/issue.out
[root@centos7/app]#]tr ‘[:lower:]’ ‘[:upper:]’ < /etc/issue >/tmp/issue.out
2:[root@centos7/app]#]who | tr ‘[:lower:]’ ‘[:upper:]’ > /tmp/who.out
3:[root@centos7~]#mail -s help root <<end
hello .i am `whoami^$USER`,
the system version is here ,pleade help me to check it,thanks!
`cat /etc/redhat-release“uname -r`
end
You have mail in /var/spool/mail/root
hello .i am root,
the system version is here ,pleade help me to check it,thanks!
CentOS Linux release 7.4.1708 (Core)
4:[root@centos7~]#]ls | tr ‘\n’ ‘ ‘ > /app/ls.out
5:[root@centos7~]#]echo {1..100}|tr ‘ ‘ ‘+’ |bc
[root@centos7~]#]seq -s “+” 1 100 |bc
6: tr -d ‘\r’ < win.txt > new.txt \\ tr -d ’\15’ < win.txt >new.txt//\15代表八进制的回车dos2unix unix2dos
[root@centos7/app]#]hexdump -C new.txt
00000000 61 0a 62 0a 63 |a.b.c|
00000005
7:[root@centos7/app]#]echo ‘xt.,l 1 jr#new.txtmn 2 c*/fe 3 uz 4’ | tr -dc ‘0-9[:space:]’ //[:digit:]数字
8:[root@centos7/app]#]echo $PATH | tr ‘:’ ‘\n’
9:[root@centos7/app]#]tr ‘0-9’ ‘a-j’ < list.txt
10:[root@centos7/app]#]tr -sc ‘a-zA-Z’ ‘\n’ < /etc/centos-release
[root@centos7/app]#]tr -dc ‘a-zA-Z ‘ < /etc/centos-release |tr -s ‘ ‘ ‘\n’
<<EOF //多行重定向
发邮件
Mail -s “h1” root < mail.txt
Mail -s “h2” root << end
[root@centos7~]#]cat /var/spool/mail/ //邮件存放地址
[root@centos7~]#]cat mail.txt|mail -s h3 root
[root@centos7~]#]cat > f1 << end
Heretest 就地文本
错误命令通过管道执行,转换成正确结果
[root@centos7~]#]error 2>&1 |tr ‘a-z’ ‘A-Z’ //不能用&>
[root@centos7~]#]error |& tr ‘a-z’ ‘A-Z’ //新方法,|&
分页显示:
[root@centos7~]#]ls -R /etc/ |less
[root@centos7~]#]ls -R /etc/ |more
Lpr:把输入发送给打印机
Echo “test print” | lpr -P printer_name
管道中-符号
示例:
将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf – /home 传送给后面的 tar -xvf – , 后面的这个 – 则是取前一个命令的stdout, 因此,就不需要使用临时file了
Tar -cvf – /home | tar -xvf –
[root@centos7~]#]ls |tee ls.out //重定向到文件并且在屏幕打印,默认覆盖性的。
[root@centos7~]#]who |tee ls.out
[root@centos7~]#]hostname |tee -a ls.out //-a追加新内容
[root@centos7~]#]hostname |tee -a ls.out | tr a-z A-Z
[root@centos7~]#]who | tee who.out| grep root
给文件分配文件描述符
[root@centos7/app]#]exec 8<> f1
[root@centos7/app]#]ls /proc/$$/fd/ -l
total 0
lrwx——. 1 root root 64 Nov 18 11:10 0 -> /dev/pts/1
lrwx——. 1 root root 64 Nov 18 11:10 1 -> /dev/pts/1
lrwx——. 1 root root 64 Nov 18 11:10 2 -> /dev/pts/1
lrwx——. 1 root root 64 Nov 18 16:32 255 -> /dev/pts/1
lrwx——. 1 root root 64 Nov 18 16:32 8 -> /app/f1 // 软链接
[root@centos7/app]#]cat f1
\S
Kernel \r on an \m
[root@centos7/app]#]cat /proc/$$/fd/8
\S
Kernel \r on an \m
[root@centos7/app]#]echo XXXXXXXXXX >> /proc/$$/fd/8 //8和f1是同一个文件。
[root@centos7/app]#]cat /proc/$$/fd/8
\S
Kernel \r on an \m
XXXXXXXXXX
[root@centos7/app]#]exec 8>- //8重定向成-,
[root@centos7/app]#]ll /proc/$$/fd/8
l-wx——. 1 root root 64 Nov 18 16:32 /proc/10987/fd/8 -> /app/-
[root@centos7/app]#]exec 8>&- //取消8和文件名的映射关系
[root@centos7/app]#]ll /proc/$$/fd/8
ls: cannot access /proc/10987/fd/8: No such file or directory
Exec是内部命令
Help exec
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88702