Linux学习之文本查找编辑替换命令

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 Linux学习之文本查找编辑替换命令,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

本文主要包括Linux环境下最常使用的文本查找编辑替换等命令,包括:

  • find
  • grep
  • awk
  • sed

find

Linux系统下用于文本查找定位的命令行。
命令语法:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

find与xargs
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

# 用.来表示当前目录,用/来表示系统根目录
# -name指定根据关键字查找文件或者目录,-exec command {} \;将查到的文件执行command操作,{} 和 \;之间有空格;-ok 和-exec相同,只不过在操作前要询用户
# 递归查找/打印当前目录下面的所有文件名是'.svn'的目录
find . -name .svn -exec ls '{}' \;
# 递归删除当前目录下面的所有文件名是'.svn'的目录
find . -name .svn -exec rm -rf '{}' \;
# 递归删除当前目录下面的所有文件名是'.classpath'的目录
find . -name .classpath -exec rm -rf '{}' \;
find . -name ".classpath" -exec rm -fr '{}' +
# 另外如果要删除的文件名里面还有[]的话,命令执行失败,加入转义字符即可
find . -name "name\[with\]bracket" -exec rm -fr '{}' +
# 查找冲突的类/方法,即找出所有的jar包,再解压出其文件列表,再搜索冲突的类名
find . -name '*.jar' -exec jar -tvf {} \; | grep EE   
# 在当前目录递归查找列出所用大于 1000 MB 的文件,-type指定查找普通文件(f)或者目录(d),b – 块设备文件,c – 字符设备文件,p – 管道文件,l – 符号链接文件;-size n:[c] 查找文件长度为n块(一块等于512字节)的文件,带有c时表示文件长度以字节计
# 在当前目录下查找文件长度大于1 M字节的文件
find . -size +1000000c –print
# 在当前目录下查找长度超过10块的文件
find . -size +10 –print
# 对查找结果排序:正序,从小到大 sort -r表示反序;第一个管道符号后命令:显示查询结果的详细信息(文件大小)
find . -type f -size +1M -print0 |xargs -0 du -h|sort -n
find . -type f -size +800M  -print0 | xargs -0 ls -l
find . -type f -size +800M  -print0 | xargs -0 ls -lh
# 列出所有CSS或HTML文件
find . -type f \( -name "*.css" -or -name "*.html" \)
# -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
find / -name “CON.FILE” -depth –print
# -mtime -n +n,按照文件更改时间来查找文件,– n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前
# -newer file1 ! file2,查找更改时间比文件file1新但比文件file2旧的文件
# -perm,按照文件权限来查找文件
# -user,按照文件属主来查找文件;-nouser,查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在
# -group,按照文件所属的组来查找文件;-nogroup,查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
# -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件
# -prune,不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略
# 在/apps目录下查找文件,但排除/apps/bin目录
find /apps -path “/apps/bin” -prune -o –print
# -mount:在查找文件时不跨越文件系统mount点
# 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)
find . -name “*.XC” -mount –print
# find结合xargs,在当前目录及其子目录下查找包含abcd字符串的文件行,经常用于搜索代码。
find . -type f | xargs grep 'abcd'

find ./ -size 0 -exec rm {} ; 删除文件大小为零的文件 (还可以以这样做:rm -i find ./ -size 0  或 find ./ -size 0 | xargs rm -f &)
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l {  } ;
在/logs目录中查找更改时间在5日以前的文件并删除它们:find /logs -type f -mtime +5 -exec rm {  } ;
-ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find . -name “*.conf”  -mtime +5 -ok rm {  } ; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示 

find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
find / -name “core” -print | xargs echo “” >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
find . -type f -print | xargs grep “hostname” 用grep命令在所有的普通文件中搜索hostname这个词
find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} ;)
find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

grep

grep,global search regular expression and print out the line,全面搜索正则表达式并把行打印出来,一个超级强大的文本搜索工具,使用正则表达式搜索内容(文件或输入流),并把匹配的行打印出来。

