Linux文本處理工具

知識框架圖

Linux文本處理工具

學習筆記

查看文本

查看文本內容

cat

-A:顯示控制符

-E:顯示行結束符$

-n:打印行號,顯示空行

-b:打印行號,空行不編號

-s:壓縮連續空白行

tac:反向查看文件內容

rev:文本每行倒序顯示

分頁查看

more

less

查看文件頭尾內容

head

-c:前n個字節

-n:前n行

tail

-c

-n

-f:跟蹤顯示文件變化,常用于日志監控

watch -n 1 tail /var/log/massage

抽取文本內容

cut

-d:分隔符

-fN:指定字段

N:單個字段

,:多個離散字段

-:多個連續字段

混合使用

-c:按字符數

–output-delimiter=:指定輸出分隔符

paste:合并兩個文件的相同行的列為一行

-d 分隔符:默認TAB

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

文本統計

wc

-l:行數

-w:單詞數

-c:字節總數

-m:字符總數

-L:最長行的長度

文本排序

sort

-n:按數字大小排序

-r:逆序

-R:隨機排序

u:合并相同行

-f:忽略字符串中字符的大小寫

-t c:字段界定符

-k N:指定列號

使用舉例

echo {1..55} | tr ‘ ‘ ‘\n’ | sort -R | head -n 1

seq 55 | sort -R | head -n 1

echo $[RANDOM%55+1] | sort -R | head -n 1

cut -d’ ‘ -f1 access_log | sort -n | uniq -c | sort -nr | tr -s ‘ ‘ | cut -d’ ‘ -f3

last | sort | cut -d” ” -f1 | uniq -c | sort -nr

uniq

-c:顯示連續重復行出現的次數

-d:僅顯示重復過的行

-u:僅顯示未重復過的行

文本處理三劍客

grep:文本過濾,過濾行

sed:行編輯器

awk:文本報告生成器

grep

根據指定模式搜索并打印匹配到的行

-v:反選

-i:忽略大小寫

-n:顯示匹配到的行號

-c:統計匹配到行的數量

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

-q:靜默模式

-AN:當前行和后N行

-BN:當前行和前N行

-CN:當前行和前后各N行

nmap -v -sP 172.16.101.0/24 | grep -B1 up | grep “Nmap scan report for” | cut -d’ ‘ -f5

-e:多個模式之間實現邏輯or

-w:匹配整個單詞

-E:使用正則表達式

-F:fgrep

df -h |grep “^/dev/sd” |grep -o ‘[[:digit:]]\+%’ |grep -o ‘[[:digit:]]\+’

正則表達式REGEXP

基本正則表達式

字符匹配

.:任意一個字符

[]:指定范圍內的任意單個字符

[^]:指定范圍外的任意單個字符

[:alnum:] 字母和數字

[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z

[:lower:] 小寫字母 [:upper:] 大寫字母

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)

[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)

[:digit:] 十進制數字 [:xdigit:]十六進制數字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 標點符號

匹配次數

*:任意次,工作于貪婪模式

.*:任意長度任意字符

\?:0次或1次

\+:1次或多次

\{m\}:m次

\{m,n\}:m-n次

\{,n\}:最多n次

\{m,\}:最少m次

位置錨定

^:行首錨定

$:行尾錨定

^PATTERN$

^$:空行

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

\<或\b:詞首錨定

\>或\b:詞尾錨定

\<PATTERN\>

分組

\(\)

后向引用:\1\2

或者 \|

