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

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