【NLP工具】和文本处理相关的Linux命令小结

本文介绍了cat、grep、sed、awk及paste等命令的功能和使用方法,包括显示文件内容、文本查找、文本内容处理、文档拼接及文档内容比对等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. cat/head/tail

显示文件开头或结尾的若干行

cat -n 5 1.txt   # 显示前5行
cat -n -5 1.txt   # 显示非前5行的其它行

head -n 5 1.txt   # 显示前5行

tail -n 5 1.txt   # 显示末尾5行
2. grep

用于文本内容查找,可在一个或多个文件中搜索并返回符合指定字符串模板的行。

grep的命令行格式为grep [选项] pattern filename,其中pattern即是字符串模板(支持正则表达式),filename是路径或者文件名(支持通配符)

常见选项包括:
(1)通用选项

-E: 扩展正则表达式进行模板匹配
-F: 固定字符串进行模板匹配
-G: 默认值,采用普通的表示法进行模板匹配
-R: 递归文件查找

(2)匹配控制选项

-e: 指定pattern
-f 指定文件,同样支持正则匹配
-i: 搜索时忽略大小写
-v:  匹配取反,即选择没被匹配到的内容
-w: 整词匹配,单词的两边必须是非字符符号(即不能是字母数字或下划线)
-x: 必须整行完全匹配

(3)输出控制选项

-c: 仅仅输出各文件中匹配行数的计数
-l: 仅输出文件名
-L: 仅输出不符合的文件名
-m num: 当匹配的行数达到num时,停止搜索
-o: 仅输出匹配的字符串,匹配行中的其他内容不会输出
-n: 在输出的匹配行内容前补充显示行号
-A n: 除了匹配行,还显示下文的n行(after)
-B n: 除了匹配行,还显示上文的n行(before)
-C n: 除了匹配行,还显示上下文的n行(center)

grep常作为下游命令作用于管道中,如

# 1. 查找进程
ps -ef | grep python

# 2. 查找进程数
ps -ef | grep -c python

# 3. 从一个文件中找到关键词,再在另一个文件中搜索
cat 1.txt | grep -fn 2.txt
3. sed

sed命令用于逐行处理文件,默认情况下处理后的结果自动保存于临时缓存区(并不会影响原文件),并将处理完的行依次输出到屏幕。其可以视为文本内容逐行的加载——>处理——>输出的批处理流水线。

sed的命令行格式为sed [选项] ‘command’ filename,其中'comand'即为要处理的命令。

常见选项包括:
(1)行定位
用于定位所要处理的行范围,默认会处理所有行,此外可以采用下列定位方式:

addr1    # 指定某行, 可以采用数字形式,或者正则匹配模式,下同
addr1,addr2    # addr1和addr2之间所有行(包括addr1和addr2)
addr1,+N   # 从addr1这行起,一直到往下的N行(共计N+1行)
$ # 最后一行
addr1~N    # 从addr1起,N为步长的所有行
/REGEXP/   # 用正则匹配行

这些行命令写在command里面。

(2)编辑和输出控制选项

-n: 默认会输出所有STDIN的行,若有该选项则会仅输出(无论是输出得到屏幕还是文件)被sed处理的行
-e: 多重编辑,且命令顺序会影响结果
-f: 指定一个sed脚本文件到命令行执行
-r: sed使用正则拓展
-i:直接修改文档读取的内容,不在屏幕上输出

(3)command命令

a\: 在当前行后添加一行或多行
c\: 用新文本修改(替换)当前行中的文本
d: 删除行,此时当前模式缓存区的输入行会被删除,不被显示
i\: 在当前行之前插入文本
h: 把模式空间里的内容复制到暂存缓存区
H: 把模式空间里的内容追加到暂存缓存区
g: 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
G: 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
l: 列出非打印字符
p: 打印行
n: 读入下一输入行,并从下一条命令而不是第一条命令开始处理
q: 结束或退出sed
r: 从文件中读取输入行
!: 对所选行以外的所有行应用命令, 接在定位命令之后
s: 用一个字符串替换另一个
w: 将行写入文件
x: 交换暂存缓冲区与模式空间的内容
y: 替换, 注意正则表达式元字符在y中不起作用
  • 典型实例
# 1. p命令:打印满足条件的所在行
sed -n '/REG/p' 1.txt

# 2. d命令:删除满足条件的所在行
sed '3,$d'  1.txt   # 删除第三行到最后一行
sed '/REG/d' 1.txt    # 删除匹配行

# 3. s命令:将匹配文本进行替换
sed -n 's/REG1/string2/gp'   1.txt  # g表示行内全局替换,否则只替换改行第一个

sed 's/\(group1\)REG/\1string1/p 1.txt'  # 正则,组

