详解正则表达式及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 &;:单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词 &;:单词尾 [^表达式]:除小写字母以外的所有字符,如此类推。 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 :显示行号 2、sed 流编辑器 语法: 语法1:sed -选项 '数字定位+命令' 文件名 选项: -n:静默模式,不输出 命令: a ∶ 追加append, *s命令特别说明: 使用{命令1:命令2:命令3}可增加使用多个命令 语法2:sed -r '替换命令s/正则表达式/替换内容/贪婪选项g' 文件名 定位的两种方法: ①数字定位(输入行序号定位) 十进制数 【例】sed -n '1p' /etc/passwd ②正则表达式定位 正则必须用//包裹起来 扩展正则需要用 -r 参数或转义 替换可使用正则表达式的子模式,即小括号(),可以1、2代表子模式 【例】sed -r 's/(.)(.)/21/ file1 表示将匹配到的第一部分和第二部分替换 *贪婪选项:填上g,代表把一行中所有匹配项替换 3、awk 文本分析工具 由命令、正则(需要用//包围起来)、比较和关系运算组合而成 使用option中的-F参数定义间隔符号 用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域,NF变量表示当前记录的字段数 语法 awk -选项 参数 '逻辑判断{命令 变量1,变量2,变量3}' 文件名 选项 -F 定义字段分隔符,默认的分隔符是连续的空格或制表符 AWK变量 NR 当前记录的个数(全部文件连接后的统计) 【例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 逻辑运算(可直接引用域进行运算) = += -= /= *= 赋值 && || ! 逻辑与 逻辑或 逻辑非 ~ !~ 匹配正则或不匹配,正则需要用 /正则/ 包围住 $ 字段引用:字段引用需要加$,而变量引用直接用变量名取 + - * / % ++ -- 运算符 转义序列 自身 以上所述是小编给大家介绍的正则表达式及Linux三大文本处理工具,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |