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
格式:命令 操作符 文件名 > 把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.out2> /path/to/error.out
注:为避免文件被误覆盖:有以下两个功能选项
# set -C: 禁止覆盖,但可追加 # set +C: 允许覆盖
格式:命令 操作符 文件名 命令 操作符 终止词 < 重定向标准输入 <<终止词 多行输入重定向
在linux系统中,管道的主要功能是将其他程序的输出结果直接导出到另一程序, 来做输入数据,即将前一程序的输出作为后一个程序的输入,符号为"|"。 管道的语法格式为: COMMAND1 | COMMAND2 | COMMAND3 ... 将标准错误输出一起卷入管道,命令格式为: COMMAND1 |& COMMAND2 |& COMMAND3 ...
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.loganaconda-ks.cfg Desktop Documents Downloads install.loginstall.log.syslog Music Pictures Public Templates Videos [root@centos6 ~]# cat /testdir/ls.loganaconda-ks.cfg Desktop Documents Downloads install.loginstall.log.syslog Music Pictures Public Templates Videos [root@centos6 ~]#
[root@centos6 ~]# ls | tee out.txt | cat -n 1 anaconda-ks.cfg 2 Desktop 3 Documents 4 Downloads 5 install.log 6 install.log.syslog 7 Music 8 Pictures 9 Public 10 Templates 11 Videos [root@centos6 ~]# cat out.txtanaconda-ks.cfg Desktop Documents Downloads install.loginstall.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‘ < /etc/issue >/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 ‘ ‘ + < file2 | bc 55 [root@centos6 ~]# 或 [root@centos6 ~]# cat file3 1 2 3 4 5 6 7 8 9 10 # 以下两种方法应该要优于上面的,假如一个文件中有1....10000的数的话。。。。 [root@centos6 ~]# tr " " "+" < file3 | bc 55 [root@centos6 ~]# tr ‘ ‘ + < file3 | bc 55 [root@centos6 ~]#
6、删除Windows文本文件中的‘^M‘字符
[root@centos6 ~]# tr -d ‘\r‘ < win.txt > 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
本文出自 “止战-连Sir” 博客,请务必保留此出处http://liansir.blog.51cto.com/9372908/1833340
原文地址:http://liansir.blog.51cto.com/9372908/1833340