linux删除第二列为空_Linux之基本文本处理工具(二)
四、按列抽取與合并cut
cut是一個選取命令,就是將一段數據經過分析,取出我們想要的。一般來說,選取信息通常是針對“行”來進行分析的,并不是整篇信息分析的。
1、命令格式:
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
2.使用說明:
cut 命令從文件的每一行剪切字節、字符和字段并將這些字節、字符和字段寫至標準輸出。 如果不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標志之一。
3主要參數:b?:以字節為單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了?-n?標志。
-c?:以字符為單位進行分割。
-d?:自定義分隔符,默認為制表符。
-f?:與-d一起使用,指定顯示哪個區域。
#:?第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段,?例如1-6
混合使用:?1-3,7
-n?:取消分割多字節字符。僅和?-b?標志一起使用。如果字符的最后一個字節落在由?-b?標志的?List?參數指示的
范圍之內,該字符將被寫出;否則,該字符將被排除。
4.cut定位方法:
cut命令主要是接受三個定位方法:
第一,字節(bytes),用選項-b
第二,字符(characters),用選項-c
第三,域(fields),用選項-f,與-d結合使用
實例一:以字節定位[root@bash?~]#?ll?re
-rw-r--r--?1?root?root?57?Jan??3?22:36?re
[root@bash?~]#?cat?re
one?apple?a?day!
two?apple?two?day!
tree
four
five
six
[root@bash?~]#?cut?-b?1,2,5-7?re
onapp
twapp
tr
fo
fi
si
實例二:以字符定位[root@bash?~]#?ll?re
-rw-r--r--?1?root?root?57?Jan??3?22:36?re
[root@bash?~]#?cat?re
one?apple?a?day!
two?apple?two?day!
tree
four
five
six
[root@bash?~]#?cut?-c?1,3,6-8?re
oeppl
toppl
te
fu
fv
實例三:以域定位[root@bash?~]#?head?-n3?/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@bash?~]#?head?-n3?/etc/passwd?|?cut?-d:?-f?1,3,5-7
root:0:root:/root:/bin/bash
bin:1:bin:/bin:/sbin/nologin
daemon:2:daemon:/sbin:/sbin/nologinpaste
paste單詞意思是粘貼。該命令主要用來將多個文件的內容合并,與cut命令完成的功能剛好相反。粘貼兩個不同來源的數據時,首先需將其分類,并確保兩個文件行數相同。paste將按行將不同文件行信息放在一行。缺省情況下, paste連接時,用空格或tab鍵分隔新行中不同文本,除非指定-d選項,它將成為域分隔符。
1.命令格式:
paste [OPTION]... [FILE]...
2、常用選項:-d:??指定兩個文件的行合并后的分割符
-s:?將每個文件合并為一行,而不是按行進行合并
3、常見用法:paste?file1?file2?#將兩個文件的每行合并
paste?-d:?file1?file2?#將兩個文件的每行合并,分隔符為:
paste?-s?file1?file2?#將file1的內容合并為一行,將file2的內容合并為一行
實例:[root@bash?~]#?cat?a
aa
bb
cc
dd
ee
[root@bash?~]#?cat?b
xx
hh
cc
zz
ll
[root@bash?~]#?paste?a?b
aa??????xx
hh
bb??????cc
cc??????zz
dd??????ll
ee
[root@bash?~]#?paste?-d:?a?b???#使用冒號作為分隔符
aa:xx
:hh
bb:cc
cc:zz
dd:ll
ee:
[root@bash?~]#?paste?-s?a?b?#a文件合并一行,b文件合并一行
aa??????????????bb??????cc??????dd??????ee
xx??????hh??????cc??????zz??????lljoin
join將兩個文件中,指定欄位內容相同的行連接起來。
1.命令格式:join?[-i][-a<1或2>][-e][-o]?[-t][-v<1或2>][-1][-2][--help]?[--version][文件1][文件2]
2.命令參數:-a<1或2>???除了顯示原來的輸出內容之外,還顯示指令文件中沒有相同欄位的行。
-i或--igore-case???比較欄位內容時,忽略大小寫的差異。
-o???按照指定的格式來顯示結果。
-t???使用欄位的分隔字符。
-1???連接[文件1]指定的欄位。
-2???連接[文件2]指定的欄位。
3.命令說明:
默認連接是每個文件的第一個字段。
指定輸出字段: -o ... 其中FILENO=1表示第一個文件,FILENO=2表示第二個文件,FIELDNO表示字段序號,從1開始編號。默認會全部輸出,但關鍵字列只輸出一次。 比如:-o 1.1 1.2 2.2 表示輸出第一個文件的第一個字段、第二個字段,第二個文件的第二個字段。
使用示例
示例一 內連接(忽略不匹配的行)不指定任何參數的情況下使用join命令,就相當于數據庫中的內連接,關鍵字不匹配的行不會輸出。[root@rhel55?linux]#?cat?month_cn.txt
1???????一月
2???????二月
3???????三月
4???????四月
5???????五月
6???????六月
7???????七月
8???????八月
9???????九月
10??????十月
11??????十一月
12??????十二月
13??????十三月,故意的
[root@rhel55?linux]#?cat?month_en.txt
1???????January
2???????February
3???????March
4???????April
5???????May
6???????June
7???????July
8???????August
9???????September
10??????October
11??????????????November
12??????December
14??????MonthUnknown
注:注意兩個文件的內容,中文版的多了十三月,英文版的多了14月,這純粹是為了方便演示。[root@rhel55?linux]#?join?month_cn.txt?month_en.txt
1?一月?January
2?二月?February
3?三月?March
4?四月?April
5?五月?May
6?六月?June
7?七月?July
8?八月?August
9?九月?September
10?十月?October
11?十一月?November
12?十二月?December
[root@rhel55?linux]#
示例二 左連接(又稱左外連接,顯示左邊所有記錄)顯示左邊文件中的所有記錄,右邊文件中沒有匹配的顯示空白。[root@rhel55?linux]#?join?-a1?month_cn.txt?month_en.txt
1?一月?January
2?二月?February
3?三月?March
4?四月?April
5?五月?May
6?六月?June
7?七月?July
8?八月?August
9?九月?September
10?十月?October
11?十一月?November
12?十二月?December
13?十三月
[root@rhel55?linux]#
示例三 右連接(又稱右外連接,顯示右邊所有記錄)顯示右邊文件中的所有記錄,左邊文件中沒有匹配的顯示空白。[root@rhel55?linux]#?join?-a2?month_cn.txt?month_en.txt
1?一月?January
2?二月?February
3?三月?March
4?四月?April
5?五月?May
6?六月?June
7?七月?July
8?八月?August
9?九月?September
10?十月?October
11?十一月?November
12?十二月?December
14?MonthUnknown
[root@rhel55?linux]#
**示例四?全連接(又稱全外連接,顯示左邊和右邊所有記錄)**
[root@rhel55?linux]#?join?-a1?-a2?month_cn.txt?month_en.txt
1?一月?January
2?二月?February
3?三月?March
4?四月?April
5?五月?May
6?六月?June
7?七月?July
8?八月?August
9?九月?September
10?十月?October
11?十一月?November
12?十二月?December
13?十三月
14?MonthUnknown
[root@rhel55?linux]#
示例五 指定輸出字段'比如參數 -o 1.1 表示只輸出第一個文件的第一個字段。[root@rhel55?linux]#?join?-o?1.1?month_cn.txt?month_en.txt
1
2
3
4
5
6
7
8
9
10
11
12
[root@rhel55?linux]#?join?-o?1.1?2.2?month_cn.txt?month_en.txt
1?January
2?February
3?March
4?April
5?May
6?June
7?July
8?August
9?September
10?October
11?November
12?December
[root@rhel55?linux]#?join?-o?1.1?2.2?1.2?month_cn.txt?month_en.txt
1?January?一月
2?February?二月
3?March?三月
4?April?四月
5?May?五月
6?June?六月
7?July?七月
8?August?八月
9?September?九月
10?October?十月
11?November?十一月
12?December?十二月
[root@rhel55?linux]#?join?-o?1.1?2.2?1.2?1.3?month_cn.txt?month_en.txt???<==?字段1.3并不存在
1?January?一月
2?February?二月
3?March?三月
4?April?四月
5?May?五月
6?June?六月
7?July?七月
8?August?八月
9?September?九月
10?October?十月
11?November?十一月
12?December?十二月
[root@rhel55?linux]#
示例六:我們知道 /etc/passwd 第四個字段是 GID那個 GID 記錄在 /etc/group 當中的第三個字段,請問如何將兩個文件整合?[root@www?~]#?head?-n?3?/etc/passwd?/etc/group
==>?/etc/passwd?<==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
==>?/etc/group?<==
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
#?從上面可以看到,確實有相同的部分喔!趕緊來整合一下!
[root@www?~]#?join?-t?':'?-1?4?/etc/passwd?-2?3?/etc/group
0:root:x:0:root:/root:/bin/bash:root:x:root
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
#?同樣的,相同的字段部分被移動到最前面了!所以第二個文件的內容就沒再顯示。
五、文本分析wc
Linux系統中的wc(Word Count)命令的功能為統計指定文件中的字節數、字數、行數,并將統計結果顯示輸出。
1.命令格式:
wc [選項]文件...
2.命令功能:
統計指定文件中的字節數、字數、行數,并將統計結果顯示輸出。該命令統計指定文件中的字節數、字數、行數。如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所指定文件的總統計數。
3.命令參數:-c?統計字節數。
-l?統計行數。
-m?統計字符數。這個標志不能與?-c?標志一起使用。
-w?統計字數。一個字被定義為由空白、跳格或換行字符分隔的字符串。
-L?打印最長行的長度。
-help?顯示幫助信息
--version?顯示版本信息
4.使用實例:
實例1:查看文件的字節數、字數、行數
命令:wc?test.txt
輸出:[root@localhost?test]#?cat?test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu?linux
redhat
Redhat
linuxmint
[root@localhost?test]#?wc?test.txt
7??8?70?test.txt
[root@localhost?test]#?wc?-l?test.txt
7?test.txt
[root@localhost?test]#?wc?-c?test.txt
70?test.txt
[root@localhost?test]#?wc?-w?test.txt
8?test.txt
[root@localhost?test]#?wc?-m?test.txt
70?test.txt
[root@localhost?test]#?wc?-L?test.txt
17?test.txt
說明:7?8?70?test.txt
行數 單詞數 字節數 文件名
實例2:用wc命令怎么做到只打印統計數字不打印文件名[root@localhost?test]#?wc?-l?test.txt
7?test.txt
[root@localhost?test]#?cat?test.txt?|wc?-l
7
說明:
使用管道線,這在編寫shell腳本時特別有用。
實例3:用來統計當前目錄下的文件數
命令:
ls -l | wc -l
輸出:[root@localhost?test]#?cd?test6
[root@localhost?test6]#?ll
總計?604
---xr--r--?1?root?mail??302108?11-30?08:39?linklog.log
---xr--r--?1?mail?users?302108?11-30?08:39?log2012.log
-rw-r--r--?1?mail?users?????61?11-30?08:39?log2013.log
-rw-r--r--?1?root?mail???????0?11-30?08:39?log2014.log
-rw-r--r--?1?root?mail???????0?11-30?08:39?log2015.log
-rw-r--r--?1?root?mail???????0?11-30?08:39?log2016.log
-rw-r--r--?1?root?mail???????0?11-30?08:39?log2017.log
[root@localhost?test6]#?ls?-l?|?wc?-l
8
[root@localhost?test6]#
說明:
數量中包含當前目錄sort
sort將文件的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出。
1.命令格式:
sort [-fbMnrtuk] [file or stdin]
2.主要參數:-f??:忽略大小寫的差異,例如?A?與?a?視為編碼相同;
-b??:忽略最前面的空格符部分;
-M??:以月份的名字來排序,例如?JAN,?DEC?等等的排序方法;
-n??:使用『純數字』進行排序(默認是以文字型態來排序的);
-r??:反向排序;
-u??:就是?uniq?,相同的數據中,僅出現一行代表;
-t??:分隔符,默認是用?[tab]?鍵來分隔;
-k??:以那個區間?(field)?來進行排序的意思
實例一:對/etc/passwd 的賬號進行排序[root@www?~]#?cat?/etc/passwd?|?sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sort 是默認以第一個數據來排序,而且默認是以字符串形式來排序,所以由字母 a 開始升序排序。
實例二:/etc/passwd 內容是以 : 來分隔的,以第三欄來排序[root@www?~]#?cat?/etc/passwd?|?sort?-t?':'?-k?3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
實例三:默認是以字符串來排序的,如果想要使用數字排序:[root@www?~]#cat?/etc/passwd?|?sort?-t?':'?-k?3n
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
實例四:默認是升序排序,如果要倒序排序[root@www?~]#cat?/etc/passwd?|?sort?-t?':'?-k?3nr
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ntp:x:106:113::/home/ntp:/bin/false
messagebus:x:105:109::/var/run/dbus:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
實例五:如果要對/etc/passwd,先以第六個域的第2個字符到第4個字符進行正向排序,再基于第一個域進行反向排序。[root@www?~]#cat?/etc/passwd?|??sort?-t':'?-k?6.2,6.4?-k?1r
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
實例六:查看/etc/passwd有多少個shell:對/etc/passwd的第七個域進行排序,然后去重:[root@www?~]#cat?/etc/passwd?|??sort?-t':'?-k?7?-u
root:x:0:0:root:/root:/bin/bash
syslog:x:101:102::/home/syslog:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologinuniq
uniq命令可以去除排序過的文件中的重復行,因此uniq經常和sort合用。也就是說,為了使uniq起作用,所有的重復行必須是相鄰的。
1.命令格式:
uniq [-idcu]
2.常用參數:-i:忽略大小寫字符的不同;
-c:顯示每行重復的次數
-u:只顯示唯一的行
-d:僅顯示重復過的行
實例:
a.直接刪除未經排序的文件,將會發現沒有任何行被刪除[root@www?~]#cat?testfile
hello
world
friend
hello
world
hello
[root@www?~]##uniq?testfile
hello
world
friend
hello
world
hello
b.排序文件,默認是去重[root@www?~]##cat?words?|?sort?|uniq
friend
hello
world
c.排序之后刪除了重復行,同時在行首位置輸出該行重復的次數[root@www?~]##sort?testfile?|?uniq?-c
1?friend
3?hello
2?world
d.僅顯示存在重復的行,并在行首顯示該行重復的次數[root@www?~]##sort?testfile?|?uniq?-dc
3?hello
2?world
e.僅顯示不重復的行[root@www?~]#sort?testfile?|?uniq?-u
frienddiff
diff 命令是 linux上非常重要的工具,用于比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。
1.命令格式:diff[參數][文件1或目錄1][文件2或目錄2]
2.命令功能:diff命令能比較單個文件或者目錄內容。如果指定比較的是文件,則只有當輸入為文本文件時才有效。以逐行的方式,比較文本文件的異同處。如果指定比較的是目錄的的時候,diff 命令會比較兩個目錄下名字相同的文本文件。列出不同的二進制文件、公共子目錄和只在一個目錄出現的文件。
3.命令參數:-c? 顯示全部內文,并標出不同之處。
-u,-U或--unified=? 以合并的方式來顯示文件內容的不同。
-i:忽略大小寫
-b(--ignore-space-change):忽略空格的變化
-B(--ignore-blank-lines):比較時忽略空白行
-a:將比較的文件都當成純文本文件處理
-r:遞歸比較子目錄(如diff?-r?/etc/rc.d/rc3.d/?/etc/rc.d/rc5.d/比較兩個不同開機運行級別的目錄)
-N或--new-file? 在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only?in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。
-w或--ignore-all-space? 忽略全部的空格字符。
-W或--width? 在使用-y參數時,指定欄寬。
-y或--side-by-side? 以并列的方式顯示文件的異同之處。
4.diff說明:正常格式(normal?diff)
上下文格式(context?diff)
合并格式(unified?diff)
a、示例文件
為了便于講解,先新建兩個示例文件。
第一個文件叫做f1,內容是每行一個a,一共7行。a
a
a
a
a
a
a
第二個文件叫做f2,修改f1而成,第4行變成b,其他不變。a
a
a
b
a
a
a
b、正常格式的diff
現在對f1和f2進行比較:$?diff?f1?f2
這時,diff就會顯示正常格式的結果:4c4
---
>?b
第一行是一個提示,用來說明變動位置。4c4
它分成三個部分:前面的"4",表示f1的第4行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);后面的"4",表示變動后變成f2的第4行。
第二行分成兩個部分。
前面的小于號,表示要從f1當中去除該行(也就是第4行),后面的"a"表示該行的內容。
第三行用來分割f1和f2。---
第四行,類似于第二行。>?b
前面的大于號表示f2增加了該行,后面的"b"表示該行的內容。
最早的Unix(即AT&T版本的Unix),使用的就是這種格式的diff。
c、上下文格式的diff
上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,覺得diff的顯示結果太簡單,最好加入上下文,便于了解發生的變動。因此,推出了上下文格式的diff。
它的使用方法是加入c參數(代表context)。$?diff?-c?f1?f2
顯示結果如下:***?f1?2012-08-29?16:45:41.000000000?+0800
---?f2?2012-08-29?16:45:51.000000000?+0800
***************
***?1,7?****
a
a
a
!a
a
a
a
---?1,7?----
a
a
a
!b
a
a
a
這個結果分成四個部分。
第一部分的兩行,顯示兩個文件的基本情況:文件名和時間信息。***?f1?2012-08-29?16:45:41.000000000?+0800
---?f2?2012-08-29?16:45:51.000000000?+0800
"***"表示變動前的文件,"---"表示變動后的文件。
第二部分是15個星號,將文件的基本情況與變動內容分割開。***************
第三部分顯示變動前的文件,即f1。***?1,7?****
a
a
a
!a
a
a
a
這時不僅顯示發生變化的第4行,還顯示第4行的前面三行和后面三行,因此一共顯示7行。所以,前面的"*** 1,7 ****"就表示,從第1行開始連續7行。
另外,文件內容的每一行最前面,還有一個標記位。如果為空,表示該行無變化;如果是感嘆號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行為新增。
第四部分顯示變動后的文件,即f2。---?1,7?----
a
a
a
!b
a
a
a
除了變動行(第4行)以外,也是上下文各顯示三行,總共顯示7行。
d、合并格式的diff
如果兩個文件相似度很高,那么上下文格式的diff,將顯示大量重復的內容,很浪費空間。1990年,GNU diff率先推出了"合并格式"的diff,將f1和f2的上下文合并在一起顯示。
它的使用方法是加入u參數(代表unified)。$?diff?-u?f1?f2
顯示結果如下:---?f1?2012-08-29?16:45:41.000000000?+0800
+++?f2?2012-08-29?16:45:51.000000000?+0800
@@?-1,7?+1,7?@@
a
a
a
-a
+b
a
a
a
它的第一部分,也是文件的基本信息。---?f1?2012-08-29?16:45:41.000000000?+0800
+++?f2?2012-08-29?16:45:51.000000000?+0800
"---"表示變動前的文件,"+++"表示變動后的文件。
第二部分,變動的位置用兩個@作為起首和結束。@@?-1,7?+1,7?@@
前面的"-1,7"分成三個部分:減號表示第一個文件(即f1),"1"表示第1行,"7"表示連續7行。合在一起,就表示下面是第一個文件從第1行開始的連續7行。同樣的,"+1,7"表示變動后,成為第二個文件從第1行開始的連續7行。
第三部分是變動的具體內容。a
a
a
-a
+b
a
a
a
除了有變動的那些行以外,也是上下文各顯示3行。它將兩個文件的上下文,合并顯示在一起,所以叫做"合并格式"。每一行最前面的標志位,空表示無變動,減號表示第一個文件刪除的行,加號表示第二個文件新增的行。patch
實例:diff輸出補丁文件,patch給舊文件打補丁[root@bash?~]#?cat?f1
Hi,
Hello,
How?are?you?
I?am?fine,
Thank?you.
[root@bash?~]#?cat?f2
Hello,
Hi,
How?are?you?
I?am?fine.
[root@bash?~]#?diff?-u?f1?f2?>?diff.patch??#輸出不定文件
[root@bash?~]#?patch?-b?f1?diff.patch???#patch給f1打補丁并且備份原來文件
patching?file?f1
[root@bash?~]#?cat?f1
Hello,
Hi,
How?are?you?
I?am?fine.
六、文本字符轉換tr
tr用來從標準輸入中通過替換或刪除操作進行字符轉換。tr主要用于刪除文件中控制字符或進行字符轉換。使用tr時要轉換兩個字符串:字符串1用于查詢,字符串2用于處理各種轉換。tr剛執行時,字符串1中的字符被映射到字符串2中的字符,然后轉換操作開始。
1.命令格式:tr?-c|-d|-s?["string1_to_translate_from"]?["string2_to_translate_to"]?
2.命令選項:-c?用字符串1中字符集的補集替換此字符集,要求字符集為ASCII。
-d?刪除字符串1中所有輸入字符。
-s?刪除所有重復出現字符序列,只保留第一個;即將重復出現字符串壓縮為一個字符串。
-t或--truncate-set1:將第一個字符集對應字符轉化為第二字符集對應的字符
3.命令說明:
指定字符串1或字符串2的內容時,只能使用單字符或字符串范圍或列表。[a-z]?a-z內的字符組成的字符串。
[A-Z]?A-Z內的字符組成的字符串。
[0-9]?數字串。
\octal?一個三位的八進制數,對應有效的ASCII字符。
[O*n]?表示字符O重復出現指定次數n。因此[O*2]匹配OO的字符串。
實例一:將文件host中出現的"abc"替換為"xyz"[root@localhost?~]#?cat?host
:a?b?c?replace?e?f?g?replace?this?is?a?test?page?replace
[root@localhost?~]#?cat?host|tr?'abc'?'xyz'
:x?y?z?replxze?e?f?g?replxze?this?is?x?test?pxge?replxze
【注意】這里,凡是在host中出現的"a"字母,都替換成"x"字母,"b"字母替換為"y"字母,"c"字母替換為"z"字母。而不是將字符串"abc"替換為字符串"xyz"。
實例二:使用tr命令“統一”字母大小寫(小寫?-->?大寫)
[root@localhost?~]#?cat?host?|?tr?[a-z]?[A-Z]
:A?B?C?REPLACE?E?F?G?REPLACE?THIS?IS?A?TEST?PAGE?REPLACE
(大寫?-->?小寫)
[root@localhost?~]#?cat?host?|?tr?[A-Z]?[a-z]
實例二:把f1中0到9轉換為a到j[root@localhost?~]#?cat?f1
A?b?c?D
e?F?G?H?9?0?8?7?63
h?b?mfd?dgg
[root@localhost?~]#?cat?f1|tr?[0-9]?[a-j]
A?b?c?D
e?F?G?H?j?a?i?h?gd
h?b?mfd?dgg
實例三:刪除文件host中出現的"replace"字符[root@localhost?~]#?cat?host
:a?b?c?replace?e?f?g?replace?this?is?a?test?page?replace
[root@localhost?~]#?cat?host|tr?-d?'replace'
:?b????f?g??this?is??tst?g
【注意】這里,凡是在host文件中出現的'r','p','l','a','c','e'字符都會被刪除!而不是緊緊刪除出現的"replace”字符串。
刪除文件file中出現的換行'\n'、制表'\t'字符[root@localhost?~]#?cat?file?|?tr?-d?"\n\t"?>?new_file
不可見字符都得用轉義字符來表示的,這個都是統一的。
實例四:刪除“連續著的”重復字母,只保留第一個[root@localhost?~]#?cat?file?|?tr?-s?[a-zA-Z]?>?new_file
實例五:刪除空行[root@localhost?~]#?cat?file?|?tr?-s?"\n"?>?new_file
實例六:刪除Windows文件“造成”的'^M'字符[root@localhost?~]#?cat?file?|?tr?-d?"\r"?>?new_file
或者[root@localhost?~]#?cat?file?|?tr?-s?"\r"?"\n"?>?new_file
【注意】這里-s后面是兩個參數"\r"和"\n",用后者替換前者
實例七:用空格符\040替換制表符\011[root@localhost?~]#?cat?file?|?tr?-s?"\011"?"\040"?>?new_file
實例八:把路徑變量中的冒號":",替換成換行符"\n"[root@localhost?~]#?echo?$PATH?|?tr?-s?':'?'\n'
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/root/bin
實例九:刪除f1中除了數字換行之外的所有字符
[root@localhost?~]#?cat?f1
一月?????1
二月?????2
三月?????3
四月?????4
五月?????5
六月?????6
七月?????7
八月?????8
九月?????9
十月?????10
十一月???11
十二月???12
十三月???13
[root@localhost?~]#?tr?-cd?'[0-9]\n'?
1
2
3
4
5
6
7
8
9
10
11
12
13
實例十:利用ifconfig去ipv4地址
[root@localhost?~]#?ifconfig|tr?-cs?'[0-9].'?'\n'|sort?-ut?'.'?-k3n
127.0.0.1
192.168.1.255
192.168.1.8
255.255.255.0
實例十一:查出/tmp的權限用數字表示
[root@localhost?~]#?stat?/tmp?|?tail?-4|head?-1|tr?-s?'?'?':'|cut?-d:?-f2|tr?-dc?'[0-9]\n'
1777
實例十二:統計/etc/init.d/functions中每個單詞重復的個數
[root@localhost?~]#?cat?/etc/init.d/functions?|tr?-sc?'[:alpha:]'?'\n'|sort|uniq?-c|sort?-n
總結
以上是生活随笔為你收集整理的linux删除第二列为空_Linux之基本文本处理工具(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麒麟9000见底?骁龙888 4G版华为
- 下一篇: 2021款联想小新Air 14 Plus