sed,awk处理文本,循环和条件语句

本文介绍了Linux中sed和awk工具的使用,包括行选择、替换、插入等操作,并探讨了循环和条件语句在脚本中的应用,如for、while和if...else,以及case语句的使用。通过实例展示了如何在文本处理中实现特定功能。

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

###############################
1.sed
###############################

sed处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾

sed [参数] ‘命令’ file
p ##显示
d ##删除
a ##添加
c ##替换
i ##插入

(1)p:

显示passwd包含:的内容

sed -n '/\:/p' /etc/fstab 

在这里插入图片描述

显示以root开头的行

sed -n '/^root/p' /etc/fstab

在这里插入图片描述

显示不以root开头的行

sed -n '/^root/!p' /etc/fstab

在这里插入图片描述

显示2到6行

sed -n '2,6p' /etc/fstab

在这里插入图片描述
不显示2到6行

sed -n '2,6!p' /etc/fstab

在这里插入图片描述

(2)d:
删除以UUID开头的行(不改变原文件内容)

sed '/^UUID/d' fstab

在这里插入图片描述 删除以#开头的行

sed '/^#/d'  fstab 

在这里插入图片描述
删除以$d开头的行

sed '/^$/d'  fstab 

在这里插入图片描述
删除1到4行

sed '1,4d'  fstab

在这里插入图片描述
(3)a:
在hello下添加world (此操作不改变原内容)

sed '/hello/aworld' westos

在这里插入图片描述
把所有hello替换为hello world

sed 's/hello/hello world/g' westos

在这里插入图片描述
把所有hello替换为
hello
world

sed 's/hello/hello\nworld/g' westos

在这里插入图片描述

(4)-c:精确替换

sed "/hello/chello world" westos

在这里插入图片描述

(5)插入
在每一行第一个hello前换行插入
world
westos

sed "/hello/iworld\nwestos" westos

在这里插入图片描述
把全部nologin替换为westos

sed  "s/nologin/westos/g" passwd

在这里插入图片描述
把3到5行的nologin替换为westos

sed  "3,5s/nologin/westos/g" passwd

在这里插入图片描述
把所有非开头的#替换为/

sed "s/\//#/g" /etc/fstab

在这里插入图片描述
(6)改变原文

这样只会显示改变后的效果

sed 's/hello/hello world/g' westos

如果替换原文必须要加-i(插入)

sed 's/hello/chello world/g' -i westos

在这里插入图片描述
######################
2.awk
######################
awk会根据模式一次从文件中抽取一行文本,对这行文本进行切片就是把每个单词单独处理,默认空格为分隔符

在命令格式上分别体现如下
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令快
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果

$0表示显示全部

awk "{print $0}" file  

在这里插入图片描述
$1表示第一个以此类推

awk "{print $1}" file	

在这里插入图片描述
$1,$2表示显示第1和第2个

awk "{print $1,$2}" file	

在这里插入图片描述
指定分隔符为.

awf -F ":" '{print $1,$3}' /etc/passwd

在这里插入图片描述
输出文件名和当前操作的行号

awk '{print FILENAME,NR}' /etc/passwd

在这里插入图片描述
输出每次处理的行号和当前以:为分隔符的字段数,有nr行,nf列

awk - F: '{PRINT NR,NF}' /etc/passwd 

在这里插入图片描述
读入第一行文本之前执行的语句,一般用来初始化操作

awk 'BEGIN { A=34;print a+10 }' /etc/passwd 

在这里插入图片描述
{}:逐行处理
END{} 处理完

awk的简单应用有

在开头加REDHAT,末尾加WESTOS,打印括号内容

awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd 

在这里插入图片描述
输出以bash结尾的内容

awk -F:  '/bash$/{print}' /etc/passwd

在这里插入图片描述
输出第三行

awk -F: 'NR==3 {print}' /etc/passwd

在这里插入图片描述
输出偶数行

awk -F: 'NR % 2 == 0{print}' /etc/passwd

在这里插入图片描述
输出第三到第五行

awk -F: 'NR>=3 && NR<=5 {print}' /etc/passwd

在这里插入图片描述
统计系统能登陆的用户数量

awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' /etc/passwd	

在这里插入图片描述
查看家目录不是home且能登陆的用户
$6!~表示从第六个字段后不是某某条件

awk -F ":"  '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd

在这里插入图片描述
统计可登录的用户但是家目录不在/home下个数

awk -F ":"  'BEGIN{N=0} $6!~/^\/home/&&/bash$/{N++} END{print N}' /etc/passwd

在这里插入图片描述
显示文件行数

 awk  'BEGIN{N=0} {N++} END{print N}'  /etc/passwd

在这里插入图片描述
统计文本总字数

awk  'BEGIN{N=0} {N+=NF} END{print N}'  /etc/passwd

在这里插入图片描述
抓取主机ip

ifconfig eth0 | grep "inet " | awk '{print $2}'

在这里插入图片描述

(1)if单分支

以:为分隔符统计以bash结尾的用户数量

awk -F: 'BEGIN{i=0}{if($7~/bash$/)(i++)}END{print i}' /etc/passwd

在这里插入图片描述
以:为分隔符统计uid小于500的用户数量

awk -F: 'BEGIN{i=0}{if($3<=500)(i++)}END{print i}' /etc/passwd

在这里插入图片描述
(2)if双分支
打印uid小于500大于0的用户数量

awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd

在这里插入图片描述
(3)for循环
打印1到5

awk 'BEGIN{for(i=1;i<=5;i++){print i}}'

在这里插入图片描述

#######################
3.循环
#######################
(1)for循环
打印1到5

awk 'BEGIN{for(i=1;i<=5;i++){print i}}'

在这里插入图片描述
检测50内网是否通

#!/bin/bash
for((i=0;i<=50;i++))
 do
 ping -c1 -w1 172.25.254.$i &> /dev/null && echo 172.25.254.$i is up || echo     172.25.254.$i is down
 done

在这里插入图片描述
覆盖显示时秒倒数

#!/bin/bash
read -p "输入分钟:" a
read -p "输入秒种:" b

let c=a*60+b

for ((c;c>0;c--))
do
let a=c/60
let b=c%60
echo -n " $a:$b "
echo -ne "\r"
sleep 1
done

在这里插入图片描述
(2)while循环
正确执行完毕后重新执行
每隔2秒显示一次系统运行时间

while true
do
  uptime
  sleep 2
done

在这里插入图片描述
(3)嵌套循环
打印乘法表

#!/bin/bash

for((i=1;i<=9;i++))
do
 
         for((m=1;m<=i;m++))
         do
                 echo -ne "$i * $m = $(($i*$m))\t"
         done
 
         echo -e "\n"
 done

在这里插入图片描述
#################################################
4.条件语句
##################################################
(1)if条件语句
格式为

if	then

else
elif
fi

写一个脚本实现只有root执行才能自动查看home下的文件
在这里插入图片描述
运行
在这里插入图片描述

写脚本不同输入不同反馈
在这里插入图片描述
在这里插入图片描述
(2)case语句
格式为

case $1 in
 | | | )
	echo " "
	;;
*)
	echo " "
	;;
esac

写脚本不同输入不同反馈
在这里插入图片描述
在这里插入图片描述

写一个脚本看ip,磁盘空间,系统运行时间和退出

#!/bin/bash
while true
do
        echo -e "
        \033[31m A 看ip  \033[0m
        \033[32m B 看磁盘剩余空间 \033[0m
        \033[34m C 看系统运行时长 \033[0m
        \033[34m Q 退出 \033[0m
"
read -p "输入选择:" a

[ -z "$a" ] && {
echo -e "\033[31m 请输入有效内容 \033[0m"
}

case $a in

a|A)
        ifconfig br0 | grep "inet " | awk '{print $2}'
        ;;
b|B)
        df -h | awk 'NR==2{print "剩余空间为:" $4}'
        ;;
c|C)
        uptime | awk '{print $3}' | awk -F. '{print $1}' | awk -F: '{print "运行了"$1"小时"$2"分钟"}'
        ;;
q|Q)
        exit 0
        ;;
esac
done

结果有五种反馈
无输入时按回车
在这里插入图片描述
abc
在这里插入图片描述
q退出
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值