ifconfig | grep ‘\(\([0-9]\{1,2\}\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([1-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)’

擴展正則表達式

字符匹配

.:任意單個字符

[]:指定范圍內的單個字符

[^]:指定范圍外的任意單個字符

次數匹配

*:任意次

?:最多1次

+:至少1次

{m}:m次

{m,n}:m-n次

位置錨定

^:行首錨定

$:行尾錨定

^PATTERN$

^$:空白行

\<或\b:詞首錨定

\>或\b:詞尾錨定

\<PATTERN\>

分組

()

后向引用:\1、\2

或者

|

ls *.rpm | grep -Eo “\.\<[[:alnum:]_]+\>\.rpm$” |cut -d. -f2 |sort |uniq -c

ls *.rpm | grep -Eo “\.[^.]+\.rpm$” |cut -d. -f2|sort |uniq -c

ifconfig | grep -E ‘(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])’

ls *.rpm |rev |cut -d. -f2|rev |sort |uniq -c

sed:行編輯器

語法

sed [option]… ‘script’ inputfile…

常用選項

-n:不輸出模式空間內容到屏幕

-e:多點編輯

-f /path/to/script_file:從指定文件中讀取編輯腳本

-r:支持使用擴展正則表達式

-i.bak:備份文件并原處編輯

script

‘地址+命令’

地址定界

不給地址:全文處理

單個地址

#:指定的行

$:最后一行

/PAT/:模式匹配到的每一行

地址范圍

m,n

m,+n

/PAT1/,/PAT2/

m,/PAT/

步進:~

1~2:奇數行

2~2:偶數行

編輯命令

d:刪除模式空間匹配的行,并進入下一輪循環

p:打印模式空間的內容,追加到默認輸出后

a [\]text:在指定行后面追加文本,\n實現多行追加,\t為Tab

i [\]text:在行前面插入文本

c [\]text:替換行為單行或多行

w /path/to/somefile:保存模式匹配的行到指定文件

r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到行后

=:為模式空間中的行打印行號

!:模式空間中匹配行取反處理

查找替換

s///

替換標記

g:全局替換

p:顯示替換成功的行

w /path/to/somefile:將替換成功的行保存在文件中

sed ‘s/quiet/& net.ifnames=0/’ /etc/default/grub

sed ‘/GRUB_CMDLINE_LINUX/s/”$/ net.ifnames=0 &/’ /etc/default/grub

sed -r ‘/GRUB_CMDLINE_LINUX/s/(.*)”/\1 net.ifnames=0″/’ /etc/default/grub

sed調用變量

“$VAR”

”’VAR”’

高級編輯命令

h:把模式空間中的內容覆蓋至保持空間中

H:把模式空間中的內容追加至保持空間中

g:從保持空間中取出數據覆蓋至模式空間

G:從保持空間中取出數據追加至模式空間

x:把模式空間和保持空間中的內容互換

n:讀取匹配到的行的下一行至模式空間

N:追加匹配到的行的下一行至模式空間

d:刪除模式空間中的行

D:刪除多行模式空間的所有行

使用舉例

sed -n ‘n;p’ FILE:顯示偶數行

sed ‘1!G;h;$!d’ FILE:逆序顯示文件內容

sed ‘$!N;$!D’ FILE:取出文件后兩行

sed ‘$!d’ FILE:取出文件最后一行

sed ‘G’ FILE:每行后面追加空白行

sed ‘/^$/d;G’ FILE:將多個空白行合并成一個空白行,在每行后追加空白行

sed ‘n;d’ FILE:顯示奇數行

sed -n ‘1!G;h;$p’ FILE:逆序顯示文件內容

awk,報告生成器

基本用法

awk [options] ‘program’ var=value file…

awk [options] -f programfile var=value file…

awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file …

awk 程序通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、 END語句塊,共3部分組成

program通常是被單引號或雙引號中

基本格式

awk [options] ‘program’ file…

options

-F 指明輸入時用到的字段分隔符

-v var=value:自定義變量

program包括pattern{actions;…}

pattern部分指定語句的觸發條件

BEGIN,END

actions指明對數據進行的處理操作

print,printf

分割符、域、記錄

由分割符分割的字段(域)標記$1、$2…稱為域標識,$0為所有域

文件的每一行稱為記錄

省略action,默認執行print $0操作

工作原理

1、執行BEGIN語句塊中的語句,可選,進行如變量初始化、打印表頭等操作

2、從文件或標準輸入讀取一行然后執行pattern{action;…}語句塊,重復執行該操作直到文件最后一行??蛇x,沒有提供pattern語句則默認執行{print}打印讀取到的每一行

3、文件讀取完畢后,執行END{action;…}語句塊,可選,進行如打印所有行的分析結果的匯總信息等

print

print item1,item2…

,分隔符

輸出的各item可以為字符串、數值、當前記錄的字段、變量、awk表達式

省略item默認打印$0

變量

分為內置和自定義變量

內置變量

FS:輸入字段分隔符,默認為空白字符

OFS:輸出字段分隔符,默認為空白字符

RS:輸入記錄分隔符,指定輸入時的換行符

ORS:輸出記錄分隔符,輸出時用指定符號代替換行符

NF:字段數量

NR:記錄號

FNR:各文件分別計數

FILENAME:當前文件名

ARGC:命令行參數個數,awk命令自己也是參數

ARGV:屬組,保存命令行各參數

自定義變量

-v var=value

在program中直接定義

printf:格式化輸出

printf “FORMAT”,item1,item2…

必須指定FORMAT

不自動換行,需顯式指定\n

FORMAT中的格式符和各item一一對應

格式符

%c: 顯示字符的ASCII碼

%d, %i: 顯示十進制整數

%e, %E:顯示科學計數法數值

%f:顯示為浮點數

%g, %G:以科學計數法或浮點形式顯示數值

%s:顯示字符串

%u:無符號整數

%%: 顯示%自身

修飾符

m[.n]:m指定顯示的寬度,n指定小數點后的精度

-:左對齊

+:顯示數值的正負符號

操作符

算數操作符

x+y, x-y, x*y, x/y, x^y, x%y

-x: 轉換為負數

+x: 轉換為數值

字符串操作符:沒有符號的操作符,字符串連接

賦值操作符

=, +=, -=, *=, /=, %=, ^=

++, —

比較操作符

==, !=, >, >=, <, <=

模式操作符

~:左邊是否和右邊匹配

!~:是否不匹配

邏輯操作符

&&、||、!

函數調用

function_name(argu1, argu2, …)

條件表達式

selector?if-true-expression:if-false-expression

awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd

PATTERN

根據pattern條件過濾匹配的行,再做處理

未指定:空模式,匹配每一行

/正則表達式/

awk ‘/^UUID/{print $1}’ /etc/fstab

關系表達式,結果為真才會處理

真:非0,非空字符串

假:0,空字符串

awk -F: ‘$NF==”/bin/bash”{print $1,$NF}’ /etc/passwd

行范圍

startline,endline:不支持直接給出數字格式

awk -F: ‘/^root\>/,/^nobody\>/{print $1}’ /etc/passwd

BEGIN、END

BEGIN{}:僅在開始處理文件中的文本之前執行一次

END{}:僅在文本處理完之后執行一次

awk -F: ‘BEGIN{print ” USER UID \n————— “}{print $1,$3}’END{print “==============”} /etc/passwd

action

常用分類

Expressions:算術,比較表達式等

Control statements:if, while等

Compound statements:組合語句

input statements

output statements:print等

控制語句

{ statements;… } 組合語句

if(condition) {statements;…}

if(condition) {statements;…} else {statements;…}

對awk取得的整行或某個字段做條件判斷

awk -F: ‘{if($3>=1000) printf “Common user: %s\n”,$1;else printf “root or Sysuser: %s\n”,$1}’ /etc/passwd

while(conditon) {statments;…}

對一行內的多個字段逐一類似處理時使用

對數組中的各元素逐一處理時使用

awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)}; i++}}’ /etc/grub2.cfg

