Linux中常用的文本处理工具学习

Linux中有很多骚操作的文本处理命令工具,可以快速有效地完成一些文件的筛选工作,学习一下

awk

简介

awk是Linux下一款编程及数据操作语言,经常用于数据格式化输出,也就是将数据按照我们想要的方式来显示,并且可以做一些基本的统计工作。

它的运行模式是先进行预处理,然后逐行处理,最后再进行一次最终处理。一般情况下使用较多的是逐行处理某些满足条件的行,比如我们想输出某某列,通过指定分隔符我们很容易对列进行操作。

除此之外我们还可以使用预处理去预定义一些变量,通过逐行处理来修改变量,最后通过最终处理来打印变量,这种方式就可以做一些基本的统计工作。

使用

Usage: awk [POSIX or GNU style options] -f progfile [–] file …
Usage: awk [POSIX or GNU style options] [–] ‘program’ file …

使用program的例子:

1
awk 'BEGIN{ commands } /pattern/ {commands} END{ commands }' file
  • BEGIN{ commands }:开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况下,我们可以在开始块中初始化一些变量。
    注意:开始块部分是可选的,你的程序可以没有开始块部分。

  • /pattern/ {commands}:pattern 部分匹配该行内容成功后,才会执行 commands 的内容。

  • END{ commands }:结束块是在程序结束时执行的代码。
    注意:结束块部分也是可选的

基本用法

1
2
3
4
POSIX options:          GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
选项 含义
-f –f progfile,从program脚本文件中读取awk命令
-F -F ‘ ‘ 或者 -F ‘pattern’,使用该选项可以改变列字段的分隔符
-v -v var=0 赋值一个用户定义的变量val值为0

常用系统变量

变量 描述(常用的,还有很多其他的没怎么常用)
$n $1 当前记录的第1个字段的内容
$0 整行数据的内容
FS 字段分隔符 (默认是空格)
OFS 输出字段的分隔符(默认是空格)
RS 行分隔符(默认以\n作为一行的结尾),单行分割成多行用到
NR 行号,从1开始,多文件时候也是连续接着计数
FNR 各文件分别计数的行号,多文件的时候会和NR不同,它会重新计数
NF 一行中字段数量,最后一个字段内容可以用$NF取出
ARGC 命令行参数的数目
ARGV 包含命令行参数的数组,第一个参数是命令 awk

循环分支和数组

语句之间使用分号分隔,循环使用for循环,类似于其他编程语言,分支使用的if:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(condition)
{
action 1;
action 2;
...
}
else if
{
action 1;
action 2;
...
}
else
{
action 1;
action 2;
...
}
1
2
3
4
5
6
7
8
9
for(变量初始值;结束条件;操作符)
{
action
}

for(变量 in 数组)
{
action
}

示例:

1
2
{sum=0;for(c=2;c<NF;c++)  sum+=$c;average[$1]=sum/(NF-1)} END{for(user in average) print user,average[user]}
BEGIN{ last=192.168.1.1 } {if (last!= $1) print($1); last=$1;}

一些函数

length:awk -F: ‘length($1) >6 {print $1}’ /etc/passwd 统计长度
split: 将一段字符串分割符号,对文本进行分割,存放到数组里,使用for循环遍历读取数组里的内容
substr: awk -F: ‘{if (length($1)>6) print substr($1,1,6)}’ /etc/passwd
substr($1,1,6) 类似于切片操作 对$1 第一个开始 切6个
system: 将linux命令放在awk里面

grep

详见:grep的使用

sed

简介

sed是一种流编辑器,它一次处理一行内容。处理时,把它处理的行存储在临时缓冲区中,称为”模式空间“,接着用sed命令处理缓冲区间中的内容,处理完后,把缓冲区中的内容送往屏幕。接着处理下一行,这样不断重复直到文件末尾。

使用

sed [OPTION]… {script-only-if-no-other-script} [input-file]…

1
2
3
4
5
6
7
8
9
10
11
12
-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]
-E, -r, --regexp-extended
use extended regular expressions in the script
(for portability use POSIX -E).
  • -n 表示安静模式,不输出不匹配的行
  • -r 识别扩展正则
  • -i 直接对原文件进行编辑
  • -e 识别多个命令操作

sed s替换文本

脚本部分格式:[address]s/pattern/replacement/flags

