写在前面
Linux三剑客是文本处理工具,它们可以帮助我们快速、高效地对文本进行处理。其中包括了grep、awk、以及sed这三个强大的命令行工具。
Linux 三剑客主要作用:
- grep,它可以根据正则表达式查找相关内容并打印对应的数据。
- awk,它可以根据定位到的数据行处理其中的分段。
- sed,它可以定位到数据行并对数据进行增删改查操作。
这些工具在Linux系统中得到了广泛的应用,因此成为了Linux系统管理员和开发者必须要掌握的技能之一。
grep命令
grep命令是一种在文本中查找匹配字符串的工具。它允许用户根据正则表达式查找相关内容并打印对应的数据。以下是grep命令的格式:
grep [选项] “模式” [文件]
下面是grep命令的一些常用选项参数:
- -c :计算找到 ‘搜寻字符串’ 的次数
- -i :忽略大小写
- -n :输出行号
- -v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行。
- –color=auto :可以将找到的关键词部分加上颜色显示。
- -A n:显示匹配到的字符串所在的行及其后n行,after
- -B n:显示匹配到的字符串所在的行及其前n行,before
- -C n:显示匹配到的字符串所在的行及其前后各n行,context
以下为两个具体实例
# 查找文件中包含“hello”的所有行并显示行号
$ grep -n "hello" test.txt
1:hello world
3:hello linux
# 查找文件中不包含“hello”的所有行
$ grep -v "hello" test.txt
welcome to linux
grep匹配模式常常为正则表达式,以下为常用正则:
AWK命令
AWK命令是一种强大的文本处理工具,通过它可以根据定位到的数据行处理其中的分段。AWK程序逐行扫描文件,并按照指定的规则处理每个输入行,输出格式也可以自由控制。以下是AWK命令的常用语法:
awk [-F field-separator] 'commands' input-file(s)
下面是一些AWK常用内置变量和实例:
- $0: 表示整个文本行
- $1: 表示第一个域(字段)
- NF: 表示域的数量
- NR: 表示行号
# 显示文件中的所有行号和行内容
$ awk '{print NR, $0}' test.txt
# 显示按照分隔符分割的第二个域
$ awk -F "," '{print $2}' test.csv
AWK还有很多高级用法,如下为常用函数实例:
1. toupper()和tolower()
awk 'BEGIN{ print toupper("hello world") }'
输出结果为:HELLO WORLD
而:
awk 'BEGIN{ print tolower("Hello World") }'
输出结果为:hello world
2. length()
awk 'BEGIN{ print length("hello world") }'
输出结果为:11
3. substr()
awk 'BEGIN{ print substr("hello world", 2, 5) }'
输出结果为:ello
如下为awk BEGIN和END command执行条件示例
1. BEGIN模式,是指命令在处理文本之前执行,表示提取text.txt文件内容前打印test1 test2 test3
awk 'BEGIN{print "test1","test2","test3"}{print}' test.txt
2. END模式,是指命令在处理文本之后执行,表示提取文件内容后打印end1 end2 end3
awk '{print} END{print "end1","end2","end3"}' test.txt
3. BEGIN模式和END模式同时存在时,其中,BEGIN与END之间的{}相当于一个循环体,对文件中的每一行进行处理
awk 'BEGIN{print "test1","test2","test3"}{print} END{print "end1","end2","end3"}' test.txt
sed命令
sed是一种流编辑器,它可以定位到数据行并对数据进行增删改查操作。sed命令的格式如下:
sed [options] 'command' file(s)
以下是sed命令的一些常用选项:
- -n: 不输出模式空间内容而是手动输出指定的行
- -e: 允许多个命令
- -i: 修改文件内容
- -r: 使用扩展正则表达式
以下是sed命令的一些常用操作:
- a :新增
- c :取代
- d :删除
- i :插入
- p :打印
- s :取代
通过如下实例理解sed命令:
1. sed 'a This is a new line' file.txt:在文件file.txt的末尾新增一行文字“This is a new line”。
2. sed 'c old line new line' file.txt:将文件file.txt中的“old line”替换成“new line”。
3. sed 'd' file.txt:删除文件file.txt中的每一行内容,等效于清空文件。
4. sed 'i This is a new line' file.txt:在文件file.txt的首行插入一行文字“This is a new line”。
5. sed 'p' file.txt:打印文件file.txt的每一行内容,即重复一遍该文件内容。
6. sed 's/old/new/g' file.txt:将文件file.txt中所有的“old”替换成“new”。其中,“/g”表示全局替换,即一行中出现多个“old”时全部替换。
7. sed -i '/test/d' test.txt 删除文件中包含"test"的行并保存修改
命令实战
- 使用grep提取本机IP命令
ip a|grep inet|grep -Po '(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}'
具体解释如下:
-
ip a:列出网络接口的属性,包括IP地址。
-
grep inet:筛选包含“inet”的行,这些行包含有IP地址相关信息。
-
grep -Po:使用Perl正则表达式来匹配IP地址,保留匹配到的IP地址。
-
‘(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}’:正则表达式,用来匹配IP地址。
其中:
- (1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9]):匹配0-199中的数字,或者200-249中的数字,或者250-255中的数字,或者10-99中的数字,或者1-9中的数字。
- (\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}:匹配由三个点隔开的三个数字段,每个数字段匹配的规则同上述第一条。
- 使用sed提取本机IP命令
ip a|grep inet|sed 's/inet /''/g'|sed 's/\/.*$/''/'
具体解释如下:
's/inet /''/g'
将inet 替换为空字符- 最后一部分
\/
表示/字符,.*$
表示匹配任意多个,意思是将/和后面的字符串全部替换为空字符
- 使用awk提取本机IP命令
ip a|grep inet|awk -F 'inet ' '{print $2}'|awk -F '/' '{print $1}'
如上命令表示先提取第二列的内容,获取类似下图:
然后通过/
分割,取第一列的内容。