嵌入式技术
今天给大家聊一聊Linux中文本操作的三剑客:awk、grep、sed
,因其功能强大、使用频繁,且是Linux下文本处理的得力利器,常被称之为文本三剑客
。 grep
常用于查找,sed
常用于取行和替换,而awk
常用于运算。
有句玩笑话常说:做Linux技术不识三剑客,玩遍Linux也枉然
,虽然是玩笑语,但也不得不说他们的重要性。
为什么聊起这个话题呢?
最近这几天有点忙,可能是快到了毕业季了,最近来公司的面试的应届生突然多了起来。 在对应届生的面试过程中,往往会涉及一些基本的技术知识,主要看重的是对基础知识的掌握和对新知识的学习能力。 而Linux下常用的基本命令awk、grep、sed
也是常常被问及,来反映对Linux操作熟悉的程度。
问题:如何在Linux下查找包含某个函数的文件及所在的行?
熟悉Linux操作的肯定会说so easy! 此处先不给出具体答案,我们详细介绍一下三剑客
命令,如果不知道,看完后你肯定会知道答案!
grep全称是Global Regular Expression Print
,表示全局正则表达式版本,它的使用权限是所有用户。 它是Linux系统中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
shell脚本中也经常使用grep,因为grep通过返回一个状态值来说明搜索的结果。 如果搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。 我们利用这些返回值就可进行一些自动化的文本处理工作。
grep家族包括grep、egrep和fgrep。 egrep和fgrep的命令跟grep区别不大。 egrep是grep的扩展,支持更多的re元字符,fgrep是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示其自身的字面意义。 linux使用GNU版本的grep。 它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
格式:grep [option] pattern file
示例:
正则表达式应用广泛,在绝大多数的编程语言都可以应用,在Linux中,也有着很大的用处。 使用正则表达式,可以有效的筛选出需要的文本,然后结合相应的支持的工具或语言,完成我们的需求。
格式
我们可以根据grep命令任意组合正则表达式
主要用来自动编辑一个或多个文件, 简化对文件的反复操作
sed是一种流编辑器,一次处理一行内容。 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容输出。 然后读入下行,执行下一个循环。 如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。 这样不断重复,直到文件末尾。 文件内容并没有改变,除非你使用重定向存储输出或-i。
格式:sed [options] 'command' file(s) 常用参数:
示例:
sed '=' test.txt #显示行号
sed '3=' test.txt #显示第三行行号
sed "/./=" test.txt #只显示非空白行的行号
sed -n "/./!=" test.txt #只显示空白行行号
sed '$=' test.txt #显示总共有多少行
sed -n '2p' test.txt #要加-n,否则会默认自动打印所有内容
sed -n '2 p' test.txt #要加-n,否则会默认自动打印所有内容
# 输出指定行
sed -n '2,7 p' test.txt
sed -n '2,7p' test.txt
sed -n '2,7 {p}' test.txt
#替换文件中内容
sed -i 's/bck/sh/' test.txt test1.txt #替换test.txt、test1.txt内的bck为sh,每行只替换一个
sed -i 's/bck/sh/g' test.txt #替换test.txt内的bck为sh,每行都进行全面替换
sed -i 's/bck/sh/3g' test.txt #替换test.txt内的bck为sh,从第3个匹配位置开始替换
sed -i 's@bck@sh@g' test.txt #替换test.txt内的bck为sh,每行都进行全面替换
sed -i 's#bck#sh#g' test.txt #替换test.txt内的bck为sh,每行都进行全面替换
#显示查找内容的行
sed -n '/sh/p' test.txt #显示test.txt内的所有包含sh的所有行
sed -n '/sh/ ,$ p' test.txt #显示test.txt里第一条包含sh的行及以下到末尾的所有行
awk用于在linux/unix下对文本和数据进行处理。 数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。 它支持用户自定义函数和动态正则表达式,是linux/unix下的一个强大编程工具。 它在命令行中使用,但更多是作为脚本来使用。 awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。 awk其实不仅仅是工具软件,还是一种编程语言。
格式:awk [选项] 'program' var=value file...awk [选项] -f 程序文件 var=value file...awk [options] 'BEGIN{ action;... } pattern{ action;... }END{ action;... }' 文件 ...
常用命令选项
示例:
awk -v FS=':' '{print $1,$2}' testawk #FS指定输入分隔符
awk -v FS=':' -v OFS='---' '{print $1,$2}' testawk #OFS指定输出分隔符
awk -v RS=':' '{print $1,$2}' testawk
awk -v FS=':' -v ORS='---' '{print $1,$2}' testawk
awk -F: '{print NF}' testawk
awk -F: '{print $(NF-1)}' testawk #显示倒数第2列
上述三个命令的功能及参数远远不止本文提到的这些,在此只是罗列了一些常用的功能及参数。 这三个命令的功能非常强大,用法及参数和功能也非常的多,我们没必要刻意去记忆,也不可能全部记住,记住一些常用的参数及用法即可。 只要当我们有需求时知道用哪个命令然后对应的去查找相关参数用法即可。
全部0条评论
快来发表一下你的评论吧 !