本章讲解知识点
-
- 引言
-
- 指令学习
- 本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。
- 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。
- 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
- 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
1. Linux 高阶指令
当涉及到文本处理和数据操作时,Linux系统的"三剑客"——grep、awk、和 sed——通常被称为无价的工具,同时还有 cut、xargs。这几个命令为 Linux 用户提供了强大的能力,用于搜索、过滤、转换和处理文本数据。它们的组合使您能够轻松地完成各种任务,从日常系统管理到数据分析,从日志分析到文本处理。
grep(全局正则表达式打印)是一个用于搜索文本的工具,它可以根据正则表达式模式匹配文本,并将匹配的行打印出来。这使得可以快速查找文件中的关键字,筛选出所需的信息,或者验证数据的有效性。
awk 是一个强大的文本处理工具,它允许以各种方式分析和操作文本数据。通过定义字段和使用内置函数,可以执行复杂的文本操作,如计算、过滤、格式化和汇总数据。
sed(流编辑器)是一个流文本编辑器,用于在文本中执行替换、删除、插入和其他编辑操作。它非常适合自动化文本处理任务,批量编辑文件,或者对数据流进行转换。
cut 命令用于从文本文件中剪切出指定的部分文本,并将其输出到标准输出。它通常用于处理以列为单位的文本数据,例如CSV文件或以制表符分隔的文本。
xargs 命令用于从标准输入(或文件)读取参数,并将这些参数传递给其他命令,以执行相应的操作。它通常与管道结合使用,用于执行重复的命令或操作。
2. 指令学习
2.1. grep、zgrep、bzgrep
grep 命令。强大的文本搜索命令,grep(Global Regular Expression Print) 全局正则表达式搜索。grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
//参数
-A n --after-context显示匹配字符后n行
-B n --before-context显示匹配字符前n行
-C n --context 显示匹配字符前后n行
-c --count 计算符合样式的列数
-i 忽略大小写
-n 显示匹配内容的所在文件中行数
-r 递归查找文件夹
-w 全字符匹配
-E 扩展匹配,同时匹配多个关键字
-l:仅列出包含匹配的文件名,而不显示匹配的行。
-v:反转匹配,显示不包含模式的行。
//grep 的规则表达式:
^ #锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* #一起用代表任意字符。
[] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\) #标记匹配字符,如'\(love\)',love被标记为1。
\< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b #单词锁定符,如: '\bgrep\b'只匹配grep。
实例:
//查找指定进程
ps -ef | grep svn
//查找指定进程个数
ps -ef | grep svn -c
//从文件中读取关键词
cat test1.txt | grep -f key.log
//显示包含 ed 或者 at 字符的内容行
grep -E 'ed|at' test.txt
//在文件中搜索特定模式
grep "pattern" filename
//递归搜索目录下的文件
grep -r "pattern" directory/
//忽略大小写搜索
grep -i "pattern" filename
//列出包含匹配的文件名
grep -l "pattern" directory/*
//显示不包含模式的行
grep -v "pattern" filename
//在当前目录下搜索pattern的结果又将pattern反过滤除去
grep -i "pattern" ./* | grep -v "pattern"
zgrep 命令。用法和 grep 一样,并且还适用于 .gz 压缩包搜索。
bzgrep 命令。用法和 grep 一样,并且还适用于 .bz2 压缩包搜索。
2.2. awk
awk 命令。awk 是一个强大的文本处理工具,它允许以各种方式分析和操作文本数据。通过定义字段和使用内置函数,可以执行复杂的文本操作,如计算、过滤、格式化和汇总数据。
//参数
-FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同
-OFS:输出分隔符。指定输出字段间的分隔符。
-RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录,
awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符)
-NF:当前处理行的字段个数
-NR:当前处理行的行号
-FNR:awk当前读取的记录数,其变量值小于等于NR
(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
-NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件
-$0:当前处理行的整行内容
-$n:当前处理行的第 n 个字段(第 n 列)
-FILENAME:被处理的文件名
实例:
//输出所有内容
awk '{print}' t.txt 或 awk '{print $0 }' t.txt
abc
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
//输出指定行号的内容
#打印1-3行的行内容
awk 'NR==1,NR==3{print $0}' a.txt
one
two
three
#打印1-3行的行内容,&&表示“与”
awk '(NR>=1)&&(NR<=3){print $0}' a.txt
one
two
three
#打印第1行或第3行的行内容,|| 表示“或”
awk 'NR==1||NR==3{print $0}' a.txt
one
three
#打印行号小于4的行内容,!表示取反
awk '!(NR>4){print $0}' a.txt
one
two
three
four
//输出匹配行的行内容
#输出以 n 开头的行内容
awk '/^n/{print $0}' a.txt
nine
#输出以 e 结尾的行内容
awk '/e$/{print $0}' a.txt
one
three
five
nine
twelve
//输出指定字段
///etc/passwd的内容为
cat passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
y:x:1000:1000:y:/home/y:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
lisi:x:1001:1001::/home/lisi:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
# -F 指定分隔符;$1 所在行以分隔符分隔的第一个字段
awk -F ":" '{print $1}' /etc/passwd
root
daemon
adm
y
named
lisi
apache
dhcpd
# $NF 表示所在行最后一个字段,NR 表示当前行的行号
awk -F ":" '{print NR,$NF }' /etc/passwd
1 /bin/bash
2 /sbin/nologin
3 /sbin/nologin
4 /bin/bash
5 /sbin/nologin
6 /bin/bash
7 /sbin/nologin
8 /sbin/nologin
//输出结果指定分隔符
#输出第1和第3个字段,输出结果默认以 空格 分隔
awk -F ":" '{print $1,$3 }' /etc/passwd
root 0
daemon 2
adm 3
y 1000
named 25
lisi 1001
apache 48
dhcpd 177
awk -F ":" '{print $1","$3 }' /etc/passwd
root,0
daemon,2
adm,3
y,1000
named,25
lisi,1001
apache,48
dhcpd,177
awk -F ":" '{print $1"=="$3 }' /etc/passwd
root==0
daemon==2
adm==3
y==1000
named==25
lisi==1001
apache==48
dhcpd==177
//计算文件中某列的总和
awk '{ sum += $3 } END { print sum }' filename