首頁  >  文章  >  web前端  >  正規與Linux三大文字處理工具的使用詳解

正規與Linux三大文字處理工具的使用詳解

php中世界最好的语言
php中世界最好的语言原創
2018-03-29 13:58:191402瀏覽

這次帶給大家正規與Linux三大文字處理工具的使用詳解,使用正規與Linux三大文字處理工具的注意事項有哪些,以下就是實戰案例,一起來看一下。

grep、sed和awk都是文字處理工具,雖然都是文字處理工具但卻都有各自的優缺點,一種文字處理指令是不能被另一個完全取代的,否則也不會出現三個文字處理指令了。

一、正規表示式

#1、符合字元的型別

[a-z]:小寫字母

[A-Z]:大寫字母

[a-Z]:小或大寫字母

[0-9]:數字

[a-zA-Z0-9]:表示符合一個為字母或數字的字元

. :符合1個任意字符,空格除外

[0-f] :16進位數

abc | def:abc或def
a (bc | de) f:abcf 或adef

\<:單字頭單字一般以空格或特殊字元做分隔,連續的字串被當做單字

\>:單字尾

[^表達式]:除小寫字母以外的所有字符,如此類推。

2、後面跟著以下符號控制符合的數量

此類符號的左邊要有上面第一點的表達式

表達式*:0或n個字元

表達式+:1或n個字元

表達式?:0或1個字元

表達式{n}:n字元

表達式{n:m}:n到m個字元

表達式{n,}:至少n個字元

【範例】[a-z] *表示符合0個或多個小寫字母

3、將符合的字元控制在頭尾
^表達式:頭部符合

表達式$:尾部符合

二、Linux三大文字處理工具

#1、egrep 篩選工具

grep的擴展版,可以使用正規表示式

語法:

egrep -選項  '正規表示式'  檔名

選項:

-n :顯示行號
-o :只顯示匹配的內容
-q :靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容
-l :如果匹配成功,則只將文件名打印出來,失敗則不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,則將匹配行及其後n行一起列印出來
-B :如果匹配成功,則將匹配行及其前n行一起打印出來
-C :如果匹配成功,則將匹配行及其前後n行一起打印出來
--color
-c :如果匹配成功,則將匹配到的行數打印出來
-i :忽略大小寫
-v :取反,不匹配
-w:匹配單字

2、sed 串流編輯器

#語法:

語法1:sed  -選項  '數字定位+指令'檔案名稱

選項:

-n:靜默模式,不輸出
-e:多項編輯,這不是很清楚
-i:直接修改檔案內容,而不是輸出
-r:擴充模式,可使用正規表示式
-f:指定檔名,將動作寫在新的檔案內

指令:

a ∶追加append,
c ∶ 改變change,
d ∶ 刪除delete,
i ∶ 插入insert, i 的後面可以接字符串,而這些字符串會在新的一行出現(目前的上一行)
p∶ 印print
s∶ 取代substitute,可以直接進行替換的工作。通常這個 s 的動作可以搭配正規表示式。例如 1,20s/old/new/g

*s指令特別說明:

使用{指令1:指令2:指令3}可增加使用多個指令

语法2:sed  -r  '替换命令s/正则表达式/替换内容/贪婪选项g'  文件名

定位的两种方法:

①数字定位(输入行序号定位)

十进制数
1:单行
1,3:范围 从第一行到第三行
2,+4:匹配行后若干行
4,~3:从第四行到下一个3的倍数行
2~3:第二行起每间隔三行的行
$:尾行
1!:除了第一行以外的行

【例】sed -n '1p' /etc/passwd

②正则表达式定位

正则必须用//包裹起来

扩展正则需要用 -r 参数或转义

替换可使用正则表达式的子模式,即小括号(),可以\1、\2代表子模式

【例】sed -r 's/(.)(.)/\2\1/ file1 表示将匹配到的第一部分和第二部分替换

*贪婪选项:填上g,代表把一行中所有匹配项替换

3、awk 文本分析工具

由命令、正则(需要用//包围起来)、比较和关系运算组合而成

使用option中的-F参数定义间隔符号

用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域,NF变量表示当前记录的字段数

语法

awk -选项 参数  '逻辑判断{命令 变量1,变量2,变量3}' 文件名

选项

-F 定义字段分隔符,默认的分隔符是连续的空格或制表符
-v 定义变量并赋值 也可以借用次方式从shell变量中引入

AWK变量

NR 当前记录的个数(全部文件连接后的统计)
FNR 当前记录的个数(仅为当前文件的统计,非全部)
FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
OFS 输出字符的分隔符 默认是空格
# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
root=====x
NF 当前读入行的字段个数
ORS 输出记录分隔符 默认是换行
# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
root x=====bin x=====
FILENAME 当前文件名

【例1】使用AWK变量

# awk '{print NR,FNR,$1}' file1 file2 
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
#

【例2】引用shell变量的方法

# a=root
# awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
或者 把整个命令拆开传递,让shell变量外露,
# awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
# a=NF
# awk -F: '{print $'$a'}' /etc/passwd

逻辑运算(可直接引用域进行运算)

= += -= /= *= 赋值

&& || ! 逻辑与 逻辑或 逻辑非

~ !~  匹配正则或不匹配,正则需要用 /正则/ 包围住
< <= > >= != ==  关系 比较字符串时要把字符串用双引号引起来

$ 字段引用:字段引用需要加$,而变量引用直接用变量名

+ - * / % ++ --  运算符

转义序列

\\ \自身
\$ 转义$
\t 制表符
\b 退格符
\r 回车符
\n 换行符
\c 取消换行

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Linux grep与正则表达式的使用

怎么用正则把字符串分组

以上是正規與Linux三大文字處理工具的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn