流编程
一、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}