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越能體會”小型,單一用途的程序;連接程序,共同完成復雜功能“
Linux之tr命令使用體會