Linux初体验之练习篇(七)tr
IO重定向
神奇的自动挂载tr
主要用途
转换或删除字符tr - translate or delete characters
tr [OPTION]... SET1 [SET2]
tr命令是一个强大的字符转换工具,可以对来自标准输入的字符进行各种转换,包括字符集对应转换、删除或都取字符补集、压缩和格式调整。格式调整包括换行、回车、加入制表符等。
常用参数-c, -C:--complemen, 取字符集的补集
-d:--delete, 删除所有属于第一个字符集的字符
-s:--squeeze-repeats, 压缩连续重复的字符为单独的一个字符
-t:--truncate-set1, 将第一个字符集对应的字符转换为第二个字符集对应的字符
tr对字符的格式调整\\ backslash
\a audible BEL
\b backspace
\f form feed # 换页
\n new line
\r return
\t horizontal tab
\v vertical tab
tr可用的字符集:使用格式:tr '[:lower:]' '[:upper:]'
[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:数字
[:graph:]:图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制字符
使用示例见末尾的练习IO重定向
我们都知道,所谓程序,可简单表示为:程序=指令+数据,而在Linux系统中,数据流可分为三大类:标准输入:standard input ——0 默认接受来自键盘的输入
标准输出:standard output ——1 默认输出到终端窗口
标准错误输出:standard error ——2 默认输出到终端窗口
所以,IO重定向就是改变IO输入输出的默认位置!而IO重定向的方式就要有重定向符号与管道两种方式。
另外,在Linux中,每个文件都有一个文件描述符 fd (file descriptor), 而这些文件描述符fd都会关联到一个设备上,Linux就是就是通过这些文件描述符来访问文件的!
查看文件描述符fd:[root@centos6 ~]# cd /proc
1. 输出重定向操作符格式:命令 操作符 文件名
> 把STDOUT重定向到文件,文件内容会被覆盖
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
>> 原有内容基础上,追加内容
>| 强制覆盖2>: 覆盖重定向错误输出数据流
2>>: 追加重定向错误输出数据流
合并标准输出和错误输出为同一个数据流进行重定向:
&>:覆盖重定向
&>>:追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>>&1
():多条命令输出重定向
(cal2007;cal2008) > all.txt
标准输出和错误输出各自定向至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
注:为避免文件被误覆盖:有以下两个功能选项# set -C: 禁止覆盖,但可追加
# set +C: 允许覆盖
2. 输入重定向操作符格式:命令 操作符 文件名
命令 操作符 终止词
<
3. 管道在linux系统中,管道的主要功能是将其他程序的输出结果直接导出到另一程序,
来做输入数据,即将前一程序的输出作为后一个程序的输入,符号为"|"。
管道的语法格式为:
COMMAND1 | COMMAND2 | COMMAND3 ...
将标准错误输出一起输入管道,命令格式为:
COMMAND1 |& COMMAND2 |& COMMAND3 ...
4. tee: 重定向到多个目标
tee
主要用途
重定向数据到文件且保存一个副本作为后续命令的输入tee - read from standard input and write to standard output and files
tee [OPTION]... [FILE]...
tee命令作为重定向数据的一个得力工具,其最大的特点是能够“分流”数据,一边可以重定向数据到目标文件,一边可以将重定向的数据保存一个副本作为后续命令的标准输入。一句话,就是把数据重定向到目标文件并输出到屏幕。
常用参数-a:--append,重定向时追加而不覆盖
-i:--ignore-interrupts, 忽略中断信号
使用示例[root@centos6 ~]# ls | tee /testdir/ls.log
anaconda-ks.cfg
Desktop
Documents
Downloads
install.log
install.log.syslog
Music
Pictures
Public
Templates
Videos
[root@centos6 ~]# cat /testdir/ls.log
anaconda-ks.cfg
Desktop
Documents
Downloads
install.log
install.log.syslog
Music
Pictures
Public
Templates
Videos
[root@centos6 ~]#[root@centos6 ~]# ls | tee out.txt | cat -n
1anaconda-ks.cfg 2Desktop 3Documents 4Downloads 5install.log
6install.log.syslog 7Music 8Pictures 9Public
10Templates 11Videos
[root@centos6 ~]# cat out.txt
anaconda-ks.cfg
Desktop
Documents
Downloads
install.log
install.log.syslog
Music
Pictures
Public
Templates
Videos
[root@centos6 ~]#神奇的自动挂载
在centos 6下有个神奇的自动挂载文件:misc[root@centos6 ~]# rpm -i /misc/cd/Packages/SOFTNAME
虽然df命令查不出其痕迹:[root@centos6 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 100660656 4614984 90925672 5% /
tmpfs 953648 224 953424 1% /dev/shm
/dev/sda1 194241 39141 144860 22% /boot
/dev/sda3 20027260 333820 18669440 2% /testdir
/dev/sr0 3824484 3824484 0 100% /media/CentOS_6.8_Final
神奇的是可直接使用 # rpm -i /misc/cd/Packages/SOFTNAME 直接挂载。练习一
1、使用别名命令,每日将/etc/目录下所有文件,备份到/testdir/下独立的新目录下,并要求新目录格式为backupYYYY-mm-dd ,备份过程可见。
2、先创建/testdir/rootdir目录,再复制/root所有下文件到该目录内,并要求保留原有权限。1、
[root@centos6 testdir]# alias backup='cp -rv /etc/ /testdir/backup`date +%F`'
2、
[root@centos6 ~]# cp -r --preserv=mode /root/ /testdir/rootdir
练习二
1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中[root@centos6 ~]# tr 'a-z' 'A-Z' /tmp/issue.out
2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中[root@centos6 ~]# w | tr 'a-z' 'A-Z' > /tmp/who.out
3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下: Hello, I am 用户名,the system version is here,pleasehelp me to check it ,thanks! 操作系统版本信息[liansir@centos6 ~]$ echo -e "Hello, I am $(whoami), the system version is here, please help me to check it,
thanks! \n$(lsb_release -a)" | mail -s help root
[liansir@centos6 ~]$
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开。[root@centos6 ~]# ls -x
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
[root@centos6 ~]# ls --format=horizontal
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
或:
[root@centos6 ~]#
[root@centos6 ~]# ls -a | tr '\n' ' '
5、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和[root@centos6 ~]# echo "1 2 3 4 5 6 7 8 9 10" | tr ' ' + | bc
55
[root@centos6 ~]#
或
[root@centos6 ~]# echo $[`echo "1 2 3 4 5 6 7 8 9 10" | tr ' ' + `]
55
[root@centos6 ~]#
或
[root@centos6 ~]# echo "1 2 3 4 5 6 7 8 9 10" > file2
[root@centos6 ~]# tr ' ' +
55
[root@centos6 ~]#
或
[root@centos6 ~]# cat file3
1 2 3 4 5 6 7 8 9 10
# 以下两种方法应该要优于上面的,假如一个文件中有1....10000的数的话。。。。
[root@centos6 ~]# tr " " "+"
55
[root@centos6 ~]# tr ' ' +
55
[root@centos6 ~]#
6、删除Windows文本文件中的'^M'字符[root@centos6 ~]# tr -d '\r' win2.txt
7、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格[root@centos6 ~]# echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4' | tr -cd '[:digit:] \n'
8、将PATH变量每个目录显示在独立的一行[root@centos6 ~]# echo $PATH | tr ':' '\n'
9、删除指定文件的空行[root@centos6 ~]# cat win.txt |tr -d '\r' |tr -s '\n'
10、将文件中每个单词(字母)显示在独立的一行,并无空行[root@centos6 ~]# cat f1 | tr -cs '[:alpha:]' '\n'
止战
2016.8.1