linux 中的 文本處理工具

文本處理工具 

在linux系統中 文本工具有很多 現在具體介紹幾款 如 抽取文本的工具 和文件三劍客 



文件內容:less和 cat  

文件截取:head和tail  

按列抽取:cut  

按關鍵字抽取:grep egrep



首先 有 查看文件的cat tac 



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

  -E: 顯示行結束符$ 

  -n: 對顯示出的每一行進行編號 

  -A:顯示所有控制符 

  -b:非空行編號 

  -s:壓縮連續的空行成一行


tac 與cat 命令 一樣 不過是取反


more: 分頁查看文件 

more [OPTIONS...] FILE... 

  -d: 顯示翻頁及退出提示


less:一頁一頁地查看文件或STDIN輸出 查看時有用的命令包括: /文本 搜索 文本 n/N 跳到下一個 or 上一個匹配 less 命令是man命令使用的分頁器


顯示文本前或後行內容


head head [OPTION]... [FILE]... 

  -c #: 指定獲取前#字節 

  -n #: 指定獲取前#行 

  -#: 指定行數 


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

  -c #: 指定獲取後#字節 

  -n #: 指定獲取後#行 -#: 

  -f: 跟蹤顯示文件新追加的內容,常用日誌監控


按列抽取文本cut和合並文件paste


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

  -d DELIMITER: 指明分隔符,默認tab 

  -f FILEDS: #: 第#個字段 #,#[,#]:離散的多個字段,例如1,3,6 #-#:連續的多個字段, 例如1-6 混合使用:1-3,7 -c 按字符切割 --output-delimiter=STRING指定輸出分隔符



顯示文件或STDIN數據的指定列 

  cut -d: -f1 /etc/passwd 

  cat /etc/passwd |cut -d: -f7 cut -c2-5 /usr/share/dict/words

  

paste 合併兩個文件同行號的列到一行 

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

  -d 分隔符:指定分隔符,默認用TAB 

  -s : 所有行合成一行顯示 

  paste f1 f2 paste  -s f1 f2


還有一些分析文本工具例如 文本數據統計:wc 整理文本:sort 比較文件:diff和patch


可收集文本統計數據wc


計數單詞總數、行總數、字節總數和字符總數 可以對文件或STDIN中的數據運行 $ wc story.txt 39 237 1901 story.txt 行數 字數 字符數

   -l 來只計數行數

   -w 來只計數單詞總數

   -c 來只計數字節總數

   -m 來只計數字符總數


文本排序用到的sort


把整理過的文本顯示在STDOUT,不改變原始文件 $ sort [options] file(s)

常用選項  

  -r 執行反方向(由上至下)整理  

  -n 執行按數字大小整理  

  -f 選項忽略(fold)字符串中的字符大小寫  

  -u 選項(獨特,unique)刪除輸出中的重複行

  -t  c 選項使用c做爲字段界定符  

  -k  X 選項按照使用c字符分隔的X列來整理能夠使用多次



uniq的多次性


uniq命令:從輸入中刪除重複的前後相接的行

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

  -c: 顯示每行重複出現的次數; 

  -d: 僅顯示重複過的行; 

  -u: 僅顯示不曾重複的行; 連續且完全相同方爲重複 常和sort 命令一起配合使用:sort  userlist.txt  |  uniq -c


比較文件時用到的diff


比較兩個文件之間的區別 $ diff foo.conf-broken foo.conf-works 5c5 < use_widgets = no --> use_widgets = yes 註明第5行有區別(改變)


打補丁的patch


 diff 命令的輸出被保存在一種叫做“補丁”的文件中  

    使用 -u 選項來輸出“統一的(unified)”diff格式文 件,最適用於補丁文件。

    patch 命令複製在其它文件中進行的改變(要謹慎使用 !)  

    適用 -b 選項來自動備份改變了的文件 $ diff -u foo.conf-broken foo.conf-works > foo.patch $ patch -b foo.conf-broken foo.patch 



最後壓軸的 文本處理工具三劍客的 grep 以及它的擴展正則表達式 egrep 其他兩劍客分別爲 sed 和awk


grep:文本過濾(模式:pattern)工具; grep, egrep, fgrep(不支持正則表達式搜索)

sed:stream editor,文本編輯工具;

awk:Linux上的實現gawk,文本報告生成器


grep: Global search REgular expression and Print out the line. 


