天天看點

8-文本處理工具1. 檢視檔案2 檔案整理、排序3 檔案比較

文章目錄

  • 1. 檢視檔案
    • 1.1 cat
    • 1.2 more
    • 1.3 less
    • 1.4 head
    • 1.5 tail
    • 1.6 paste
  • 2 檔案整理、排序
    • 2.1 cut
    • 2.2 wc
    • 2.3 sort
    • 2.4 uniq
  • 3 檔案比較
    • 3.1 diff && patch
      • 3.1.1 diff用法
      • 3.1.2 diff更新檔用法
      • 3.1.3 ed編輯器
    • 3.2 patch

1. 檢視檔案

1.1 cat

cat:連接配接檔案或标準輸入并列印
  • 文法:

    cat [OPTION]... [FILE]...

  • OPTIOSN:
    • -E:顯示行結束符$
    • -n:對顯示出的每一行進行編号
    • -A:顯示所有控制符
    • -b:非空行編号
    • -s:壓縮連續的空行成一行
  • 主要功能:
    1. 一次顯示整個檔案。

      $ cat filename

    2. 從鍵盤建立一個檔案。

      $ cat > filename

      隻能建立新檔案,不能編輯已有檔案.
    3. 将幾個檔案合并為一個檔案:

      $cat file1 file2 > file

tac :逆向顯示cat的輸出,rev 則是直接輸出 列的逆序,tac為行的逆序

1.2 more

more:分頁檢視檔案
  • 文法 :

    more [OPRIONS...] FILE...

  • OPTIONS:
    • +n : 從笫n行開始顯示
    • -n : 定義螢幕大小為n行
    • +/pattern : 在每個檔案中顯示前搜尋該字串(pattern),然後從該字串前兩行之後開始顯示
    • -d : 顯示翻頁即退出提示
    • -c : 從頂部清屏,然後顯示
    • -s : 把連續的多個空行顯示為一行
  • 常用操作
    • Enter : 向下n行,需要定義。預設為1行
    • Ctrl+F : 向下滾動一屏
    • 空格鍵 : 向下滾動一屏
    • Ctrl+B : 傳回上一屏
    • = : 輸出目前行的行号
    • :f 輸出檔案名和目前行的行号
    • V : 調用vi編輯器
    • 按H鍵:顯示幫助屏,該屏上有相關的幫助資訊。
    • !指令 : 調用Shell,并執行指令
    • q : 退出more
[[email protected] ~]# more +/22:06:05 log.ctdb-20180722

...skipping
2017/12/12 22:05:35.447466 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:05:50.672362 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:05.893017 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:21.099632 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:36.304641 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:51.510972 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error

           

1.3 less

less :一頁一頁的檢視檔案或STDIN輸出
  • 文法:less [OPTIONS] filename
  • OPTIONS :
    • -e : 當檔案顯示結束後,自動離開
    • -f : 強迫打開特殊檔案,例如外圍裝置代号、目錄和二進制檔案
    • -i : 忽略搜尋時的大小寫
    • -N : 顯示每行行号
    • -s : 顯示連續空行為一行
  • 基本操作 :
    • : /文本 搜尋文本
    • n/N 跳到下一個 或上一個比對
    • b : 向後翻一頁
    • d : 想後翻半頁
    • h : 顯示幫助界面
    • Q : 退出less指令
    • u : 向前滾動半頁
    • y : 向前滾動一行
    • 空白行 : 滾動一行
    • Enter鍵 : 滾動一頁
    • [pagedown] :向下翻動一頁
    • [pageup] : 向上翻動一頁
    • F : 類似

      tail -f

    • gg : 調到文本的最前面
    • G : 調到文本末尾
    • v : 直接編輯目前檔案
    • :e file2
正在浏覽一個檔案時,使用:e 打開另一個檔案
less file1
: e file2
           
浏覽多個檔案
less log2013.log log2014.log
:n 後,切換到log2014.log
:p 後 ,切換到log2013.log

           
less使用的分頁項指令與man類似

生成指定位數的随機密碼:

  • cat /dev/urandom | tr -dc '[:alnum:]' | head -c20

  • tr -dc '[:alnum:]_' </dev/urandom | head -c20

  • openssl rand -base64 30 |head -c20

1.4 head

檢視檔案中開頭的幾行
  • 文法 :

    head [OPTION]... [FILE]

  • OPTIONS
    • -c# :指定擷取前#位元組
    • -n#: 指定擷取前#行
    • -#:指定行數

1.5 tail

檢視檔案結尾的幾行
  • 文法 :

    tail [OPTION]... [FILE]...

  • OPTIONS
    • -c# 指定擷取後#位元組
    • -n # 指定擷取後#行 //n可以省略
    • +n # : 從倒數第五行開始顯示顯示五行
    • -f : 跟蹤顯示檔案fd新追加的内容,常用日志監控,相當于 --follow=descriptor
  • -F :跟蹤檔案名,相當于–follow=name --retry
tailf 類似tail -f ,當檔案不增長時并不通路檔案,這個對于機器的負載相對于tail -f 要低一點

1.6 paste

paste合并兩個檔案同行号的列到一行
  • 文法:

    paste[OPTION]...[FILE]...

  • OPTIONS
    • -d分隔符:指定分隔符,預設用TAB
    • -s:所有行合成一行顯示
paste f1 f2  //f1與f2同一行号的放在同一行中顯示
paste -s f1 f2  //将檔案f1所有字元合并成第一行顯示, f2合并成第二行顯示
           

2 檔案整理、排序

2.1 cut

用來顯示行中的指定部分,删除檔案中指定字段。顯示檔案或STDIN資料的指定列
  • 文法:

    cut [OPTION]...[FILE]...

  • OPTIONS
    • -d DELIMITER:指定分隔符,預設tab
    • -f FILEDS:
      • #:第#字段
      • #,#[,#]:離散的多個字段,例如1,3,6
      • 混合使用:1-3,7
      • #- :從#開始字段、位元組、位元組之後的所有字段
      • -# :從開始到#字元、字段、位元組
    • -c : 按字元切割
    • -b : 按位元組切割
    • –complement: 選項提取指定字段之外的列;
    • –output-delimiter=STRING 指定輸出分隔符

示例:

cut -d: f1 /etc/passwd
cat /etc/passwd | cut -d: -f7

[[email protected] ~]# cut -c1- 1
abcdefghijklm n
abc defghijklmn
abcdefgh ijklmn
abcd efghijklmn
[[email protected] ~]# cut -c1-5 1
abcde
abc d
abcde
abcd 
[[email protected] ~]# cut -b1-5 1
abcde
abc d
abcde
abcd 
[[email protected] ~]# cut -b1-5 --complement 1
fghijklm n
efghijklmn
fgh ijklmn
efghijklmn

[[email protected] ~]# cut -c1,5 1
ae
ad
ae
a 

           
預設的分隔字元是制表符(\t table鍵)

2.2 wc

wc :收集文本統計資料。

計數單詞總數,行總數,位元組總數和字元總數

wc sotry.txt
39   237   1901 story.txt
行數 字數  位元組數
           

常用選項:

  • -l 隻計數行數
  • -w 隻計數單詞總數
  • -c 隻計數位元組總數
  • -m 隻計數字元總數
  • -L 顯示檔案中最長行的長度

2.3 sort

文本排序sort

把整理過的文本顯示在STDOUT,不改變原始檔案

  • 文法:

    sort [OPTIONS] files

  • OPTIONS:
    • -r : 執行反方向(由上至下)整理
    • -n : 執行按數字大小整理
    • -f : 選項忽略(FOLD)字元串中的字元大小寫
    • -u : 選項(獨特,unique)删除輸出中的重複行
    • -t c : 選項使用c作為字段界定符
    • -k X : 選項按照使用c字元分隔X列來整理能夠使用
    • -c : 檢查檔案是否已經按照順序排序;
[[email protected] ~]# sort -c /etc/passwd
sort: /etc/passwd:2: disorder: bin:x:1:1:bin:/bin:/sbin/nologin

#隻針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

# 從公司英文名稱的第二個字母開始進行排序:
$ sort -t ' ' -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
           
-k:這個選項中1.2表示從第一個字段第二個字母開始排序,1.2,1.2,排序順序是從第一字段的第二個字母開始到,到第一個字段的第二個字母結束。如果-k # : #字段相同時,會繼續在後一個字段中開始比較。

2.4 uniq

uniq指令用于檢查及删除文本檔案中重複出現的行列
  • 文法:

    uniq [OPTION]...[FILE]...

  • OPTIONS
    • -c:顯示每行重複出現的次數
    • -d:僅顯示重複過的行
    • -u:僅顯示不曾重複的行
連續且完全相同方為重複

常和sort 指令一起配合使用:

sort userlist.txt | uniq -c

3 檔案比較

3.1 diff && patch

一行一行比較檔案

3.1.1 diff用法

  • 文法 :

    diff [OPTION]... FILES

  • OPTIONS
    • -b : 忽略空格造成的不同
    • -B : 忽略空行造成的不同
    • -r : 比較子目錄中的檔案
    • -u : 以合并的方式來顯示檔案内容的不同。多用于更新檔
    • -y : 可以将螢幕分成左右兩部分,來比較兩個檔案之間的差異。
    • -a : diff預設隻會逐行比較文本檔案;
    • -c:顯示全部内容,并标出不同之處;
    • -n或–rcs:将比較結果以RCS的格式來顯示
    • -N或–new-file:在比較目錄時,若檔案A僅出現在某個目錄中,預設會顯示:Only in目錄,檔案A 若使用-N參數,則diff會将檔案A 與一個空白的檔案比較;
    • -q或–brief:僅顯示有無差異,不顯示詳細的資訊;
    • -x<檔案名或目錄>或–exclude<檔案名或目錄> : 不比較選項中所指定的檔案或目錄;
    • -X<檔案>或–exclude-from<檔案> : 您可以将檔案或目錄類型存成文本檔案,然後在=<檔案>中指定此文本檔案;
    • -e 将比較的結果儲存成一個ed腳本,之後ed程式可以執行該腳本檔案,進而将file1修改成與file2的内容相同,這一般在patch的時候有用

-e :使用示例

[[email protected] ~]# cat 1
11
888
999
55
55
[[email protected] ~]# cat 1.ls 
11
22
33
55

[[email protected] ~]# diff -e 1 1.ls 
5a

.
2,4c
22
33
.
[[email protected] ~]# diff -e 1 1.ls  > script.txt
[[email protected] ~]# cat script.txt 
5a

.
2,4c
22
33
.
[[email protected] ~]# echo "w"  >> script.txt 
#這樣就是生成了一個ed可以執行的腳本檔案script.txt,生成腳本檔案之後我們還需要做一個操作, 在腳本檔案末尾添加ed的write指令,隻需要執行 echo "w" >>script.txt 将w指令附加到腳本檔案的最後一行即可。
[[email protected] ~]# ed  - 1 < script.txt 
[[email protected] ~]# cat 1
11
22
33
55

注意中間的 – 符号表示從标準輸入中讀取,而 < script.txt 則重定向script.txt的内容到标準輸入。這樣執行之後1的内容将與1.ls完全相同。

           

普通模式

8-文本處理工具1. 檢視檔案2 檔案整理、排序3 檔案比較
[[email protected] ~]# diff 1 2
3c3
< 
---
> aa
7c7
< 
---
> bb
這個指令中顯示,<表示檔案1,>表示檔案2,顯示左右檔案内容之間的差別。
           
8-文本處理工具1. 檢視檔案2 檔案整理、排序3 檔案比較
[[email protected] ~]# diff -c 1 2
*** 1	2018-10-17 12:47:24.971679928 -0400
--- 2	2018-10-17 12:47:45.252865409 -0400
***************
*** 1,4 ****
  apples
! oranges
  kiwis
  carrots
--- 1,5 ----
  apples
! 
  kiwis
  carrots
+ grapefruits
上面為檔案1 ,下面為檔案2.表示差別的地方, + 表示該檔案中多的内容


[[email protected] ~]# diff -u 1 2
--- 1	2018-10-17 12:47:24.971679928 -0400
+++ 2	2018-10-17 12:47:45.252865409 -0400
@@ -1,4 +1,5 @@
 apples
-oranges
+
 kiwis
 carrots
+grapefruits

左邊用-号,右邊為+号。 -oranges,+ 表示左邊與差別的内容,+grapefruits ,表示右邊檔案多出的内容,使用方式與-c方式類似。

[[email protected] ~]# cat test1/
2  3  6  
[[email protected] ~]# cat test2/
2  3  5  

[[email protected] ~]# diff test1 test2
diff test1/2 test2/2
2c2
< oranges
---
> 
4a5
> grapefruits
Only in test2: 5
Only in test1: 6
#第二行改變為oranges就會與右邊相同。
#第四行之後加入grapefruits就會與右邊第五行相同。
[[email protected] ~]# diff -N test1 test2
diff -N test1/2 test2/2
2c2
< oranges
---
> 
4a5
> grapefruits
           

