Linux下的文本处理工具

本文详细介绍了Linux中grep、sed和awk命令的使用方法,包括正则表达式匹配、行过滤、内容替换、字符操作等,并提供了多个实战例子,如查找系统中可su切换的用户、修改Apache端口等。通过这些命令,可以高效地对文本文件进行处理和分析。

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

## 1.grep [Globally search a Regular Expression and Print]##
grep               支持基本正则表达式
grep -E = egrep        基本和扩展的正则表达式都支持

##grep 格式##
grep 匹配条件 处理文件

grep root passwd        #过滤root关键字
gerp -E "root|nologin" passwd
gerp -e root -e nologin passwd  ##搜索含有root和nologin的行
grep -i root passwd         ##后略大小写
grep -E "\<root" passwd        ##root字符之前不能有字符
grep -E "root\>" passwd        ##root字符之后不能有字符
grep -数字            ##显示过滤行以及上面几行和下面几行
grep -n             ##显示匹配的行所在行号
grep -A                ##显示过滤行以及下面几行
grep -B                ##显示过滤行以及上面几行
grep -v                ##反向过滤

grep字符数量匹配规则
^westos                ##以westos开头
westos$                ##以westos结尾
w....s                ##w开头s结尾中间4个任意字符
.....s                ##s结尾前面5个任意字符
*                ##字符出现任意
?                ##0到1次
+                ##1次到任意次
{n}                ##n次
{m,n}                ##m到n次
{0,n}                ##0-n次
{,n}                ##0-n次
{m,}                ##最少m次
(lee){2}            ##lee字符串出现2次

练习脚本:
请显示系统中能被su命令切换的用户名称


grep -E "bash$|sh$" /etc/passwd | cut -d : -f 1

#### 2.sed ######
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件

 

-n 不输出模式空间的内容之输出被处理的内容
-e 多条规则

对字符的处理
p                ##显示
sed -n  5p westos        ##显示第五行
sed -n  3,5p westos        ##显示3到5行
sed -ne  '3p;5p' westos        ##显示3和5行
sed -ne 1,5p westos        ##1-5行
sed -ne '5,$p'    westos        ##5到最后以行
sed -n '/^#/p' fstab        ##显示以#开头的行    

 

 

d                ##删除
sed 5d    westos            ##删除第五行
sed '/^#/d'    fstab        ##把#开头的行删除
sed '/^UUID/!d' fstab        ##除了UUID以外的行都删除
sed -e '5,$d' westos        ##删除5到最后一行

 

 

 

 

 

a                ##添加
sed -e '$a hello world' fstab    最后一行加hello world
sed -e '$a hello\nworld' fstab    最后两行加hello
                     world
sed -e '/^#/a hello world' fstab    以#开头的后面加hello world
sed -e '2a hello world' fstab    第二行后 加和hello world

c                ##替换
sed -e '/^#/c hello world' fstab
sed '5c hello world' westos

 


w                ##把符合的行写到指定文件中
sed '/^UUID/w westofile' westos    ##把westos中UUID开头的行写入westosfile中

i                ##插入
sed '5ihello westos' westos
   与a添加的区别 i插入到制定内容之上
        a添加到制定内容之下    


r                ##整合文件
sed '5r haha' westos  把haha文件内容整合到weatos文件内容第5行之下
sed '/hello/r haha' westos  把haha文件内容整合到weatos文件内容hello之下

 

 

sed 字符替换
g表示所有关键字的列如果不加默认替换每行出现的第一列

sed 's/:/###/g' westos      全部:改成###
sed 's/:/###/' westos
sed 's/:/###/g' westos
sed '1,5s/:/###/g' westos   第一行和第五行:改成###
sed '$s/:/###/g' westos     最后一行:改成###
sed '1s/:/###/g;5s/:/###/g' westos
sed '/lp/,/shutdown/s/:/###/g' westos  lp和shutdown之间的:改为###
sed 's/\//####/g' westos    /改为####
sed 's@/@####@g' westos


sed 's@/@####@g' -i  westos         把sed处理的内容保存到westos文件中

 

 

练习及脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!

sh Apache_port.sh 8080
apache的端口会被修改为8080

vim Apache_port.sh
#!/bin/bash
setenforce 0 &> /dev/null

[ -z "$1" ] && {
        echo "ERROR:please inout port folloeing script!!"
        exit
}

rpm -q httpd &> /dev/null || {
        echo "ERROR:Apach is not install!!"
        exit
}

systemctl status httpd | grep "running" &> /dev/null || {
        echo "ERROR:Apache is not running!!"
        exit
}

netstat -antlupe | grep -E ":$1\>" &> /dev/null && {
        echo "ERROR:$1 is in used !!"
        exit
}

sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

netstat -antlupe | grep http

sh Apache_port.sh 1111

 

 

3.awk
awk -F 分隔符 BEGIN{} {} END{} FILENAME

BEGIN 运行处理策略之前做的动作
END   处理结束所作的动作
中间{} 处理动作

NR        #行数        '{print NF}'
NF         #列数
FILENAME    #文件名称本身
westos        #westos变量值
“westos”     #westos字符串

/bash$/            #条件
/条件1|条件2/        #条件1或者条件2
/条件1/||/条件2/    #条件1或者条件2
/条件1/&&/条件2/    #条件1并且条件2

$0            #所有的列
$1            #第一列
$2            #第二列
$3            #第三列

 

 

 

 

#/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd


课后练习:
统计在系统中能su切换的并且用户加目录不在/home下的用户数量
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd


抓取ens3网卡ip

ifconfig ens3 | awk '/\<inet\>/{print $2}'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值