作用:文本搜索工具,根據用戶指定的“模式”對目標文 本逐行進行匹配檢查;打印匹配到的行; 模式:由正則表達式字符及文本字符所編寫的過濾條件

  grep [OPTIONS] PATTERN [FILE...] 

  grep root /etc/passwd grep "$USER"  /etc/passwd 

  grep '$USER'  /etc/passwd grep `whoami`  /etc/passwd


grep 的命令行有 


  --color=auto: 對匹配到的文本着色顯示;  

  -v: 顯示不能夠被pattern匹配到的行;  

  -i: 忽略字符大小寫  

  -n:顯示匹配的行號  

  -c: 統計匹配的行數  

  -o: 僅顯示匹配到的字符串;  

  -q: 靜默模式,不輸出任何信息  

  -A #:after, 後#行  

  -B #: before, 前#行  

  -C #:context, 前後各#行  

  -e:實現多個選項間的邏輯or關係 grep –e ‘cat ’  -e ‘dog’  file  

  -w:整行匹配整個單詞  

  -E:使用ERE



正則表達式詳解


REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有 些字符(元字符)不表示字符字面意義,而表示控制或通配 的功能 程序支持:grep, vim, less,nginx等 分兩類: 基本正則表達式:BRE 擴展正則表達式:ERE grep -E, egrep 正則表達式引擎: 採用不同算法,檢查處理正則表達式的軟件模塊 PCRE(Perl Compatible Regular Expressions) 元字符分類:字符匹配、匹配次數、位置錨定、分組 


基本正則表達式元字符 字符匹配 匹配次數 和位置錨定以及分組


字符匹配

  .   : 匹配任意單個字符; 

  []  : 匹配指定範圍內的任意單個字符 

  [^] :匹配指定範圍外的任意單個字符 

  [:digit:] 所有數字

  [:lower:] 所有小寫字母

  [:upper:] 所有大寫字母

  [:alpha:] 所有字母

  [:alnum:] 所有的字母和數字

  [:punct:] 所有的標點符號

  [:space:] 空格和tab



匹配次數:用在要指定次數的字符後面,用於指定前面的字 符要出現的次數 

  *:匹配前面的字符任意次,包括0次 貪婪模式:儘可能長的匹配 

  .*:任意長度的任意字符 

  \?:匹配其前面的字符0或1次 

  \+:匹配其前面的字符至少1次 

  \{m\}:匹配前面的字符m次 

  \{m,n\}:匹配前面的字符至少m次,至多n次 

  \{,n\}:匹配前面的字符至多n次 

  \{m,\}:匹配前面的字符至少m次



位置錨定:定位出現的位置 

  ^:行首錨定,用於模式的最左側 

  $:行尾錨定,用於模式的最右側 

  ^PATTERN$: 用於模式匹配整行 

  ^$: 空行 ^[[:space:]]*$ :空白行 

  \< 或 \b:詞首錨定,用於單詞模式的左側 

  \> 或 \b:詞尾錨定;用於單詞模式的右側 

  \<PATTERN\>:匹配整個單詞



分組:\(\):將一個或多個字符捆綁在一起,當作一個整體進 行處理,


  如:\(root\)\+ 分組括號中的模式匹配到的內容會被正則表達式引擎記錄 於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ... \1: 從左側起,第一個左括號以及與之匹配右括號之間 的模式所匹配到的字符; 


實例: \(string1\+\(string2\)*\) \1: string1\+\(string2\)* \2: string2 後向引用:引用前面的分組括號中的模式所匹配字符(而 非模式本身)


egrep及擴展的正則表達式 與基本正則表達式 差不多 只有少數元字符 變得更加簡潔 


egrep = grep -E egrep [OPTIONS] PATTERN [FILE...]  

  擴展正則表達式的元字符:  

  字符匹配: 

  . 任意單個字符 

  [] 指定範圍的字符 

  [^] 不在指定範圍的字符



次數匹配: 

  *:匹配前面字符任意次 

  ?: 0或1次 +:1次或多次 

  {m}:匹配m次 

  {m,n}:至少m,至多n次


位置錨定: 

  ^  :行首 

  \<, \b :語首 

  \>, \b :語尾  

  分組: () 後向引用:\1, \2, ...  

  或者: a|b C|cat: C或cat (C|c)at:Cat或cat



正則表達式 爲本章重點 個人理解 正則表達式不難 難在 正則表達式的靈活 性 需要利用正則表達式 寫出按不同要求的搜索 相對應的 表達式 導致 每個人的方法可能不盡 相同 但結果卻一樣 這正是 正則表達式的精髓所在 可以自由組合 沒有規律可尋 因題而定 還有最最重要的 理解能力 



