awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。
特点:
grep——单纯的查找或匹配文本。
sed——编辑匹配到的文本。
awk——格式化文本,对文本进行较复杂格式处理。
首先了解一下正则表达式:
匹配字符
. 任意单个字符 [] 指定范围的字符 [^] 不在指定范围的字符 次数匹配: * :匹配前面字符任意次 ? : 0 或1次 + :1 次或多次 {m} :匹配m次 次 {m,n} :至少m ,至多n次
讯享网
配置次数
讯享网* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 .* 任意前面长度的任意字符,不包括0次 \? 匹配其前面的字符0 或 1次 + 匹配其前面的字符至少1次 {n} 匹配前面的字符n次 {m,n} 匹配前面的字符至少m 次,至多n次 {,n} 匹配前面的字符至多n次 {n,} 匹配前面的字符至少n次
位置锚定:定位出现的位置
^ : 行首 $ : 行尾 <, \b : 语首 >, \b : 语尾 分组:() 后向引用:\1, \2, ...
实例介绍:
grep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 。grep也可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。
语法:
讯享网grep [options] [pattern] file 命令 参数 匹配模式 文件数据 -i : Linux大小写敏感,忽略字符大小写 -o : 仅显示匹配的字符串本身 -v : 显示没有被匹配的行 -E :支持使用扩展的正则表达式元字符 -q : 静默模式,不输出任何信息 -n : 显示行号 -F : 相当于fgrep,匹配固定字符串的内容。
fgrep : 为固定字符串全局正则表达式打印fgrep(与grep -F相同)是固定的或快速的grep,其行为与grep相同,但不会将任何正则表达式元字符识别为特殊的。搜索将更快完成,因为它只处理简单的字符串而不是复杂的模式。
实例:
1. grep '^a' test.txt -i -n #查找以a开头的行,显示行号并且忽略大小写。 'a$' #查找以a结尾的行 'a*' #查找a出现一次或者多次行号 2. grep -v '^$' test.txt #反向输出所有非空格内容(过滤空行) 3. grep "\.$" test.txt -n #输出以.为结束的行,\为转义字符,.为特殊字符。 '^.*c' #以任意内容开头, 直到c结束 4. grep "[abc]" test.txt -n -o #匹配abc字符中的任意一个,得到它的行数和行号,只显示被匹配的关键字。 "[^a]" -c #匹配除a以外的字符,显示被匹配了多少行。 "[a+]" -n #+号表示匹配前一个字符1一次或多次. "[go?d]" -n #匹配god或者good 5. grep -E "(ab)+c" test.txt -n #匹配ab出现一次或者多次以c结尾的行,并显示行号。 "go(|o|od)d" #|或的意思,()将一个或多个字符捆绑一起, 当作一个整体进行处理。 "(ab){1,3}" #匹配ab字符一到三次。
sed
sed 是一种流编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),
接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
然后读入下行,执行下一个循环。
如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。
这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出或-i。
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
语法: sed` `[options] ``'[地址定界] command'` `file``(s)
常用的option:
-n :不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行 -e :多点编辑,对每行处理时,可以有多个Script -f :把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写 -r :支持扩展的正则表达式 -i :直接将处理的结果写入文件 -i.bak :在将处理的结果写入文件之前备份一份
地址定界:
不给地址:对全文进行处理 单地址: \#: 指定的行 /pattern/:被此处模式所能够匹配到的每一行 地址范围: \#,# \#,+# /pat1/,/pat2/ \#,/pat1/ ~:步进 sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行) sed -n '2~2p' 只打印偶数行
command:
d:删除模式空间匹配的行,并立即启用下一轮循环 p:打印当前模式空间内容,追加到默认输出之后 a:在指定行后面追加文本,支持使用\n实现多行追加 i:在行前面插入文本,支持使用\n实现多行追加 c:替换行为单行或多行文本,支持使用\n实现多行追加 w:保存模式匹配的行至指定文件 r:读取指定文件的文本至模式空间中匹配到的行后 =:为模式空间中的行打印行号 !:模式空间中匹配行取反处理 加g表示行内全局替换; 在替换时,可以加一下命令,实现大小写转换 \l:把下个字符转换成小写。 \L:把replacement字母转换成小写,直到\U或\E出现。 \u:把下个字符转换成大写。 \U:把replacement字母转换成大写,直到\L或\E出现。 \E:停止以\L或\U开始的大小写转换
实例:
1. sed -n '5,19 p' demo #查看文件demo中5-19行中的内容。 2. sed -n '/^a/ p' demo #查看以a开头的demo文件的行。 3. sed '2,3 d' demo | head #将2-5行内容打印出来。 4. sed -e '4 a\abc' demo | head #在文件passwd上的第四行后面添加abc. 5. sed '2 i\abc' demo | head #在第二行前插入abc. 6. sed '3 c\abc' demo |head #将第三行替换为abc. 7. sed -n '5,10 s/bin/aaaa/ p' demo |head #将passwd的5到10的bin字符串查找出来替换为aaaa。 8. sed -i '1 d' demo #删除原文件的第一行。 9. sed -i.bak '1 d' demo #备份
awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。
数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。

