10-流编辑

流编程

一、sed命令

把文件内容读到缓冲区进行处理

三种执行方式

#第一种方式直接执行
sed -n '1,2 p' demo.txt  
#第二种执行方式 引用文件执行
echo -e "1p\n2p">a
sed -n -f a demo.txt 
#第三种执行 脚本执行
文件名sh1
#! /bin/sed -f
1 p
chmod +x sh1
./sh1 demo1.txt
1、读取文件

​ 读取demo.txt 文件的1-2行到缓冲区 -n 不照读文件

sed -n '1,2 p' demo.txt
2、相关参数

在这里插入图片描述
在这里插入图片描述

3、常规操作
  • 将符合20020017****的行内容打印出来
result=`sed -n '/^20020017/p' students.txt`
  • 替换文本
result=`sed 's/e/E/' student.txt`  # 只把每一行的第一个e换成E
result=`sed 's/e/E/g' student.txt` # 替换所有的 e换成E
result=`sed '1,/^200200167/s/e/E/g' student.txt` #从第一行开始到匹配到200200167为止把e换成E
result=`sed's/<[^>]*//g' html.txt` # /<[^>]*:代表<***>  替换成空
result=`sed 's/string/long &/' demo1.txt` # &引用前面的内容:string替换成long string
result=`sed 's/\(This\)\(is\)\(a\)\(string\)/\2\1\3\4' demo1.txt`# 换位置成is This a string
`sad 's/^/this is a test/g' demo2.txt ` #在每一行行首添加this is a test
  • 删除
result=`sed -e '1d' students.txt`#删除第一行
result=`sed -e '$d' students.txt`#删掉最后一行
  • 追加
result=`sed '2 a 200200109  Tom' students.txt`# 在第二行追加200200109  Tom
result=`sed '2 i 200200109  Tom' students.txt`# 在第二行前面插入200200109  Tom
  • 同时执行多个子命令
result=`sed -n -e 's/e/E/g' -e '2,3 p' students.txt
  • 先把所有e替换成E 然后插入2001000001 Ellen
result=`sed -n -e 's/e/E/g;2 i 200100001 Ellen' students.txt

result=`sed -n '1,5{
s/e/E/g
s/a/A/g
2 i 201303009 TOM
p
}' sutdents.txt`
  • 综合题:接受三个参数,替换脚本
    在这里插入图片描述

二、awk

列处理:数据加工和信息检索有关的任务

  • 逐行扫描
  • 寻找与特定模式相匹配的行
  • 对该行进行相应的动作
awk -F "分隔符" {print $1} demo1.txt 
  • 方式二、方式三

在这里插入图片描述

  • 方式一
# 方式一  直接执行
awk '{print}' demo2.txt
# 方式二  通过awk执行:把a文件里面的内容当做条件
awk -f a demo2.txt
# 方式三  直接运行文件即可
a.sh文件内容:
#! /bin/awk -f
{print}
# 需要把a.sh转换为可执行文件:chmod +x a.sh
# 然后直接执行
./a.sh demo2.txt
# 报错就改下a.sh头文件:#! /user/bin/awk -f
1、常用实例
# 以:分隔 显示第一列和第三列中间加一个大缩进
head -5 /etc/passwd | awk -F ":" '{print $1 "\t" $3}'
#以:分隔&&以b开头
head -5 /etc/passwd | awk -F ":" '/^b/ {print $1 "\t" $3}'
#以:分隔&&b开头找到第三列等于4为止
head -5 /etc/passwd | awk -F ":" '/^b/,$3==4 {print $1 "\t" $3}'
#打印用户并统计人数
awk '{count++;print $0;} END{print "user count is ", count}'  /etc/passwd

2、关系表达式

在这里插入图片描述

  • 第二行大于80
  • T开头
  • Tom/Kon 开头
  • K开头并且第二行大于80

在这里插入图片描述

  • 查看passwd文件,以:分隔 输出第一列长度为4的内容

    cat /etc/passwd |awk -F ':' '{if (lenth($1) == 4) print}'
    
  • 把查出来得内容写入到test中

awk -F ':' '{if (lenth($1) == 4) print}' /etc/passwd > test
  • Nancy开头第二行为92的内容(范围)
result=`awk'/^Nancy/,$2==92{print}' scores.txt`
3、BEGIN和END

系统内置变量

在这里插入图片描述

#! /bin/awk -f
BEGIN{
 # 定义记录分隔符
 RS=""
 # 定义字段分隔符
 FS="\n"
}
{print $1}

算术运算

#! /bin/awk -f
BEGIN{
x=5/2  
print x  # 2.5

# 需要参数 判断文件的第二列
grade=($2>90?"A":"B")  
print grade

#函数的使用
string="5P12p89"
split(string,arr,/[Pp]/)
print arr[1]  #5   拆分后一定要注意下标从1开始的
print arr[2]  #12
print arr[3]  #89
}

if的使用
在这里插入图片描述

where循环

在这里插入图片描述

for循环

实例

  • 判断文件是否存在
  • 判断你要查找的字符串是否有
  • 有:在文件查找所有有关字符串的内容并提取第一行
  • 然后以:作为分隔符输出第1列和第7列,把内容存入指定位置
  • 把内容存入ch_strs,最后打印出来

在这里插入图片描述

测试

# 第一种
#! /usr/bin/awk -f
BEGIN {print "hello linux"}
{print}

# 第二种
#! /usr/bin/awk -f
BEGIN{
	print "hello linux"
}
{print}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值