作業


找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行,至少三種方式:

  grep -i "^s" /proc/meminfo

  grep "^[sS]" /proc/meminfo

  grep -E "^(s|S)" /proc/meminfo


電腦演示


[root@localhost Desktop]# echo "/etc/sysconfig/" |grep -oE "[^/]+/?$"

sysconfig/

[root@localhost Desktop]# echo "/etc/sysconfig/" |grep -oE "[^/]+/?$"|cut -d/ -f1

sysconfig

[root@localhost Desktop]# grep -i '^s' /proc/meminfo 

SwapCached:            0 kB

SwapTotal:       2047996 kB

SwapFree:        2047996 kB

Shmem:              2512 kB

Slab:              87860 kB

SReclaimable:      21188 kB

SUnreclaim:        66672 kB

[root@localhost Desktop]# grep -E '^(S|s)' /proc/meminfo 

SwapCached:            0 kB

SwapTotal:       2047996 kB

SwapFree:        2047996 kB

Shmem:              2512 kB

Slab:              87876 kB

SReclaimable:      21196 kB

SUnreclaim:        66680 kB

[root@localhost Desktop]# grep '^]Ss]' /proc/meminfo 

[root@localhost Desktop]# grep '^[Ss]' /proc/meminfo 

SwapCached:            0 kB

SwapTotal:       2047996 kB

SwapFree:        2047996 kB

Shmem:              2512 kB

Slab:              87860 kB

SReclaimable:      21188 kB

SUnreclaim:        66672 kB

[root@localhost Desktop]# 





顯示當前系統上tian1 tian2或者tian3用戶的相關信息

  grep -E "^(tian1|tian2|tian3)\>" /etc/passwd 


電腦演示


[root@localhost ~]# cat  /etc/passwd |grep -E "^(tian1|tian2|tian3)\>"

tian1:x:505:505::/home/tian1:/bin/bash

tian2:x:506:506::/home/tian2:/bin/bash

tian3:x:507:507::/home/tian3:/bin/bash





找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行

  grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions


電腦演示


[root@localhost ~]# grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

fstab_decode_str()

checkpid()

__readlink()

__fgrep()

__kill_pids_term_kill_checkpids()

__kill_pids_term_kill()

__umount_loop()

__umount_loop_2()

__source_netdevs_fstab()

__source_netdevs_mtab()

__umount_loopback_loop()

__find_mounts()

__pids_var_run()

__pids_pidof()

daemon()

killproc()

pidfileofproc()

pidofproc()

status()

echo_success()

echo_failure()

echo_passed()

echo_warning()

update_boot_stage()

success()

failure()

passed()

warning()

action()

action_silent()

strstr()

confirm()

get_numeric_dev()

is_ignored_file()

is_true()

is_false()

apply_sysctl()

key_is_random()

find_crypto_mount_point()

init_crypto()

[root@localhost ~]# 




使用echo命令輸出一絕對路徑,使用egrep取出基名

  echo /etc/sysconfig/ | grep -E -o "[^/]+/?$" | cut -d/ -f1


電腦演示


root@localhost Desktop]# echo "/etc/sysconfig/" |grep -oE "[^/]+/?$"

sysconfig/

[root@localhost Desktop]# echo "/etc/sysconfig/" |grep -oE "[^/]+/?$"|cut -d/ -f1

sysconfig

[root@localhost Desktop]# 







找出ifconfig命令結果中1-255之間的數值

  ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"


電腦演示


[root@localhost ~]# ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

29

67

46

172

18

16

92

172

18

16

255

255

255

255

64

1

62

120

8

5

1

127

1

255

1

128

1

12

12

[root@localhost ~]# 



找出ifconfig命令結果中所有IPv4地址

  ifconfig | grep -E -o "(\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.)(\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"


電腦演示


[root@localhost ~]# ifconfig | grep -E -o "(\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.)(\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

172.18.16.92

172.18.16.255

255.255.255.0

127.0.0.1

255.0.0.0



找出/etc/passwd文件中用戶名同shell名的行

  grep -E "^([^:]+\>).*\1$" /etc/passwd


電腦演示



[root@localhost ~]# grep -E "^([^:]+\>).*\1$" /etc/passwd

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

[root@localhost ~]# 

















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