flags 标记 功能
n 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file 将缓冲区中的内容写到指定的 file 文件中;
& 用正则表达式匹配的内容进行替换;
\n 匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。
\ 转义(转义替换部分包含:&、\ 等)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ cat 10.txt
Line 1 192.168.1.1
Line 2 192.168.1.15
Line 3 192.168.1.14
Line 4 192.168.1.17
Line 5 192.168.1.13
Line 6 192.168.1.1
Line 7 192.168.1.12
Line 8 192.168.1.11
Line 9 192.168.1.1
Line 10 192.168.1.18xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ sed 's/Line/line/' 10.txt
line 1 192.168.1.1
line 2 192.168.1.15
line 3 192.168.1.14
line 4 192.168.1.17
line 5 192.168.1.13
line 6 192.168.1.1
line 7 192.168.1.12
line 8 192.168.1.11
line 9 192.168.1.1
line 10 192.168.1.18

sed d 删除某行文本

脚本基本格式:[address]d

删除1到2行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ cat 10.txt
Line 1 192.168.1.1
Line 2 192.168.1.15
Line 3 192.168.1.14
Line 4 192.168.1.17
Line 5 192.168.1.13
Line 6 192.168.1.1
Line 7 192.168.1.12
Line 8 192.168.1.11
Line 9 192.168.1.1
Line 10 192.168.1.18
xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ sed '1,2d' 10.txt
Line 3 192.168.1.14
Line 4 192.168.1.17
Line 5 192.168.1.13
Line 6 192.168.1.1
Line 7 192.168.1.12
Line 8 192.168.1.11
Line 9 192.168.1.1
Line 10 192.168.1.18

sed a(i)插入

a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行

脚本基本格式:[address]a(或 i)\新文本内容

1
2
3
4
5
6
7
8
9
10
11
12
xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ sed '1a\Line 1.1 11111' 10.txt
Line 1 192.168.1.1
Line 1.1 11111
Line 2 192.168.1.15
Line 3 192.168.1.14
Line 4 192.168.1.17
Line 5 192.168.1.13
Line 6 192.168.1.1
Line 7 192.168.1.12
Line 8 192.168.1.11
Line 9 192.168.1.1
Line 10 192.168.1.18

sed c替换

脚本基本格式:[address]c\用于替换的新文本

1
2
3
4
5
6
7
8
9
10
11
xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ sed '1c\Line 1.1 11111' 10.txt
Line 1.1 11111
Line 2 192.168.1.15
Line 3 192.168.1.14
Line 4 192.168.1.17
Line 5 192.168.1.13
Line 6 192.168.1.1
Line 7 192.168.1.12
Line 8 192.168.1.11
Line 9 192.168.1.1
Line 10 192.168.1.18

sed y转换

基本格式:[address]y/inchars/outchars/

转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符…这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。

1
2
3
4
5
6
7
8
9
10
11
xin@LAPTOP-MRV29Q6U:/mnt/c/Users/YIPING/Desktop$ sed 'y/123/079/' 10.txt
Line 0 097.068.0.0
Line 7 097.068.0.05
Line 9 097.068.0.04
Line 4 097.068.0.07
Line 5 097.068.0.09
Line 6 097.068.0.0
Line 7 097.068.0.07
Line 8 097.068.0.00
Line 9 097.068.0.0
Line 00 097.068.0.08

sed w 脚本命令

w 命令用来将文本中指定行的内容写入文件中,此命令的基本格式如下:

[address]w filename

sed r 脚本命令

r 命令用于将一个独立文件的数据插入到当前数据流的指定位置,该命令的基本格式为:

[address]r filename

sort

简介

将文件进行排序,并将结果标准输出

使用

sort [OPTION]… [FILE]…

选项 说明
-n 依照数值大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列

uniq

简介

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

uniq 可检查文本文件中重复出现的行列。

使用

1
uniq [-cdui][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
选项 说明
-c 或–count ,在每列旁边显示该行重复出现的次数。
-d 或–repeated ,仅显示重复出现的行列。
-u 或–unique,仅显示出一次的行列。
-i 比较时忽略大小写

需要注意的是,当重复的行并不相邻时,uniq 命令是不起作用的,因此该命令一般配合sort使用。

比如统计各行在文件中出现的次数:

1
2
3
4
5
6
7
8
9
10
sort 10.txt | uniq -c
2 Line 1 192.168.1.1
1 Line 10 192.168.1.18
1 Line 2 192.168.1.15
1 Line 3 192.168.1.14
1 Line 4 192.168.1.17
1 Line 5 192.168.1.13
1 Line 7 192.168.1.12
1 Line 8 192.168.1.11
1 Line 9 192.168.1.1

找出重复行:

1
2
sort 10.txt | uniq -d
Line 1 192.168.1.1

tr、col等

详见Linux常用命令学习–文档编辑


Linux中常用的文本处理工具学习
https://chujian521.github.io/blog/2022/11/21/Linux中常用的文本处理工具学习/
作者
Encounter
发布于
2022年11月21日
许可协议