# 4. 整体添加备注符号
sed 's/^/#' 1.txt

# 5. ,控制范围打印
sed -n '/REG1/,/REG2/'

# 6. 在控制范围内进行替换
sed '/REG1/,/REG2/s/^/#/' 1.txt

# 7. 多编辑命令串联,注意先后影响
sed -e '1,3d' -e 's/REG/string/'  1.txt

# 8. a命令:在当前匹配后添加
sed '/REG/a string1' 1.txt

# 9. i命令:在当前匹配前添加
sed '/REG/i string1' 1.txt

# 10. c命令:行文本替换
sed '/REG/c string1' 1.txt

# 11. n命令:获取匹配行的下一行进行操作
sed '/REG1/{n;s/REG2/string1/;}' 1.txt # 所有匹配REG1的下一行,将其中的REG2换成string1

# 12. y命令:依次替换
sed '5,$y/abc/ABC' 1.txt

# 13 q命令: 退出
sed '/REG1/{s/REG2/string1;q;}'  # 匹配并替换后退出

# 14. 去掉文本前空格
sed 's/^[ ]*//' 1.txt

# 15 只查看若干行数据
sed -n '1,5p;5q'   # 看1~5行
sed -n '5p;' # 只看第5行
4. awk

awk的命令行格式为awk [选项参数] ‘{pattern+action}‘ {filename}。其中'{pattern+action}表示按照patten从文本中寻找内容,然后采用action执行命令。花括号{}不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

一般awk是以文件的一行为处理单位的,这点与sed类似。但awk命令引入了字段分隔符的概念(见下图),从而可以对行内的各字段列进行处理,所以特别适用于处理结构化的文本数据。

在这里插入图片描述
上图中中的$1, FS等均为awk中的内置变量,这里罗列出了awk中最常用的内置变量:

$0    # 当前记录行
$1~$N    # 当前记录的第N个字段
FS       # feild seprator,字段分隔符
RS    # record seprator, 记录分隔符
NF    # number of field, 当前记录中字段总数
NR    # number of record, 当前已读的总行数,即当前行行号
OFS  # output field seprator, 输出字段分隔符,默认空格
ORS  # output recored separotr, 输出记录行分隔符,默认换行符

awk中变量的定义和赋值一般有如下三种方式,一面以字段分隔符的定义为例进行介绍:
方式一:通过控制参数
awk默认以空格为每行字段的分隔符,通过指定-F参数(相当于内置变量FS)可以设定具体的分割符,如:

awk -F ':'   # 以:为分隔符
awk [[:space:]+]  # 以一个或多个空格为分隔符
awk -F [" ":]+  # 以一个或多个空格或:分隔

方式二:通过控制参数
在函数命令中直接设置,如

awk 'FS==":"{print $1}' 1.txt

当选择用NF和NR等进行行条件过滤的时候,建议直接采用这种方式:

awk 'NR==2{print $1}' 1.txt  # 只查看第2行
awk 'NF==8{print $2}' 1.txt  # 只查看有8个字段的行

方式三:在BEGIN模块中定义
通常,对于每个输入行,awk都会执行每个脚本代码块一次。然而,在某些情况,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码,同时在所有行都处理完后再执行后处理代码。因此 awk中引入了BEGIN和END模块,分别用来进行初始化和后处理功能。在定义分隔符的实例里,可使用

awk 'BEGIN {FS=":"}{print $1}' 1.txt

awk的整体语法结构类似于C语言,具有完整的if条件、循环和数组等语法,同时支持通过-f参数直接调用awk脚本。

作为文本处理工具,awk也内置了众多字符串函数:

5. 两个文本文档的交互处理
5.1 拼接两个文档
  • paste命令: 列合并
paste 1.txt 2.txt
paste -d '+'  1.txt 2.txt  #以+为分隔符
5.2 文档内容比对合并
  • sort命令:对行进行排序并拼接
sort file1 file2 # 排序两个文件的内容 
sort file1 file2 | uniq # 取出两个文件的并集(重复的行只保留一份) 
sort file1 file2 | uniq -u  # 删除交集,留下其他的行 
sort file1 file2 | uniq -d # 取出两个文件的交集(只留下同时存在于两个文件中的文件) 
  • comm命令:对比删除
comm -1 file1 file2  # 比较两个文件的内容只删除 'file1' 所包含的内容 
comm -2 file1 file2  # 比较两个文件的内容只删除 'file2' 所包含的内容 
comm -3 file1 file2 # 比较两个文件的内容只删除两个文件共有的部分 

【未完待续…】

【Reference】

  1. grep命令使用大全
  2. sed命令使用大全
  3. awk介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值