do {statements;…} while(condition)

不論真假,至少執行一次循環體

awk ‘BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}’

for(expr1;expr2;expr3) {statements;…}

awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}’

awk ‘BEGIN{sum=0;i=1;while(i<=100){sum+=i;i++};print “sum=”sum” i=”i}’

for(variable assignment;condition;iteration process)

{for-body}

for(var in array) {for-body}:遍歷屬組元素

awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg

awk ‘{ips[$1]++}END{for(ip in ips){print ip,ips[ip]}}’ /var/log/httpd/access_log

break:結束所有循環

continue:結束本次循環,執行下一次循環

next:提前結束本次處理而直接進入下一次處理

awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd

delete array[index]

delete array

exit

vim

打開文件

+N:打開文件后,光標處于第N行首

+/PATTERN:打開文件后,光標處于模式匹配到的第一行行首

-b:二進制方式打開文件

-d file… :比較多個文件

ex file或vim -e: 直接進入ex模式

vim三種模式

命令模式:默認,光標移動,剪切、粘貼文本

插入模式:編輯文本

末行模式:內置的命令行接口,保存、退出等

ESC退出當前模式

模式轉換

命令模式–>插入模式

i:insert,在光標所在位置插入

I:在光標所在行首插入

a:append,在光標后面插入