In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions ?, +, {,|, ,and. Traditional egrep did not support the { meta-character, and some egrep implementations support { instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a literal {. GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification. For example, the command grep -E ‘{1′ searches for the two-character string {1 instead of reporting a syntax error in the regular expression. POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.

命令行语法:
grep [OPTION]… PATTERN [FILE]…
grep命令用于搜索由Pattern参数指定的模式,并将每个匹配的行写入标准输出中。这些模式是具有限定的正则表达式,它们使用ed或egrep命令样式。如果在File参数中指定了多个名称,grep命令将显示包含匹配行的文件的名称。对 shell 有特殊含义的字符 ($, *, [, |, ^, (, ), ) 出现在 Pattern参数中时必须带双引号。
如果 Pattern参数不是简单字符串,通常必须用单引号将整个模式括起来。在诸如 [a-z], 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定一个范围。整理序列可以定义等价的类以供在字符范围中使用。如果未指定任何文件,grep会假定为标准输入。

操作符 含义 实例
. 匹配任何单个非换行符字符
? 匹配前一个字符0次或者1次
* 匹配前一个字符>=0次,.*一起用代表任意字符。
+ 匹配前一个字符>=1次
{N} 匹配前一个字符N次
{N,} 匹配前一个字符>=N次
x{N,M} 匹配字符x N~M次
[] 匹配一个指定范围内的字符 如’[Gg]rep’匹配Grep和grep
[^] 匹配一个不在指定范围内的字符 如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行
(…) 标记匹配字符 如:’(love)’,love被标记为1
表示范围
^ 开始标记,表示在开始位置匹配一个空字符串,也表示不在列表的范围内字符
$ 结束标记,匹配一个空的字符串
b 单词锁定符,在一个单词的边缘位置匹配空字符串 如‘bgrepb’只匹配grep,两边均为空格。
B 在一个单词的非边缘位置匹配空字符串
< 匹配单词开始的空字符串
> 匹配单词结尾的字符串
w 匹配一个文字或数字字符,也就是[A-Za-z0-9] 如’Gw*p’匹配以G后跟零个或多个文字或数字字符,然后是p
W w的反置形式,匹配一个非单词字符,如点号句号等,W*则可匹配多个

常用选项

选项缩写 选项完整 意义 示例
-? 同时显示匹配行上下的?行 grep -2 pattern filename同时显示匹配行的上下2行。
-b –byte-offset 打印匹配行前面打印该行所在的块号码。
-c –count 只打印匹配的行数,不显示匹配的内容。
-f File –file=File 从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
-h –no-filename 当搜索多个文件时,不显示匹配文件名前缀。
-i –ignore-case 忽略大小写差别。
-q –quiet 取消显示,只返回退出状态。0则表示找到了匹配的行。
-l –files-with-matches 打印匹配模板的文件清单
-L –files-without-match 打印不匹配模板的文件清单
-n –line-number 在匹配的行前面打印行号
-s –silent 不显示关于不存在或者无法读取文件的错误信息
-v –revert-match 反检索,只显示不匹配的行
-w –word-regexp 如果被引用,就把表达式做为一个单词搜索
-V –version 显示软件版本信息

命令行实例

# 在当前目录下查找"xml"字符串,* : 表示当前目录所有文件,-r 是递归查找,-n 是显示行号,-R递归,-i 忽略大小写,否则大小写敏感,-l只列出匹配的文件名, -L列出不匹配的文件名, -w只匹配整个单词而不是字符串的一部分,
grep -rn "xml" *
# 匹配的上下文分别显示[number]行
grep -C number pattern files
# 匹配 pattern1 或 pattern2
grep pattern1 | pattern2 files
# 既匹配 pattern1 又匹配 pattern2
grep pattern1 files | grep pattern2
# 列举含有xml关键字的文件
grep xml -rl *
# 列举出含有xml关键字的行
grep google -r *
# 查找文件满足指定日期的日志,重定向到另一个文件
# grep "(date +"%Y-%m-%d")" error.log > today-error.log


# 搜索vivek,即不区分大小
grep -i -w vivek /etc/passwd
# 使用了扩展正则表达式的模式:不区分大小写地检索 ‘vivek’ 和 ‘raj’
grep -E -i -w 'vivek|raj' /etc/passwd
# 使用 ^ 和 $ 符号强制一个正则表达式分别匹配一行的开始或结束的位置
grep ^vivek /etc/passwd
# 显示以 vivek 单词开头的文本行
grep -w ^vivek /etc/passwd
# 检索以 ‘foo’ 结尾的文本格式
grep 'foo$' FILENAME
# 搜索空白行
grep '^$' FILENAME

# 在grep中使用 OR 的逻辑运算
grep -E 'word1|word2' FILENAME
egrep 'word1|word2' FILENAME
grep 'word1\|word2' FILENAME
# 在grep中使用 AND 的逻辑运算,显示所有包含单词 ‘word1′ 和 ‘word2′ 的结果
grep 'word1' FILENAME | grep 'word2'
grep 'foo.*bar\|word3.*word4' FILENAME

1、如何检索一个具有以 ‘-‘ 开头的的模式?
使用 -e 选项搜索所有匹配 ‘–test–‘ 的结果。grep 会尝试把 ‘–test–‘ 作为一个选项解析:grep -e '--test--' FILENAME

4、如何测试序列?
你可以使用下面的语法测试一个字符在序列中的重复的次数:
{N}
{N,}
{min,max}
匹配包含两个字母 v 的字符串结果:egrep "v{2}" FILENAME
下面的例子中将检索文件内包含 “col” 和 “cool” 的字符串结果:egrep 'co{1,2}l' FILENAME
下面的例子中将匹配至少含有3个字母 c 的结果:egrep 'c{3,}' FILENAME
下面的示例将匹配 “91-1234567890″ 格式的手机号码:grep "[[:digit:]]\{2\}[ -]\?[[:digit:]]\{10\}" FILENAME
5、如何使 grep 的输出结果高亮标注?
使用下面例子的语法:
grep --color regex FILENAME
6、如何使 grep 的输出只显示匹配的部分而不是整行?
使用下面例子的语法:grep -o regex FILENAME

用 “.” 来代替单个字符,查询所有以 “b” 开头、 “t” 结尾的三个字符的单词
grep '\<b.t\>' FILENAME
\< 在单词的开始位置匹配空格字符串
\> 在单词的结尾匹配空格字符串
检索并输出所有两个字母的结果:grep '^..$' FILENAME
检索并显示所有以 ‘.’ 和数字开头的结果:grep '^\.[0-9]' FILENAME
转义字符’.’
下面的正则表达式查找 IP 地址 192.168.1.254 将不能获得预期的结果:grep '192.168.1.254' /etc/hosts
其中三个点都需要被转义:grep '192\.168\.1\.254' /etc/hosts
以下示例将只匹配一个地址:
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]
{1,3}' FILENAME
以下将不分大小写地匹配单词 Linux 或 Unix :egrep -i '^(linux|unix)' FILENAME


# 匹配 ‘Vivek’ 或 ‘vivek’
grep '[vV]ivek' FILENAME
# 匹配 vivek1 或 Vivek2
grep -w '[vV]ivek[0-9]' FILENAME
# 匹配foo11 or foo12
grep 'foo[0-9][0-9]' FILENAME
# 匹配字母
grep '[A-Za-z]' FILENAME
# 匹配所有包含“w” 或 “n” 字母的文本行
grep [wn] FILENAME

# 在括号内的表达式中,在“ [: ”和“ :] ”中所附的字符类的名称:代表属于该类的所有字符的列表。标准字符类名称:
[:alnum:] – 字母数字字符。
[:alpha:] – 字母顺序
[:blank:] – 空格和制表符。
[:digit:] – 数字: ‘0 1 2 3 4 5 6 7 8 9’。
[:lower:] – 小写字母:‘a b c d e f ‘。
[:space:] – 特殊字符:制表符,换行符,垂直制表符、换页,回车,和空间。
[:upper:] – 大写字母:‘A B C D E F G H I J K L M N O P Q R S T U V W X Y Z’。
# 匹配所有大写字母
grep '[:upper:]' FILENAME

ls -l | grep ‘^a’ 通过管道过滤ls -l输出的内容,只显示以a开头的行。
grep ‘test’ d* 显示所有以d开头的文件中包含test的行。
grep ‘test’ aa bb cc 显示在aa,bb,cc文件中匹配test的行。
grep ‘[a-z]’ aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
grep ‘w(es)t.*’ aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用””号进行转义,直接写成’w(es)t.*’就可以了。
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

1.搜索和寻找文件
$ sudo dpkg -l | grep -i python
运行dpkg -l列出你系统上安装的.deb包。使用管道将输出结果传输给命令grep -i python,这一步可以简单解释为把结果传输给grep然后过滤出所有含有python的项,并返回结果。–i选项用于忽略大小写,因为 grep 是大小写敏感的。使用选项-i是个好习惯,除非你打算进行更细节的搜索。

2.搜索和过滤文件
grep还可以在一个或多个文件里用于搜索和过滤。移除demo.txt文件所有的注释行
$ sudo grep -v "#" demo.txt
选项-v是告诉grep命令反转它的输出结果,意思就是不输出匹配的项,做相反的事,打印出所有不匹配的项。假设有#的是注释行(实际上不尽然)。

3.找出所有的mp3文件
找出jayZ的所有mp3格式文件,也不要有任何混合音轨。使用find再结合管道使用grep:
$ sudo find . -name ".mp3" | grep -i JayZ | grep -vi "remix""
使用find命令打印出所有以.mp3为后缀名的文件,接着将其使用管道传递给grep -i过滤和打印出名字为“JayZ”的文件,再使用管道传送给grep -vi以便过滤掉含有“remix”的项。

4.在搜索字符串前面或者后面显示行号
-A和-B之间的切换,是用以显示匹配的行以及行号,分别控制在字符串前或字符串后显示的行数:-A=after、-B=before。
$ sudo ifconfig | grep -A 4 etho $ sudo ifconfig | grep -B 2 UP
5.在匹配字符串周围打印出行号
grep命令的-C选项和例4中的很相似,不过打印的并不是在匹配字符串的前面或后面的行,而是打印出两个方向都匹配的行(译注:同上面的记忆窍门一样:-C=center,以此为中心): $ sudo ifconfig | grep -C 2 lo

6.计算匹配项的数目
将grep输出的结果用管道传送给计数器(wc程序),grep内建的选项可以达到同样的目的:$ sudo ifconfig | grep -c inet6

7.按给定字符串搜索文件中匹配的行号
n选项告诉你所搜索的内容在文件的哪一行,当你在编译出错时需要调试时:
$ sudo grep -n "main" setup.py

8.在所有目录里递归的搜索
假若你要在当前文件夹里搜索一个字符串,-r选项用于递归的搜索: $ sudo grep -r “function” *

9.进行精确匹配搜索
-w选项给grep命令可以在字符串中进行精确匹配搜索(译注:包含要搜索的单词,而不是通配):$ sudo ifconfig | grep -w “RUNNING”
将打印出含有引号内匹配项的行:$ sudo ifconfig | grep -w “RUN”

搜索这个匹配项时,若搜索的东西里面没有这样的一个单独的单词,将什么也不会返回。

10.在Gzip压缩文件中搜索
grep的衍生命令行工具。第一个是zgrep,与zcat很相似,用于gzip压缩过的文件。与grep相似的命令选项:$ sudo zgrep -i error /var/log/syslog.2.gz

11. egrep
egrep,即 grep -E ,它把模式作为一个扩展的正则表达式解释。它可以识别更多的正则表达式元字符,例如at + ? | 和()。

12.搜索一个固定匹配字符串
fgrep用于在一个文件或文件列表中搜索固定样式的字符串。功能与grep -F同。fgrep的一个通常用法为传递一个含有样式的文件给它:
$ sudo fgrep -f file_full_of_patterns.txt file_to_search.txt
grep还可以写成cron任务或者自动的shell脚本去执行。

sed

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

比grep更强大,可以执行几乎所有的字符串相关的操作任务,包括添加、删除还有替换字符串的内容。

# 查看文件的第100行到第200行
sed -n '100,200p' log.txt
# 替换字符串中的特定子串
echo "int charset=gb2312 float"|sed "s/charset=gb2312/charset=UTF-8/g"
# 替换test文件每行匹配ab的部分为cd
sed -i 's/ab/cd/g' test

awk

awk,功能超级强大的数据处理引擎之一。相对于 grep 的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。awk 命令默认从 stdio 标准输入获取文件内容, awk 使用一对单引号来表示 一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。 awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言。
awk和sed常用于文本处理,awk按列进行处理,sed按行进行处理。
命令语法:
awk [options] 'program' file
options 表示可选参数项,program表示 awk 的可执行脚本代码,file 表示 awk 需要处理的文本文件。
awk内置变量
$0 这个表示文本处理时的当前行
$1 表示文本行被分隔后的第 1 个字段列
$n 表示文本行被分割后的第 n 个字段列
NR 表示文件行号
NF 表示文件中的当前行列的个数
FS 表示 awk 的输入分隔符,默认分隔符为空格和制表符,你可以对其进行自定义设置
OFS 表示 awk 的输出分隔符,默认为空格,你也可以对其进行自定义设置
FILENAME 表示当前文件的文件名称,如果同时处理多个文件,它也表示当前文件名称

命令实例

# awk 命令的可执行脚本代码使用单引号括起花括号,里面就是一些可执行的脚本代码段,当 awk 每读取一行之后,它会依次执行双引号里面的每个脚本代码段。$0 表示当前行。依次将 /etc/passwd 文件的每一行内容打印输出
awk '{print $0}' /etc/passwd
# 打印输出文件的每一行的第 1 列内容
awk '{print $1}' awesome.txt
# 打印输出文件的每一行的第 1 列、第 2 列和第 3 列内容,逗号表示插入输出分隔符,也就是默认的空格
awk '{print $1, $2, $3}' awesome.txt
# 在参数列表中加入一些字符串或者转义字符,要使用双引号,使输出更格式化
awk '{print $1 "\t" $2 "\t" $3}' awesome.txt
# 显示行号和每行的列数,$NF即为每一行的最后一列,$(NF-1) 表示倒数第 2 列, $(NF-2) 表示倒数第 3 列
awk '{print NR "\t" NF "\t" $0}' awesome.txt
awk '{print $(NF - 1)}' awesome.txt
# awk 默认分割符为空格和制表符,使用 -F 参数来指定自定义分隔符。将 /etc/passwd 文件中的每一行用冒号 : 分割成多个字段,然后用 print 将第 1 列字段的内容打印输出
awk -F ':' '{print $1}' /etc/passwd
# 通过对 $2 变量进行重新赋值,来隐藏每一行的第 2 列内容,并且用星号 * 来代替其输出
awk '{$2 = "***"; print $0}' awesome.txt
# 采用冒号分隔数据,输出第一列数据
awk -F ":" '{print $1}'
# 花括号{}表示规定它前面的字符必须出现的次数;用法和其他命令如find&grep非常类似。
# /go{2,3}d/    表示字母 "o" 只能可以出现 2 次或者 3 次
# /go{2,10}d/   表示字母 "o" 只能可以出现 2~10 次
# /go{2,}d/     表示字母 "o" 必须至少出现 2 次
# 只匹配字符串"good";
awk '/go{2}d/{print $0}' awesome.txt

# 正则表达式中的圆括号表示将多个字符当成一个完整的对象来看待。比如 /th(in){1}king/ 就表示其中字符串 “in” 必须出现 1 次。不加圆括号就变成 /thin{1}king/ 这个就表示其中字符 “n” 必须出现 1 次。
awk '/th(in){1}king/{print $0}' awesome.txt
# 正则表达式中的问号 ? 表示它前面的字符只能出现0或1次
awk '/ba?d/{print $0}' awesome.txt

上面都是对一个文本的操作;awk可以对多个文本进行操作,变量 FILENAME 表示当前文本行所在的文件

awk '{print FILENAME "\t" $0}' awesome.txt johnny.txt

使用数学运算&条件判断

~ 匹配正则表达式
!~ 不匹配正则表达式
# 先声明两个变量,然后用 print 打印出计算结果;awk针对文件的每一行执行一次单引号里面的脚本代码,但 BEGIN 和 END 关键字后面的 脚本代码除外,如果被处理的文件中什么都没有,那 awk 就一次都不会执行
awk '{a = 12; b = 24; print a + b}' awesome.txt
# 判断文件的第 3 列数据,满足条件则打印输出
awk '$3 < 500 {print $0}' awesome.txt
awk '{if ($3 < 500) print $0}' awesome.txt
awk '$1 == "yahoo" {print $0}' company.txt

在awk的结果基础上,结合sort、uniq和head等命令可以轻松完成频率统计等功能。
要知道还有书籍专门讲解awk命令使用,算得上是一门编程语言,还有很多功能有待开发使用。

ag

比grep、ack更快的递归搜索文件内容。ag ‘hello wor’,非精确匹配;

参考

linux中强大且常用命令:find、grep

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142331.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!