這次帶給大家正規與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三大文字處理工具的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!