它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。
awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
语法:
awk ‘BEGIN {commands} pattern {commands}END{commands}' file1
BEGIN:处理数据前执行的命令
END:处理数据后执行的命令
pattern:模式,每一行都执行的命令
BEGIN和END里的命令只是执行一次
pattern里的命令会匹配每一行去处理
awk -F: 'BEGIN{print "第一列"}{print $1} END{print "结束"}' awkdemo 第一列 a b c 结束
示例:
1. awk -F ":" '{print $1,$2,$5}' /etc/passwd | head -F ":" : awk选项,指定输入分割符为: '{print}' : 固定语法 $1,$2,$5 :输出第一个,第二个,第五个字段 : 是输出分隔符,如果不加默认是没有分隔符的。 2. echo 'this is a test' | awk '{print $0}' this is a test 3. echo 'this is a test' | awk '{print $NF}' test #$NF表示最后一个字段,$(NF-1)表示倒数第二个字段。 4. cat awkdemo a:b c:d awk -v FS=':' '{print $1,$2}' demo #FS指定输入分隔符 a b c d 5. awk -v FS=':' -v OFS='---' '{print $1,$2}' demo #OFS指定输出分隔符 a---b c---d 6. awk -v RS=':' '{print $1,$2}' demo a b c d 7. awk -v FS=':' -v ORS='---' '{print $1,$2}' demo a b---c d 8. awk '{print FILENAME}' demo1 demo1 9. awk 'BEGIN {print ARGC}' demo 2 10. awk 'BEGIN {print ARGV[0]}' demo1 awk awk 'BEGIN {print ARGV[1]}' demo1 demo1
内置变量
- FS :输入字段分隔符,默认为空白字符
- OFS :输出字段分隔符,默认为空白字符
- RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
- ORS :输出记录分隔符,输出时用指定符号代替换行符
- NF :字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列
- NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
- FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
- FILENAME :当前文件名
- ARGC :命令行参数的个数
- ARGV :数组,保存的是命令行所给定的各参数,查看参数
自定义变量:-v var=value
awk -v name="mmm" -F: '{print name":"$0}' demo mmm:a:b mmm:c:d
内置函数,方便对原始数据的处理。
$ awk -F ':' '{ print toupper($1) }' demo.txt
tolower():字符转为小写。length():返回字符串长度。substr():返回子字符串。sin():正弦。cos():余弦。sqrt():平方根。rand():随机数。
awk -F ':' '/usr/ {print $1}' demo.txt #print命令前面是一个正则表达式,只输出包含usr的行。
awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt #输出奇数行
awk -F ':' 'NR >3 {print $1}' demo.txt #输出第三行后的行
awk -F ':' '$1 == "root" {print $1}' demo.txt awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt #输出第一个字段等于指定值的行。
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt #使用if语句
操作符:
1. df -h |awk -F: '$0 ~ /^\/dev/' /dev/mapper/cl-root #查询以/dev开头的磁盘信息 模式匹配符:~ :左边是否和右边匹配包含 !~ :是否不匹配 2. awk -F: '$3>=0 && $3<=10 {print $1,$3}' /aaa 3. awk -F: '$3==0 || $3>=10 {print $1}' /aaa 其他操作符 1.算术操作符: x+y, x-y, x*y, x/y, x^y, x%y -x: 转换为负数 +x: 转换为数值 2.赋值操作符: =, +=, -=, *=, /=, %=, ^=, ++, -- 3.比较操作符: ==, !=, >, >=, <, <=

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/14109.html