A:在光標所在行尾插入

o:在光標所在行的下面新建一行插入

O:在光標所在行的上面新建一行插入

插入模式–>命令模式

ESC

命令模式–>末行模式


末行模式–命令模式

ESC

關閉文件

末行模式

:q

:q!

:wq

:x

命令模式

ZZ:保存退出

ZQ:不保存退出

命令模式

光標跳轉

字符間:h、j、k、l,在命令前加數字可指定跳轉的字符數

單詞間

w:下一單詞詞首

e:當前或下一單詞詞尾

b:當前或下一單詞詞首

在命令前加數字可指定跳轉的單詞數

當前頁

H:頁首

M:中間行

L:頁底

行首尾

^:行首第一個非空白字符

0:行首

$:行尾

行間

nG:第n行

G:最后一行

1G、gg:第一行

句間

(:上一句

):下一句

段落間

{:上一段

}:下一段

編輯操作

字符編輯

x:刪除光標處字符,#x指定從光標處開始的字符數

xp:交換光標處和后一位字符的位置

~:轉換大小寫

J:刪除當前行后的換行符

字符替換

r:替換光標處的字符

R:切換為”替換”模式

刪除

d:結合跳轉字符,實現指定范圍刪除

d$、d^、d0、dw、de、db

#CMD

dd:刪除光標所在行,#dd刪除多行

D:光標處刪除至行尾,留空行

復制

y:結合跳轉字符,實現指定范圍復制

y$、y^、y0、yw、ye、yb

#CMD

yy:光標所在處整行復制,#yy復制多行

Y:整行復制

粘貼

p:若緩存區為整行,則粘貼到下一行;否則粘貼至光標后面

P:若緩存區為整行,則粘貼到上一行;否則粘貼至光標前面

修改

c:結合跳轉字符,實現指定范圍修改

c$、c^、c0、cw、ce、cb

#CMD

cc:刪除當前行并輸入新內容,#cc

C:刪除光標到行尾并插入

撤銷更改

u:最近一次更改,#n最近#次

U:光標落在該行后的所有更改

Ctrl-r:重做最后的撤銷

.:重復前一操作

#.:重復前一操作#次

可視化操作

選擇文本塊

v:字符

V:行

Ctrl-v:塊

結合字符跳轉鍵使用

突出顯示的文字可執行刪除、復制、變更、過濾、搜索、替換等

末行模式

命令提示符為:

可用命令

w

wq

x

q

q!

r filename

w filename

!CMD:執行命令

r!CMD:讀入命令的輸出

地址定界

:start,end

#:第#行

m,n:m-n行

m,+n:m行和其后n行

.:當前行

$:最后一行

%:全文

/PAT1/,/PAT2/:PAT1到PAT2第一次匹配

#,/PAT/

/PAT/,#

使用方式:后跟編輯命令

d

y

w filename:指定范圍另存到指定文件中

r filename:在指定范圍出入指定文件中的內容

查找

/PAT:從光標處向文件尾部查找

?PAT:從光標處向文件首部查找

