grep

man文档链接

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

egrep = grep -E:扩展的正则表达式 (除了< , > , \b 使用其他正则都可以去掉)

用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

格式

1
2
3
grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]
  • -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -c:统计匹配的行数
  • -e :实现多个选项间的逻辑or 关系
  • -E:扩展的正则表达式
  • -f FILE:从FILE获取PATTERN匹配
  • -F :相当于fgrep
  • -i --ignore-case #忽略字符大小写的差别。
  • -n:显示匹配的行号
  • -o:仅显示匹配到的字符串
  • -q: 静默模式,不输出任何信息
  • -s:不显示错误信息。
  • -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
  • -w :匹配 整个单词

示例

sed

man文档链接

sed 是一种流编辑器,它一次处理一内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i

功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作

格式

1
2
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed [options] '[地址定界] command' file(s)

选项

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • **-e:**多点编辑,对每行处理时,可以有多个Script
  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
  • -r:支持扩展的正则表达式
  • -i:直接将处理的结果写入文件
  • -i.bak:在将处理的结果写入文件之前备份一份

地址定界

  • 不给地址:对全文进行处理
  • 单地址:
    • #: 指定的行
    • /pattern/:被此处模式所能够匹配到的每一行
  • 地址范围:
    • #,#
    • #,+#
    • /pat1/,/pat2/
    • #,/pat1/
  • ~:步进
    • sed -n ‘1~2p’ 只打印奇数行 (1~2 从第1行,一次加2行)
    • sed -n ‘2~2p’ 只打印偶数行

编辑命令command

  • d:删除模式空间匹配的行,并立即启用下一轮循环
  • p:打印当前模式空间内容,追加到默认输出之后
  • a:在指定行后面追加文本,支持使用\n实现多行追加
  • i:在行前面插入文本,支持使用\n实现多行追加
  • c替换行为单行或多行文本,支持使用\n实现多行追加
  • w:保存模式匹配的行至指定文件
  • r:读取指定文件的文本至模式空间中匹配到的行后
  • =:为模式空间中的行打印行号
  • !:模式空间中匹配行取反处理
  • s///:查找替换,支持使用其它分隔符,如:s@@@,s###
    • 加g表示行内全局替换;
    • 在替换时,可以加一下命令,实现大小写转换
    • \l:把下个字符转换成小写。
    • \L:把replacement字母转换成小写,直到\U或\E出现。
    • \u:把下个字符转换成大写。
    • \U:把replacement字母转换成大写,直到\L或\E出现。
    • \E:停止以\L或\U开始的大小写转换

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@along ~]``# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD
[root@along ~]``# sed -n "/aaa/p" demo #-n不显示没匹配的行
aaa
[root@along ~]``# sed -e "s/a/A/" -e "s/b/B/" demo #-e多点编辑
Aaa
Bbbb
AABBCCDD
[root@along ~]``# cat sedscript.txt
s``/A/a/g
[root@along ~]``# sed -f sedscript.txt demo #-f使用文件处理
aaa
bbbb
aaBBCCDD
[root@along ~]``# sed -i.bak "s/a/A/g" demo #-i直接对文件进行处理
[root@along ~]``# cat demo
AAA
bbbb
AABBCCDD
[root@along ~]``# cat demo.bak
aaa
bbbb
AABBCCDD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@along ~]``# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]``# sed -n "p" demo #不指定行,打印全文
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "2s/b/B/g" demo #替换第2行的b->B
aaa
BBBB
AABBCCDD
[root@along ~]``# sed -n "/aaa/p" demo
aaa
[root@along ~]``# sed -n "1,2p" demo #打印1-2行
aaa
bbbb
[root@along ~]``# sed -n "/aaa/,/DD/p" demo
aaa
bbbb
AABBCCDD
[root@along ~]``# sed -n "2,/DD/p" demo
bbbb
AABBCCDD
[root@along ~]``# sed "1~2s/[aA]/E/g" demo #将奇数行的a或A替换为E
EEE
bbbb
EEBBCCDD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@along ~]``# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "2d" demo #删除第2行
aaa
AABBCCDD
[root@along ~]``# sed -n "2p" demo #打印第2行
bbbb
[root@along ~]``# sed "2a123" demo #在第2行后加123
aaa
bbbb
123
AABBCCDD
[root@along ~]``# sed "1i123" demo #在第1行前加123
123
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "3c123\n456" demo #替换第3行内容
aaa
bbbb
123
456
[root@along ~]``# sed -n "3w/root/demo3" demo #保存第3行的内容到demo3文件中
[root@along ~]``# cat demo3
AABBCCDD
[root@along ~]``# sed "1r/root/demo3" demo #读取demo3的内容到第1行后
aaa
AABBCCDD
bbbb
AABBCCDD
[root@along ~]``# sed -n "=" demo #=打印行号
1
2
3
[root@along ~]``# sed -n '2!p' demo #打印除了第2行的内容
aaa
AABBCCDD
[root@along ~]``# sed 's@[a-z]@\u&@g' demo #将全文的小写字母替换为大写字母
AAA
BBBB
AABBCCDD

awk

man文档链接

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

语法

1
2
3
awk` `[options] ``'program'` `var=value ``file``…
awk` `[options] -f programfile var=value ``file``…
awk` `[options] ``'BEGIN{ action;… } pattern{ action;… } END{ action;… }'` `file` `...
  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk
  • -f scripfile:从脚本文件中读取awk命令

awk变量

  • FS输入字段分隔符默认为空白字符
  • OFS输出字段分隔符,默认为空白字符
  • RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
  • ORS :输出记录分隔符,输出时用指定符号代替换行符
  • NF :字段数量,共有多少字段, NF引用最后一列,NF引用最后一列,(NF-1)引用倒数第2列
  • NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
  • FILENAME :当前文件名
  • ARGC :命令行参数的个数
  • ARGV :数组,保存的是命令行所给定的各参数,查看参数

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[root@along ~]``# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@along ~]``# awk -v FS=':' '{print $1,$2}' awkdemo #FS指定输入分隔符
hello world
linux redhat
along love
[root@along ~]``# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo #OFS指定输出分隔符
hello---world
linux---redhat
along---love
[root@along ~]``# awk -v RS=':' '{print $1,$2}' awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
[root@along ~]``# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo
hello world---linux redhat---along love---
[root@along ~]``# awk -F: '{print NF}' awkdemo
2
4
3
[root@along ~]``# awk -F: '{print $(NF-1)}' awkdemo #显示倒数第2列
hello
lalala
love
[root@along ~]``# awk '{print NR}' awkdemo awkdemo1
1
2
3
4
5
[root@along ~]``# awk END'{print NR}' awkdemo awkdemo1
5
[root@along ~]``# awk '{print FNR}' awkdemo awkdemo1
1
2
3
1
2
[root@along ~]``# awk '{print FILENAME}' awkdemo
awkdemo
awkdemo
awkdemo
[root@along ~]``# awk 'BEGIN {print ARGC}' awkdemo awkdemo1
3
[root@along ~]``# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1
awk
[root@along ~]``# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1
awkdemo
[root@along ~]``# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1
awkdemo1