3.1.2 diff更新檔用法

diff 指令的輸出被儲存在一種叫做“更新檔”的檔案中

  • 使用 -u 選項來輸出“統一的(unified)”diff格式檔案,最适用于更新檔檔案
diff -urN old/ new/ > mysoft.patch
參數 -u 表示使用 unified 格式,-r 表示比較目錄,-N表示将不存在的檔案當作空檔案處理,這樣新添加的檔案也會出現在patch檔案中。
           

patch 複制在其他檔案中進行的改變(要謹慎使用)

适用- b選項來自動備份改變了的檔案

$diff -u foo.conf foo2.conf > foo.patch

$patch -b foo.conf foo.patch

在第一個指令中加上-u選項主要是為了形成一個foo.conf與foo2.conf 存在差別的檔案, 将這個内容導入foo.patch,通過第二個指令是直接通過更新檔檔案直接将原來的檔案備份一份之後,生成新内容将原來的内容覆寫掉。生成新的foo.conf 就是第一條指令中的foo2.conf

diff指令參考連結:https://www.cnblogs.com/wangqiguo/p/5793448.html#_label2

3.1.3 ed編輯器

是單行純文字編輯器,它有指令模式(command mode)和輸入模式(input mode)兩種工作模式。ed指令支援多個内置指令。
a:切換到輸入模式,在檔案的最後一行之後輸入新的内容;
c:切換到輸入模式,用輸入的内容替換掉最後一行的内容;
i:切換到輸入模式,在目前行之前加入一個新的空行來輸入内容;
. : 由輸入模式切換至指令模式
d:用于删除最後一行文本内容;
n:用于顯示最後一行的行号和内容;
w:<檔案名>:一給定的檔案名儲存目前正在編輯的檔案;
q:退出ed編輯器。
           

使用說明

[[email protected] ~]# cat 1
11
888
999
55
55
11
wq
[[email protected] ~]# ed 1
23  #輸入ed 1之後會直接顯示檔案中所有的字元數
2  # 輸入行号, 會顯示第二行中的内容
888
     # 輸入回車之後會預設顯示下一行内容
2,3c  # 修改2,3行内容
88
99
5     # 當輸入完2,3行之後,會直接添加在3行之後
.   # 退回到指令行模式
wq
23   # 退出時,會自動顯示檔案中所有的字元數
[[email protected] ~]# cat 1
11
88
99
5
55
55
11
wq
[[email protected] ~]# ed 1
23
2i   #在檔案中第二行添加内容,原來的第二行變成第三行
2
.
wq
25
[[email protected] ~]# cat 1
11
2
88
99
5
55
55
11
wq
[[email protected] ~]# ed 1
25
d   # 在指令行模式中删除最後一行

w
22
q
[[email protected] ~]# cat 1
11
2
88
99
5
55
55
11


           

3.2 patch

patch指令讓使用者利用設定修補檔案的方式,修改,更新原始檔案。倘若一次僅修改一個檔案,可直接在指令列中下達指令依序執行。如果配合修補檔案的方式則能一次修補大批檔案,這也是Linux系統核心的更新方法之一。1
  • 文法:
    • patch [options] [originalfile [patchfile]]

    • patch -pnum <patchfile

  • OPTIONS
    • -R : 假設修補資料是由新舊檔案交換位置而産生。
    • -E : 若修補過後輸出的檔案其内容是一片空白,則移除該檔案。
    • -b : 在打更新檔過程中,生成一個.orig的備份檔案
    • -pnum : num表示忽略目錄的層級數目,
/1/2/3/4:假設在/下生成的更新檔檔案,打更新檔時,使用者如果在/下,則為-p0 ,如果在/1目錄下則忽略一級目錄,此時運作指令時為-p1

使用示例:

[[email protected] ~]# diff -aurN test1 test2
[[email protected] ~]# patch -p0 < fix.patch   #運作這個指令會直接将目錄test1中的檔案設定成與test2中檔案一樣,如果再次運作,目錄test1則會恢複成原樣。
[[email protected] ~]# patch -RE -p0  < fix.patch # 或者直接運作這個指令可以将已經打更新檔的目錄或檔案恢複成原樣。
$patch -b foo.conf foo.patch  #如果是檔案可以直接運作這個指令保證更新檔打成功,而且會自動生成備份檔案。



           
  1. Linux patch指令 ↩︎

繼續閱讀