Linux之tr命令使用体会
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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文件中
[[email protected] 15:23:00 ~]#tr ‘[:lower:]‘ ‘[:upper:]‘ > /tmp/issue.out < /etc/issue
[[email protected] 15:23:26 ~]#cat /tmp/issue.out
\S
KERNEL \R ON AN \M
[[email protected] 15:23:34 ~]#cat /etc/issue
\S
Kernel \r on an \m
[[email protected] 15:23:43 ~]#
这里也可用[a-z] [A-Z] 替代tr后的两个字符集
2.将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
[[email protected] 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 [email protected] IDLE JCPU PCPU WHAT
ROOT PTS/0 172.20.95.99 14:48 0.00S 0.74S 0.00S W
[[email protected] 15:36:40 ~]#
3.将/root/下文件列表,显示成一行,并文件名之间用空格隔开
[[email protected] 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 [[email protected] 15:42:24 ~]#
4.计算1+2+3+..+99+100的总和
[[email protected] 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
[[email protected] 15:45:23 ~]#echo {1..100} | tr ‘ ‘ ‘+‘ | bc
5050
[[email protected] 15:45:29 ~]#
[[email protected] 15:45:29 ~]#seq -s + 1 100 | bc
5050
[[email protected] 15:53:03 ~]#
这样做比起循环来讲简单多了
5.处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格
[[email protected] 15:56:19 ~]#echo ‘xt.,l 1 jr#bcmn 2 c*/fe 3 uz 4‘ | tr -d ‘[:alpha:]‘,‘[:punct:]‘
1 2 3 4
[[email protected] 15:56:26 ~]#
说明,-d 选项后多个字符集间使用逗号隔开方便可读,当然两个字符集也能在同一个引号下
6.将PATH变量每个目录显示在独立的一行
[[email protected] 15:56:26 ~]#echo $PATH | tr -s : ‘\n‘
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
[[email protected] 15:58:41 ~]#
7.将文件/etc/centos-release中每个单词(由字母组成)显示在独立的一行,并无空行
[[email protected] 15:58:41 ~]#cat /etc/centos-release | tr -sc ‘[:alpha:]‘ ‘\n‘
CentOS
Linux
release
Core
[[email protected] 16:00:48 ~]#
越深入Linux越能体会”小型,单一用途的程序;连接程序,共同完成复杂功能“
以上是关于Linux之tr命令使用体会的主要内容,如果未能解决你的问题,请参考以下文章