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()
:随机数。文章来源:https://www.toymoban.com/news/detail-853073.html
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://www.toymoban.com/news/detail-853073.html
到了这里,关于linux文本三剑客详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!