1.概述
Linux系统下,grep、sed和awk三个命令是最常用的、非常强大的文本处理工具,可以用于搜索、替换、过滤、排序等多种操作,掌握这三种工具的用法,可以大大提高我们在Linux下处理文本的效率。
2.grep命令
grep是一种非常常见的文本搜索工具,它可以搜索指定字符串在一个或多个文件中出现的行,并将结果输出到标准输出。语法格式如下:
grep [OPTIONS] PATTERN [FILE…] |
其中,OPTIONS表示选项,PATTERN表示要搜索的模式,FILE表示要搜索的文件名。
grep命令的常见选项包括:
- -i:忽略大小写
- -w:完全匹配
- -v:显示不匹配的行
- -n:显示行号
- -c:显示匹配行的数量
- -r:递归搜索子目录
- -e:搜索多个字符串
详细选项参数及其含义可以通过“grep --help”获取,具体如下:
[test@localhost ~]$ grep --help 用法: grep [选项]... 模式 [文件]... 在每个<文件>中查找给定<模式>。 例如:grep -i 'hello world' menu.h main.c <模式>可以包括多个模式字符串,使用换行符进行分隔。 模式选择与解释: -E, --extended-regexp <模式> 是扩展正则表达式 -F, --fixed-strings <模式> 是字符串 -G, --basic-regexp <模式> 是基本正则表达式 -P, --perl-regexp <模式> 是 Perl 正则表达式 -e, --regexp=<模式> 用指定的<模式>字符串来进行匹配操作 -f, --file=<文件> 从给定<文件>中取得<模式> -i, --ignore-case 在模式和数据中忽略大小写 --no-ignore-case 不要忽略大小写(默认) -w, --word-regexp 强制<模式>仅完全匹配字词 -x, --line-regexp 强制<模式>仅完全匹配整行 -z, --null-data 数据行以一个 0 字节结束,而非换行符 杂项: -s, --no-messages 不显示错误信息 -v, --invert-match 选中不匹配的行 -V, --version 显示版本信息并退出 --help 显示此帮助并退出 输出控制: -m, --max-count=<次数> 得到给定<次数>次匹配后停止 -b, --byte-offset 输出的同时打印字节偏移 -n, --line-number 输出的同时打印行号 --line-buffered 每行输出后刷新输出缓冲区 -H, --with-filename 为输出行打印文件名 -h, --no-filename 输出时不显示文件名前缀 --label=<标签> 将给定<标签>作为标准输入文件名前缀 -o, --only-matching 只显示行中非空匹配部分 -q, --quiet, --silent 不显示所有常规输出 --binary-files=TYPE 设定二进制文件的 TYPE(类型); TYPE 可以是 'binary'、'text' 或 'without-match' -a, --text 等同于 --binary-files=text -I 等同于 --binary-files=without-match -d, --directories=ACTION 读取目录的方式; ACTION 可以是`read', `recurse',或`skip' -D, --devices=ACTION 读取设备、先入先出队列、套接字的方式; ACTION 可以是`read'或`skip' -r, --recursive 等同于--directories=recurse -R, --dereference-recursive 同上,但遍历所有符号链接 --include=GLOB search only files that match GLOB (a file pattern) --exclude=GLOB skip files that match GLOB --exclude-from=FILE skip files that match any file pattern from FILE --exclude-dir=GLOB skip directories that match GLOB -L, --files-without-match 只打印没有匹配上的<文件>的名称 -l, --files-with-matches 只打印有匹配的<文件>的名称 -c, --count 只打印每个<文件>中的匹配行数目 -T, --initial-tab 行首制表符对齐(如有必要) -Z, --null 在<文件>名最后打印空字符 文件控制: -B, --before-context=NUM 打印文本及其前面NUM 行 -A, --after-context=NUM 打印文本及其后面NUM 行 -C, --context=NUM 打印NUM 行输出文本 -NUM 等同于 --context=NUM --color[=WHEN], --colour[=WHEN] 使用标记高亮匹配字串; WHEN 可以是“always”、“never”或“auto” -U, --binary 不要清除行尾的 CR 字符(MSDOS/Windows) 若给定<文件>为“-”,则从读取标准输入。 若无<文件>参数,则除非处于 递归工作模式视为从“.”读取之外,一律视为从“-”读取。如果提供了少于 两个<文件>参数,则默认启用 -h 选项。如果有任意行(或者指定了 -L 选项 并有任意文件)被匹配,则退出状态为 0,否则为 1;如果有错误产生,且未指 定 -q 参数,则退出状态为 2。 |
3.sed命令
sed是一种流编辑器,它可以执行各种文本操作,如替换、删除、插入等。语法格式如下:
sed [OPTIONS] COMMAND [FILE…] |
其中,OPTIONS表示选项,COMMAND表示要执行的sed命令,FILE表示要处理的文件名。
sed命令的常见动作包括:
- a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(当前行的后一行)
- i:插入指定字符串,i的后面可以接字符串,而这些字符串会在新的一行出现(当前行的前一行)
- s:替换指定模式,通常会搭配正则表达式
- c:替换指定行
- d:删除指定行
- y:字符串转换
- p:打印匹配的行,通常会与参数sed -n一起使用
详细选项参数及其含义可以通过“sed --help”获取,具体如下:
[test@localhost ~]$ sed --help 用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]... -n, --quiet, --silent 取消自动打印模式空间 --debug 对程序运行进行标注 -e 脚本, --expression=脚本 添加“脚本”到程序的运行列表 -f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表 --follow-symlinks 直接修改文件时跟随软链接 -i[扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名则备份文件) -l N, --line-length=N 指定“l”命令的换行期望长度 --posix 关闭所有 GNU 扩展 -E, -r, --regexp-extended 在脚本中使用扩展正则表达式 (为保证可移植性使用 POSIX -E)。 -s, --separate 将输入文件视为各个独立的文件而不是单个 长的连续输入流。 --sandbox 在沙盒模式中进行操作(禁用 e/r/w 命令)。 -u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出 -z, --null-data 使用 NUL 字符分隔各行 --help 打印帮助并退出 --version 输出版本信息并退出 如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为 sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准 输入读取数据。 |
4.awk命令
awk是一种文本处理工具,它可以用于格式化、过滤与计算等操作。语法格式如下:
awk [OPTIONS] 'PATTERN {ACTION} ' [FILE…] |
其中,OPTIONS表示选项,PATTERN表示要匹配的模式,ACTION 表示要执行的操作,FILE表示要处理的文件名。
awk命令的常见选项包括:
- print:打印指定内容
- if:条件判断
- for:循环结构
- sum:计算指定
详细选项参数及其含义可以通过“awk --help”获取,具体如下:
[test@localhost ~]$ awk --help Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or GNU style options] [--] 'program' file ... POSIX options: GNU long options: (standard) -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val Short options: GNU long options: (extensions) -b --characters-as-bytes -c --traditional -C --copyright -d[file] --dump-variables[=file] -D[file] --debug[=file] -e 'program-text' --source='program-text' -E file --exec=file -g --gen-pot -h --help -i includefile --include=includefile -l library --load=library -L[fatal|invalid|no-ext] --lint[=fatal|invalid|no-ext] -M --bignum -N --use-lc-numeric -n --non-decimal-data -o[file] --pretty-print[=file] -O --optimize -p[file] --profile[=file] -P --posix -r --re-interval -s --no-optimize -S --sandbox -t --lint-old -V --version To report bugs, see node `Bugs' in `gawk.info' which is section `Reporting Problems and Bugs' in the printed version. This same information may be found at https://www.gnu.org/software/gawk/manual/html_node/Bugs.html. PLEASE do NOT try to report bugs by posting in comp.lang.awk, or by using a web forum such as Stack Overflow. gawk is a pattern scanning and processing language. By default it reads standard input and writes standard output. Examples: gawk '{ sum += $1 }; END { print sum }' file gawk -F: '{ print $1 }' /etc/passwd |
5.使用实例
(1) grep使用实例
--在文件中搜索指定字符串 grep -i "关键字" 文件名 --模糊匹配(不区分大小写) grep -w "关键字" 文件名 --完全匹配 --在文件中搜索多个字符串 grep -e "关键字1" -e "关键字2" 文件名 --在文件中搜索并显示匹配的行号 grep -n "关键字" 文件名 --在文件中搜索并显示不匹配的行 grep -v "关键字" 文件名 --在目录中递归搜索指定字符串 grep -r "关键字" directory/ --查看文件中搜索的关键字的后n行 cat 文件 | grep -An -i "关键字" --查看文件中搜索的关键字的前n行 cat 文件 | grep -Bn -i "关键字" --查看文件中搜索的关键字的前后n行 cat 文件 | grep -C20 -i "关键字" |
(2) sed使用实例
/* 选择文本p */ --显示文件的1-3行,不使用-n sed 1,3p 文件名 --只显示文件的1-3行,使用-n sed -n 1,3p 文件名 --显示包含关键字的行 sed -n '/关键字/p' 文件名 /* 替换文本s */ 语法格式:[位置参数1] [,位置参数2] s/匹配字符/替换字符/[标志] 标志说明: g:全局匹配,会替换文本行中所有符合规则的字符串 十进制数字n:替换第n个符合规则的字符串 p:替换第一个,并输出到标准输出 w:替换第一个,并输出到磁盘文件中 空:不加标志,则替换第一个 --把文件的a全部替换成A sed 's/a/A/g' 文件名 > 新文件名 --对指定行进行替换 sed '1,3 s/a/A/g' 文件名 > 新文件名 /* 删除文本d */ --删除文件的第一行 sed '1d' 文件名 --删除文件的最后一行 sed '$d' 文件名 --删除空白行 sed '/^$/d' 文件名 /* 追加文本a */ --在文件中root开头的行的后面插入一行test sed '/^root/a test' 文件名 /* 插入文本i */ --在文件中root开头的行的前面插入一行test sed '/^root/i test' 文件名 |
(3) awk使用实例
--打印文件中的所有行 awk '{print}' filename --打印文件中第二列的内容 awk '{print $2}' filename --计算文件中所有数字的总和 awk '{sum += $1} END {print sum}' filename --打印文件中包含指定字符串的行 awk '/关键字/ {print}' filename --在文件中指定列后面添加指定字符串 awk '{$3 = $3 "关键字"} {print}' filename |