n:和命令同向

N:和命令反向

查找并替換

s/要查找的內容/替換為的內容/修飾符

要查找的內容:可用模式匹配

替換為的內容:不能使用模式,可使用\1、\2等后向引用,&引用前面查找到的整個內容

修飾符

i:忽略大小寫

g:全局替換,默認只替換每行第一次匹配

gc:全局替換,替換前詢問

分隔符/可使用其他字符

多個窗口

多文件分割

vim -o|O file1 file2

-o:水平分割

-O:垂直分割

窗口間切換:Ctrl-w,方向鍵

單文件分割

Ctrl-w,s:水平

Ctrl-w,v:垂直

Ctrl-w,q:取消相鄰窗口

Ctrl-w,o:取消所有窗口

:wqall:退出

定制工作特性

配置文件

全局:/etc/vimrc

個人:~/.vimrc

末行模式:對當前vim進程有效

常用配置

行號

顯示:set nu

不顯示:set nonu

忽略字符大小寫

忽略:set ic

不忽略:set noic

自動縮進

啟用:set ai

禁用:set noai

智能縮進

啟用:set si

禁用:set nosi

高亮搜索

啟用:set hlsearch

禁用:set nohlsearch

語法高亮

啟用:syntax on

禁用:syntax off

顯示Tab和換行符

啟用:set list

禁用:set nolist

文件格式

啟用windows格式:set ff=dos

啟用unix格式:set ff=unix

設置文本寬度

啟用:set textwidth=65

禁用:set wrapmargin=15

設置光標所在行標識線

啟用:set cul

禁用:set nocul

復制保留格式

啟用:set paste

禁用:set nopaste

設置Tab為4個空格

set?ts=4

set?expandtab

set?autoindent

原創文章,作者:ZBD20,如若轉載,請注明出處:http://www.www58058.com/92545

(0)
ZBD20ZBD20
上一篇 2018-03-17
下一篇 2018-03-17

相關推薦

  • grup修復與安裝操作介紹

    一、bgru Stage1的安裝     1、stage1存儲在MBR的前446字節,首先破壞。使用dd命令     2、使用grub-install命令安裝修復grub stage1     3、使用grub命令修復 二、進入救援模式,修改grub     1、先破壞grub …

    Linux干貨 2016-06-03
  • Linux磁盤管理

    面對一塊硬盤,我們該如何使用它呢?本文從機械硬盤結構,分區,格式化,和掛載四個層次進行介紹。 一、機械硬盤結構 現在服務器使用機械式硬盤是主流,因為其造價低,容量大,和固態硬盤相比讀寫性能要差很多。機械硬盤主要由以下幾個部件構成:轉軸Spindle,盤片Platter,機械臂Boom,磁頭Head。工作機制是馬達帶動盤片高速旋轉,磁頭對盤片進行擦寫數據或讀取…

    Linux干貨 2016-09-01
  • Linux nginx服務之反向代理

                       Linux nginx服務之反向代理 Nginx服務之反向代理: GSLB:Global Service LB 全局服務負載均衡: SLB:Service LB 應用程序發布: 灰度模型:   ngx_http_…

    系統運維 2016-11-18
  • Linux 基礎知識(六.三)

    按找下列要求,寫一個腳本 (1)創建目錄/tmp/testdir-當前日期時間 (2)在此目錄創建100個空文件:file1-file100 (3)顯示/etc/passwd文件中位于偶數行的用戶的用戶名 (4)創建10個用戶:user10-user19,密碼同用戶名 (5)在/tmp創建10個空文件file10-file19 腳本如下: #!/bin/ba…

    Linux干貨 2016-11-14
  • N25-第6周

    vim:    模式化的編輯器        基本模式:            編輯模式,命令模式,            輸入模式       &n…

    Linux干貨 2017-02-13
  • 集中練習4-bash腳本、計劃任務

    集中練習4-bash腳本、計劃任務

    Linux干貨 2017-10-27
欧美性久久久久