SHELL-文本编辑三剑客(grep|sed|awk)
awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
正则表达式
正则表达式可以使用正则表达式引擎实现,正则表达式引擎是解释正则表达式模式并使用这些模式匹配文本的基础软件。
在Linux中,常用的正则表达式有:
- POSIX 基本正则表达式(BRE)引擎
- POSIX 扩展正则表达式(ERE)引擎
基本元字符
元字符 | 功能 | 示例 |
---|---|---|
^ | 行首定位法 | ^love |
$ | 行尾定位法 | love$ |
. | 匹配单个字符 | l..o |
* | 匹配前导符0到多次 | ab*love |
.* | 任意多个字符 | |
[] | 匹配指定范围内一个字符 | [Ll]ove |
[ - ] | 匹配自动范围内的一个字符 | [0-9a-z]ove |
[^] | 匹配不在指定组内字符 | [^0-9a-z]ove |
\ | 转移符 | love. |
< | 词首定位符 | <love |
> | 词尾定位符 | love> |
(..) | 匹配稍后使用的字符的标签 | :% s/172.16.130.1/172.16.130.5/g:% s/(172.16.130.)1/\15/:% s/(172.)(16.)(130.)1/\1\2\35/:3,9 s/(.*)/#\1/ 3-9行注释掉 |
x | 字符X重复出现M次 | o |
x | 字符X重复出现M次以上 | o |
x | 字符X重复出现M-N次 | o |
扩展元字符
元字符 | 功能 | 示例 |
---|---|---|
+ | 匹配一个或多个前导符 | [a-z]+ove |
? | 匹配零个或一个前导符 | lo?v3 |
a|b | 匹配a或b | love|hate |
() | 组字符 | |
(..)(..)\1\2 | 标签匹配字符 | (love)able\1er |
x | 字符X重复出现M次 | o |
x | 字符X重复出现M次以上 | o |
x | 字符X重复出现M-N次 | o |
POSIX字符类
表达式 | 功能 | 示例 |
---|---|---|
[:digit:] | 任何数字 | |
[:xdigit:] | 任何十六进制数字 | |
[:alpha:] | 任何字母 | |
[:lower:] | 任何小写字母 | |
[:upper:] | 任何大写字母 | |
[:alnum:] | 任何字母或数字 | |
[:cntrl:] | ASCII控制字符(ASCII 0~31 和 ASCII 127) | |
[:punct:] | 不属于[:alnum:]和[:cntrl:]的任何字符 | |
[:blank:] | 空格或制表符([\t ]) | |
[:space:] | 任何空白字符,包括换行符,回车符等在内的所有空白([\f\n\r\t\v ]) | |
[:print:] | 任何可打印字符 | |
[:graph:] | 同[:print:],但不包括空格 |
演示案例
# 1. 空行
/^$/
/^[ \t]*$/ # 开头0个或多个空格或字符表结尾
# 2. 注释行
/^#/
/^[ \t]*#/ # 0个或多个空格或字符表开头后#号
grep
grep简介
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep通过返回一个状态值来说明搜索的状态
- 如果搜索成功,则返回0
- 如果搜索不成功,则返回1
- 如果搜索的文件不存在,则返回2
egrep = grep -E:扩展的正则表达式
fgrep: fixed grep |fast grep
使用grep
命令格式
# 用法:
grep [选项] 模式 filename filename....
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c
Regexp selection and interpretation:
-E, --extended-regexp PATTERN is an extended regular expression (ERE)
-F, --fixed-strings PATTERN is a set of newline-separated fixed strings
-G, --basic-regexp PATTERN is a basic regular expression (BRE)
-P, --perl-regexp PATTERN is a Perl regular expression
-e, --regexp=PATTERN use PATTERN for matching
-f, --file=FILE obtain PATTERN from FILE
-i, --ignore-case ignore case distinctions
-w, --word-regexp force PATTERN to match only whole words
-x, --line-regexp force PATTERN to match only whole lines
-z, --null-data a data line ends in 0 byte, not newline
Miscellaneous:
-s, --no-messages suppress error messages
-v, --invert-match select non-matching lines
-V, --version display version information and exit
--help display this help text and exit
Output control:
-m, --max-count=NUM stop after NUM matches
-b, --byte-offset print the byte offset with output lines
-n, --line-number print line number with output lines
--line-buffered flush output on every line
-H, --with-filename print the file name for each match
-h, --no-filename suppress the file name prefix on output
--label=LABEL use LABEL as the standard input file name prefix
-o, --only-matching show only the part of a line matching PATTERN
-q, --quiet, --silent suppress all normal output
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
-I equivalent to --binary-files=without-match
-d, --directories=ACTION how to handle directories;
ACTION is 'read', 'recurse', or 'skip'
-D, --devices=ACTION how to handle devices, FIFOs and sockets;
ACTION is 'read' or 'skip'
-r, --recursive like --directories=recurse
-R, --dereference-recursive
likewise, but follow all symlinks
--include=FILE_PATTERN
search only files that match FILE_PATTERN
--exclude=FILE_PATTERN
skip files and directories matching FILE_PATTERN
--exclude-from=FILE skip files matching any file pattern from FILE
--exclude-dir=PATTERN directories that match PATTERN will be skipped.
-L, --files-without-match print only names of FILEs containing no match
-l, --files-with-matches print only names of FILEs containing matches
-c, --count print only a count of matching lines per FILE
-T, --initial-tab make tabs line up (if needed)
-Z, --null print 0 byte after FILE name
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
--group-separator=SEP use SEP as a group separator
--no-group-separator use empty string as a group separator
--color[=WHEN],
--colour[=WHEN] use markers to highlight the matching strings;
WHEN is 'always', 'never', or 'auto'
-U, --binary do not strip CR characters at EOL (MSDOS/Windows)
-u, --unix-byte-offsets report offsets as if CRs were not there
(MSDOS/Windows)
'egrep' means 'grep -E'. 'fgrep' means 'grep -F'.
Direct invocation as either 'egrep' or 'fgrep' is deprecated.
When FILE is -, read standard input. With no FILE, read . if a command-line
-r is given, - otherwise. If fewer than two FILEs are given, assume -h.
Exit status is 0 if any line is selected, 1 otherwise;
if any error occurs and -q is not given, the exit status is 2.
命令参数
选项 | 说明 |
---|---|
-E | 开启扩展(Extend)的正则表达式,相当于egrep。 |
-i | 忽略大小写(ignore case)。 |
-v | 只打印没有匹配的行 |
-n | 显示匹配的行号 |
-w | 被匹配的文本只能是单词,而不能是单词中的某一部分 |
-c | 统计匹配的行数,而不是显示被匹配到的内容 |
-e | 实现多个选项的匹配,逻辑or关系 |
-q | 静默模式,不输出任何信息 |
-s | 不显示不存在或无匹配文本的错误信息。 |
-R,-r | 查询递归目录下的所有文件 |
-o | 只显示被模式匹配到的字符串。 |
--color | 将匹配到的内容以颜色高亮显示。 |
-A n | 显示匹配到的字符串所在的行及其后n行,after |
-B n | 显示匹配到的字符串所在的行及其前n行,before |
-C n | 显示匹配到的字符串所在的行及其前后各n行,context上下文 |
-f FILE | 从FILE获取PATTERN匹配 |
-F | 相当于fgrep |
grep 使用的元字符
-
grep : 使用基本元字符
^
,$
,.
,*
,[]
,[^]
,{}
,\<
,\>
,\(\)
,\+
,\|
-
egrep(或grep -E): 使用的扩展元字符
+
,?
,{}
,|
,()
注:grep也可以使用扩展元字符,仅需要加上前置反射线
元字符 | 功能 | 示例 |
---|---|---|
\w | 所有字母与数字, 字符[a-zA-Z0-9] | 'b[a-zA-Z0-9]ao''b\wao' |
\W | 所有字母与数字之外的字符,称为非字符 | 'biao[^a-zA-Z0-9]+''biao\W+' |
\b | 词边界 | grep '\broot\b' /etc/passwdgrep '<love>' filename |
grep实战演示
# 在file文件中过滤掉字符串'str'所在的行
grep -v "str" file
# 在file文件中查找时间在2017:22:50~2017:22:59所在的行
grep -E "2017:22:5[0-9]" file
# 在file文件中查找不包括360的行
grep -E "^[^360]" file
# 在file文件中查找包括w和t的行
grep -E "w*t" file
# 在file文件中查找大于560小于893的行
grep -E "[5-8][6-9][0-3]" file
# 在file文件中查找包含两个9的行
grep -E "9{2}" file
# 查找大于两个9的行
grep -E "9{2,}" file
# 查找file文件中的空行
grep -E "^$" file
# 查找包括?的行
grep "?" file
# 查找文件中以w开头的行
grep -E "^w" file
# 查找文件中不是以w开头的行
grep -E "^[^w]" file
sed
sed 简介
sed 是一种非交互式的行编辑器。
地址(定址):用于决定对哪些行进行编辑。地址形式可以是数字、正则表达式或二者的组合。如果没有指定地址,默认处理输入文件中的所有行。
sed 工作过程
sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。
sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间(PATTERN SPACE)或临时缓冲。它在模式空间中进行处理,完成处理后,把缓冲区的内容输出。接着处理下一行,直到文件末尾。
如图 1: sed 处理过程。
sed 命令格式
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
--follow-symlinks
follow symlinks when processing in place
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
-c, --copy
use copy instead of rename when shuffling files in -i mode
-b, --binary
does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
open files in binary mode (CR+LFs are not treated specially))
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
-z, --null-data
separate lines by NUL characters
--help
display this help and exit
--version
output version information and exit
sed的常用选项
选项 | 功能说明 |
---|---|
-n | 取消默认的输出 |
-e | 多重编辑,且命令顺序会影响结果 |
-f | 指定一个 sed 脚本文件到命令行执行, |
-r | sed 使用扩展正则 |
-i | 直接修改文档读取的内容,不在屏幕上输出 |
sed 操作命令
sed 操作命令告诉 sed 对指定行进行何种操作,包括打印、删除、修改等
命 令 | 说 明 |
---|---|
a\ | 在当前行后添加一行或多行 |
c | 用新文本修改(替换)当前行中的文本 |
d | 删除行 |
i | 在当前行之前插入文本 |
h | 把模式空间里的内容复制到暂存缓存区(覆盖) |
H | 把模式空间里的内容追加到暂存缓存区 |
g | 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容 |
G | 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面 |
l | 列出非打印字符 |
p | 打印行 |
n | 读入下一输入行,并从下一条命令而不是第一条命令开始处理 |
q | 结束或退出 sed |
r | 从文件中读取输入行 |
! | 对所选行意外的所有行应用命令 |
s | 用一个字符串替换另一个 |
w | 将行写入文件 |
x | 交换暂存缓冲区与模式空间的内容 |
y | 将字符转换为另一字符(不能对正则表达式使用 y 命令) |
替换标志
紧跟在 s 命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠
s | 替换标识 |
---|---|
g | 在行内进行全局替换 |
i | 忽略大小写 |
sed 的正则表达式
基本元字符: ^
,$
,.
,*
,[]
,[^]
,\{\}
,\<
,\>
,\(\)
,&
元字符 | 功 能 | 示 例 | 示例的匹配对象 |
---|---|---|---|
^ | 行首定位符 | /^love/ | 匹配所有以 love 开头的行 |
$ | 行尾定位符 | /love$/ | 匹配所有以 love 结尾的行 |
. | 匹配除换行外的单 个字符 | /l..e/ | 匹配包含字符 l后跟两个任意字符、再跟字母 e 的行 |
* | 匹配零个或多个前 导字符 | /*love/ | 匹配在零个或多个空格紧跟着模式 love 的行 |
[] | 匹配指定字符组内 任一字符 | /[Ll]ove/ | 匹配包含 love 和 Love 的行 |
[^] | 匹配不在指定字符 组内任一字符 | /[^A-KM-Z]ove/ |
匹配包含 ove,但 ove 之前的那 个字符不在 A 至 K 或 M 至 Z 间 的行 |
\(..\) |
保存已匹配的字符 | ||
& | 保存查找串以便在 替换串中引用 | s/love/**&**/ |
符号&代表查找串。字符串 love 将替换前后各加了两个** 的引 用,即 love 变成**love** |
\< |
词首定位符 | /<love/ | 匹配包含以 love 开头的单词的 行 |
\> |
词尾定位符 | /love>/ | 匹配包含以 love 结尾的单词的 行 |
x\{m\} |
连续 m 个 x | /o{5}/ | 匹配出现连续 5 个字母 o的行 |
x\{m,\} |
至少 m 个 x | /o{5,}/ | 匹配出现至少 5 个连续的 o 的行 |
x\{m,n\} |
至少 m 个 x,但不 超过 n 个 x | /o{5,10}/ | 匹配出现 5~10 个连续的 o 的行 |
扩展元字符
带-r
选项即可使用扩展元字符
sed --help|grep '\-r'
-r, --regexp-extended
扩展元字符 +
,?
,{}
,|
,()
sed使用实例
删除: d 命令
命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示。
sed -r '3d' datafile # 删除第3行,其余各行被打印。
sed -r '3{d;}' datafile # 删除第3行,其余各行被打印。
sed -r '3{d}' datafile # 删除第3行,其余各行被打印。
sed -r '3,$d' datafile # 删除从第三行到最后一行内容,其余各行被打印。
sed -r '$d' datafile # 删除最后一行内容,其余各行被打印。
sed -r '/north/d' datafile # 所有包含模式 north 的行都被动删除,其余行被打印。
替换: s 命令
命令 s 是替换命令。替换和取代文件中的文本可以通过 sed 中的 s 来实现, s 后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换的文本。可以通过 g 标志对行进行全局替换
说明:紧跟在 s 命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符,反斜线除外),只要紧跟在 s 命令,就成了新的串分隔符。
sed 's/west/north/g' datafile # 替换每行中west为north
sed -n 's/^west/north/p' datafile # 选线-n 与命令行末尾的标志 p 结合,告诉 sed 只打印发生替换的那些行;也就是说,如果只有在行首找到 west 并替换成 north 时才会打印此行。
sed 's/[0-9][0-9]$/&.5/' datafile # 所有以 2 位数结尾的行后面都被加上.5
sed -n 's/Hemenway/Jones/gp' datafile # 文件中出现的所有的 Hemenway 都被替换为 Jones,只有发生变化的行才会打印出来。选项-n 与命令 p 的组合取消了默认的输出。标志 g 的含义是表示在行内全局替换。
sed 's/\(Mar\)got/\1linanne/g' datafile # 包含在圆括号里的模式 Mar 作为标签 1 保存在特定的寄存器中。替换串可以通过\1 来引用它。则 Margot 被替换为 Marlinanne
sed -r 's/(Mar)got/\1linanne/g' datafile # 同上
sed 's#3#88#g' datafile # 替换每行中3为88
指定行的范围:逗号
行的范围从文件中的一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10),正则表达式(例如/Dick/和/Joe/),或者两者的结合(例如/north/,$)范围是闭合的——包含开始条件的行,结束条件的行,以及两者之间的行。如果结束条件无法满足,就会一直操作到文件结尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。
sed -n '/west/,/east/p' datafile # 打印模式匹配 west 与 east或文件的末尾(east未匹配到)之间所有的行
sed -n '5,/northeast/p' datafile # 打印从第5行开始到第一个匹配northeast行之间的所有行
sed '/west/,/east/s/$/**VACA**/' datafile # 修改从模式 wast 和 east 之间的所有行,将各行的行尾($)替换为字符串**VACA**。换行符被移到新的字符串后面。
多重编辑: e 命令
-e 命令是编辑命令,用于 sed 执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓存区的行上。
sed -r -e '1,3d' -e 's/Hemenway/Jones/' datafile #
sed -r '1,3d;s/Hemenway/Jones/' datafile #
说明:选项-e 用于进行多重编辑。第一重编辑编辑删除第 1~3 行。第二重编辑将Hemenway 替换为 Jones。因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。例如,如果两条命令都执行的是替换,前一次替换会影响后一次替换。
追加: a 命令
a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。
sed '/^north/a Hello world!' datafile
说明:命令 a 用于追加。字符串 Hello, World!被加在以 north 开头的各行之后。如果要追加的内容超过一行,则除最后一行外,其他各行都必须以反斜杠结尾。
插入: i 命令
i 命令是插入命令,类似于 a 命令,但不是在当前行后增加文本,而是在当前行前面插入新的文本,即刚读入缓存区模式的行。
sed '/eastern/i Hello,world!' datafile
说明:命令 i 是插入命令。如果在某一行匹配到模式 eastern,i 命令就在该行的上方插入
修改: c 命令
c 命令是修改命令。 sed 使用该命令将已有的文本修改成新的文本。旧文本被覆盖。
sed -r '/eastern/c Hello,world!' datafile # 如果模式 eastern被匹配, c 命令将其后的文本替换包含 eastern 的行。
获取下一行: n 命令
n 命令表示下一条命令。 sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 sed 命令都将应用到匹配行,紧接着的下一行上。
sed -r '/eastern/{ n;d }' datafile # 删除匹配到模式 eastern的下一行
sed -r '/eastern/{ n;s/AM/Archie/ }' datafile # 如果在某一行匹配到模式 eastern, n 命令就指示 sed 用下一个输入行用 Archie 替换 AM,然后打印该行,再继续往下处理
转换: y,命令
y 命令表示转换。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a-->A,b-->B,c-->C。
sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' datafile
y 命令把 1~3 行中所有的小写命令字母都转换成了大写。正则表达式元字符对 y 命令不起作用。与替分隔符一样,斜杠可以被替换成其他字符。
退出: q 命令
q 命令表示退出命令。该命令将导致 sed 程序退出,且不再进行其他的处理。
sed '5q' datafile # 打印完第5行之后, q 让 sed 程序退出
sed '/Lewis/{ s/Lewis/Joseph/;q; }' datafile # 在某行匹配到模式 Lewis 时, s 表示先用 Joseph 替换 Lewis,然后 q 命令让 sed 退出
暂存和取用命令: h H g G
- h把模式空间里的内容复制到暂存缓存区(覆盖)
- H把模式空间里的内容追加到暂存缓存区
- g取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
- G取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
sed -r '1h;$G' datafile # 将第1行内容追加到文件最后一行
sed -r '1{h;d};$G' datafile # 将第一行复制到暂存空间并删除,取出暂存空间内容追加到最后一行
sed -r '1h; 2,$g' datafile # 将第一行复制到暂存空间,取出暂存缓冲区里的内容覆盖第2行至最后一行的内容
sed -r '1h; 2,3H; $G' datafile # 将第1至3行复制到暂存空间并追加到最后一行
暂存空间和模式空间互换命令:x
sed -r '4h; 5x; 6G' datafile # 将第4行复制到暂存空间,处理第5行时,交换暂存空间内容和模式空间,第6行追加暂存空间内容(即将第4行内容覆盖第5行,并将原第5行追加到第6行后)
反向选择:!
sed -r '3d' datafile # 删除第3行,打印其余行
sed -r '3!d' datafile # 只输出第3行
综合案例
删除空格、空行、带“ #”开头的注释行
# 删除配置文件中#号注释行
sed -ri '/^[ \t]*#/d' file
# 删除配置文件中//号注释行
sed -ri '\Y^[ \t]*//Yd' file #指定Y分隔符
sed -ri '\#^[ \t]*//#d' file
# 删除空行
sed -ri '/^[ \t]*$/d' file
# 删除#号注释行和空行
sed -ri '/^[ \t]*#/d;/^[ \t]*$/d' file
sed -ri '/^[ \t]*#|/^[ \t]*$/d' file
sed -ri '/^[ \t]*($|#)/d' file
修改文件
# 文件最后一行追加chroot_local_user=YES
sed -ri '$a\chroot_local_user=YES' file
# 模式匹配行首为SELINUX=的行替换为 SELINUX=disabled
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
sed -ri '/UseDNS/cUseDNS no' /etc/ssh/sshd_config
sed -ri '/GSSAPIAuthentication/cGSSAPIAuthentication no' /etc/ssh/sshd_config
给文件添加注释符#号
# 从第2至4行的行首添加#号
sed -r '2,4s/^/#' file
sed -r '2,4s/(.*)/#\1/' file
sed -r '2,4s/.*/#&/' file # &匹配前面查找的内容
sed -r '3,$ s/^#*/#/' file
sed -r '30,50s/^[ \t]*#*/#/' file
sed -r '2,8s/^[ \t#]*/#/' file
使用外部变量
var1=11111
sed -ri "3a$var1" file # 第3行后追加变量var1的内容
sed -ri 3a$var1 file # 第3行后追加变量var1的内容
sed -ri '$a\'"$var1" file # 最后一行后追加变量var1的内容
sed -ri "\$a$var1" file # 最后一行后追加变量var1的内容
文件内容行倒序输出
sed -r '1!G; $!h; $!d' file
sed -r '1!G;h;$!d' file
1!G
:表示第一行不执行G命令,其它行执行G命令(取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面)
$!d
:最后一行不删除
-
P 代表模式空间
-
H 代表暂存缓冲区
-
绿色 代表模式空间中的数据
-
蓝色 代表暂存缓冲区中的数据
awk
awk简介
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk其实不仅仅是工具软件,还是一种编程语言。
工作原理
-
依次把匹配到的行,使用awk工具进行编辑
-
$0
表示整行,$1
代表第一个…,$NF
代表最后一个 -
pattern: 通过模式匹配对应的字段过滤行
-
通过对应的命令 printf 做格式化输出
使用awk
语法
awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
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]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-L [fatal] --lint[=fatal]
-n --non-decimal-data
-N --use-lc-numeric
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-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.
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
常用命令选项
- -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
- -v var=value:赋值一个用户定义变量,将外部变量传递给awk
- -f scripfile:从脚本文件中读取awk命令
awk变量
变量:内置和自定义变量,每个变量前加 -v 命令选项
内置变量
格式
-
FS :输入字段分隔符,默认为空白字符
-
OFS :输出字段分隔符,默认为空白字符
-
RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
-
ORS :输出记录分隔符,输出时用指定符号代替换行符
-
NF :字段数量,(读取的列数)
$NF
引用最后一列,$(NF-1)
引用倒数第2列 -
NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
-
FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
-
ARGC :命令行参数的个数
-
ARGV :数组,保存的是命令行所给定的各参数,查看参数
字段分隔符: FS OFS 默认空格或制表符
记录分隔符:RS ORS 默认换行符
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)