Shell编程之文本过滤笔记

本文介绍正则表达式的元字符及其应用,包括find命令用于查找特定文件,grep命令用于搜索文本,以及awk和sed的基本用法。这些工具对于自动化文件管理和文本处理非常有用。

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

正则表达式
基本元字符及其含义
^ 只匹配行首
$ 只匹配行尾
* 匹配0个或多个此单字符
[] 只匹配[]内的字符。可以是一个单字符,也可以是字符序列。
/ 用来屏蔽一个元字符的特殊含义
. 只匹配任意单字符
pattern/{n/} 只用来匹配前面的pattern出现次数。n为次数
pattern/{n,/} 含义同上,但次数最少为n
pattern/{n,m/} 含义同上,单pattern出现的次数在n与m之间

...x..x..x
....xc....

^d
^..1

trouble$ 以trouble结尾的字符
^ $ 空字符
^.$ 单个字符

/*/.pas 以*.pas结尾的所有字符或文件

[a-z]
[a-z A-Z]
[a-z A-Z 0-9]
[s,S]

A/{2/}B AAB
A/{4,/}B AAAAB,AAAAAAAAB
A/{2,4/}B AAB,AAAB,AAAAB
[0-9]/{3/}/.[0-9]/{3/}/.[0-9]/{3/}/.[0-9]/{3/} 匹配IP地址

find命令
查找具有某些特征文件的命令
遍历大的文件系统时,一般放在后台执行
find pathname -option [-print -exec -ok]

find -name "*.txt" -print 默认查找当前目录
find ./ -name "*.txt" -print
find ./ -name "[A-Z]*" -print
find /etc -name "host*" -print

find . -perm 755 -print 在当前目录查找权限为755的文件

find `pwd` -user domingo -print 在当前目录查找属主是domingo的文件
find / -nouser -print 查找没有属主的文件

find ./ -group domingo -print 查找属组为domingo的文件
find ./ -nogroup -print 查找没有属组的文件

find /var -mtime -5 -print 查找5天内改变的文件
find /var -mtime +3 -print 查找3天前改变的文件

find `pwd` -newer "avg.sh" ! -newer "if.sh" -print 查找比avg.sh要新,比if.sh要新的文件

find /etc -type d -print 查找目录
find /etc -type l -print 查找链接文件

find . -size +1000000c -print 大于1000000字节的文件
find . -size +10 -print 大于10块的文件

find / -name "CON.FILE" -depth -print
先匹配所有的文件,再在子目录中查找

find . -type f -exec ls -l {} /;
查找先,再执行ls -l命令
find . -name "*.log" -mtime +5 -ok rm {} /;
查找5天前的log文件并删除

在使用find命令的-exec选项处理匹配的文件,find命令将所有匹配的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟后,就会出现溢出错误。错误信息通常是"参数列太长"或"参数列溢出"。这就是xargs命令的用处所在,特别是与find命令一起使用。exec会发起多个进程,而xargs不会多个,只有一个。
find ./ -perm -7 -print | xargs chmod o-w
find ./ -type f -print | xargs file

grep是UNIX和LINUX中使用最广泛的命令文件
-c 只输出匹配行的计数
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名
-H 显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-s 不显示不存在或无匹配文本的错误信息
-v 显示不包含匹配文本的所有行

grep "domingo" *.txt
grep "sort it" *
grep -c "2009" myfile
grep -n "2009" myfile
grep -i "jul" myfile
grep -v "2009:12" myfile
grep "2009:22:5[0-9]" myfile
grep "^[^210]" myfile
grep "H*P" myfile
grep "[5-8][6-9][0-3]" myfile
grep "4/{2/}" myfile
grep "4/{2,/}" myfile
grep "4/{2,4/}" myfile
grep "^tiny_mce_markerquot; myfile
grep "/?" myfile
grep "^d" lsout.txt
grep "^[^d]" lsout.txt

grep命令类名
[[:upper:]] [A-Z]
[[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z]
[[:space:]] [空格或tab]
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]
grep "5[[:digit:]][[:digit:]]" myfile

awk
可从文件或字符串中基于指定规则浏览和抽取信息
是一种自解释的编程语言
三种方式调用awk:
命令行方式
awk脚本
awk命令插入一个单独文件
awk脚本由各种操作和模式组成
模式和动作
模式部分决定动作语句何时触发及触发事件。(BEGIN,END)
动作对数据进行处理,放在大括号{}内指明。{print}
分隔符、域和记录
awk执行时,其浏览域标记为$1,$1...。这种方法称为域标识。$0为所有域
注意执行时不要混淆符号$和shell提示符$,是不同的。
awk '{print $0}' score.txt |tee score.out
awk '{print $1 "/t" $4}' score.txt
awk 'BEGIN {print "Name Maths/n-------------"} {print $1 "/t" $4} END {"end-of-report"}' score.txt

awk中的特殊字符:+,?
匹配操作符:~,!~
cat score.txt |awk '$0 ~ /218.25.56.23/'
awk '$0 !~ /218.25.56.23/' score.txt
awk '{if($1=="218.25.56.23") print $0}' score.txt
man awk

sed不与初始化文件打交道,它操作的知识一个拷贝,然后所有的改动如果没有重定向到一个文件将输出到屏幕。
sed是一种重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合。
非交互性文本流编辑器。
-n 不打印
-c 下一命令时编辑命令

sed在文件中查询文本的方式
使用行号,可以是一个简单数字,或是一个行号范围
使用正则表达式
x x为一行号
x,y 表示行号范围从x到y
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
pattern/,x 在给定行号上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
x,y! 查询不包含指定行号x和y的行

基本sed编辑命令
p 打印匹配行
= 显示文件行号
a/ 在定位行号后附加新文本信息
i/ 在定位行号后插入新文本信息
d 删除定位行
c/ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配后退出或立即退出
l 显示八进制ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符

sed '2p' score.txt
sed -n '2p' score.txt
sed -n '1,4p' myfile.txt
sed -n '/los/p' myfile.txt
sed -n '4,/los/p' myfile.txt
sed -n '/^$/=' myfile.txt
sed -n -e '/^$/p' -e '/^$/=' myfile.txt
sed -n '/chinaitlab/a/shenzhen' myfile.txt
sed -n '/chinaitlab/i/shenzhen' myfile.txt
sed -n '/chinaitlab/c/chinaitlab shenzhen' myfile.txt
sed '1,2d' myfile.txt
sed 's/chinaitlab/chinaitlab shenzhen/g' myfile.txt
sed -n 's/chinaitlab/& hello /p' myfile.txt
sed -n 's/chinaitlab/hello &/p' myfile.txt
sed 'l r ctrl.txt' myfile.txt
sed '/china/q' myfile.txt
sed -n '/china/l' myfile.txt
info sed或man sed

合并与分割
sort [options] files
许多不同的域按不同的列顺序分类
-c 测试文件是否已经分类
-m 合并两个分类文件
-u 删除所有复制行
-o 存储sort结果的输出文件名
-t 域分隔符;用非空格或tab分隔域
+n n为域号,使用此域号开始分类
n 指定分类是域上的数字分类项
-r 比较求逆
man sort

sort -c myfile
sort -u myfile
sort -r myfile
sort -t "/" +2 myfile
sort -t "/" +2n myfile

uniq [option] files
从一个文本文件中去除或禁止重复行
-u 只显示不重复行
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数
-f n n为数字,前n个域被忽略
man uniq

uniq -c myfile.txt
uniq -d myfile.txt
uniq -f 2 myfile.txt
uniq -d myfile.txt

join
split用来将大文件分割成小文件
cat ls_out.txt |wc -l
split -10 ls_out.txt split
cut
paste

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值