Linux之tr命令使用体会

虽然接触linux几年了,但之前从没用过tr命令,学习后才发现其实它是一个很简单但是很实用的文本处理工具。
先来看看man对它的描述:

NAME
       tr - translate or delete characters
SYNOPSIS
       tr [OPTION]... SET1 [SET2]
DESCRIPTION
       Translate, squeeze, and/or delete characters from standard input, writing to standard output.

还可以通过命令info coreutils 'tr invocation' 查看具体信息:

Synopsis:

     tr [OPTION]... SET1 [SET2]

   'tr' copies standard input to standard output, performing one of the
following operations:

   * translate, and optionally squeeze repeated characters in the
     result,
   * squeeze repeated characters,
   * delete characters,
   * delete characters, then squeeze repeated characters from the
     result.

可以看到严格上来说tr接受标准输出处理后再传给标准输出打印出来,它不能直接处理文本文件。

再来看看用法:
tr [OPTION]... SET1 [SET2]
其中参数:
-c, --complement:反选设定字符。用字符集SET1的补集替换此字符集,要求字符是ASCII码
-d, --delete:删除指令字符
-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
-t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等

字符范围
指定字符串SET1或字符串SET2的内容时,只能使用单字符或字符串范围或列表。以下是可接受的字符串范围及列表:

[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
\octal 一个三位的八进制数,对应有效的ASCII字符。
[On] 表示字符O重复出现指定次数n。因此[O2]匹配OO的字符串。
tr中特定控制字符的不同表达方式
速记符含义八进制方式
\\ 反斜杠
\a Ctrl-G 铃声
\b Ctrl-H 退格符
\f Ctrl-L 走行换页
\n Ctrl-J 新行
\r Ctrl-M 回车
\t Ctrl-I tab键
\v Ctrl-X 水平制表符
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
[CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)

[:alnum:]:字母和数字,可以用来替代'a-zA-Z0-9'
[:alpha:]:字母,可以用来替代'a-zA-Z'
[:cntrl:]:控制(非打印)字符
[:digit:]:数字,可以用来替代'0-9'
[:graph:]:图形字符
[:lower:]:小写字母,可以用来替代'a-z'
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母,可以用来替代'A-Z'
[:xdigit:]:十六进制字符

以下一些使用实例说明,其中有些涉及我在最近学习的其他命令,纯粹是为了复习加深印象以免忘记。
1.将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

[root@centos7 15:23:00 ~]#tr '[:lower:]' '[:upper:]' >  /tmp/issue.out  < /etc/issue
[root@centos7 15:23:26 ~]#cat /tmp/issue.out 
\S
KERNEL \R ON AN \M

[root@centos7 15:23:34 ~]#cat /etc/issue
\S
Kernel \r on an \m

[root@centos7 15:23:43 ~]#

这里也可用[a-z] [A-Z] 替代tr后的两个字符集

2.将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中

[root@centos7 15:36:28 ~]#w | tr [a-z] [A-Z] | tee >&1 /tmp/who.out
 15:36:40 UP  6:13,  1 USER,  LOAD AVERAGE: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ROOT     PTS/0    172.20.95.99     14:48    0.00S  0.74S  0.00S W
[root@centos7 15:36:40 ~]#

3.将/root/下文件列表,显示成一行,并文件名之间用空格隔开

[root@centos7 15:41:47 ~]#ls /root/ | tr '\n' ' '
anaconda-ks.cfg Desktop Documents Downloads hosts initial-setup-ks.cfg LISTEN ls.log Music passwd.out Pictures profile_test Public rge1.txt tee Templates test2.txt test3.txt test8.txt test.txt tr07.txt Videos [root@centos7 15:42:24 ~]#

4.计算1+2+3+..+99+100的总和

[root@centos7 15:45:08 ~]#echo {1..100} | tr ' ' '+'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[root@centos7 15:45:23 ~]#echo {1..100} | tr ' ' '+' | bc
5050
[root@centos7 15:45:29 ~]#
[root@centos7 15:45:29 ~]#seq -s + 1 100 | bc
5050
[root@centos7 15:53:03 ~]#

这样做比起循环来讲简单多了

5.处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格

[root@centos7 15:56:19 ~]#echo 'xt.,l 1 jr#bcmn 2 c*/fe 3 uz 4' | tr -d '[:alpha:]','[:punct:]'
 1  2  3  4
[root@centos7 15:56:26 ~]#

说明,-d 选项后多个字符集间使用逗号隔开方便可读,当然两个字符集也能在同一个引号下

6.将PATH变量每个目录显示在独立的一行

[root@centos7 15:56:26 ~]#echo $PATH | tr -s : '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
[root@centos7 15:58:41 ~]#

7.将文件/etc/centos-release中每个单词(由字母组成)显示在独立的一行,并无空行

[root@centos7 15:58:41 ~]#cat /etc/centos-release | tr -sc '[:alpha:]' '\n'
CentOS
Linux
release
Core
[root@centos7 16:00:48 ~]#

越深入Linux越能体会”小型,单一用途的程序;连接程序,共同完成复杂功能“

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章