linux文本处理三剑客

linux中文本处理三剑客有awk(主要用于截取)、sed(主要用于替换)、grep(主要用于过滤)

awk

awk是什么?

是一种编程及数据操作语言 既然是编程语言,就有:变量、流控 if for、数组、函数

awk有什么用?用于哪里?

awk用于文本处理,可以用来对文本进行过滤、截取甚至可以做统计

awk命令的简要处理流程

awk会逐行读取文件数据进行处理,以-F后面指定的分隔符将数据划分为若干段,每段数据存入对应的变量中。$0存储的是整行数据

awk的内置变量

FS The input field separator, a space by default. See Fields, above. 输入分隔符变量
OFS The output field separator, a space by default. 输出分隔符变量
NF The number of fields in the current input record. #计算字段
NR The total number of input records seen so far. 行号
例:awk -F":" ‘OFS=“#”{print NR,$1,$3,$5,$7}’ /etc/passwd
指定输出分割符为#并输出第1、3、5、7列,给每一行添加行号,其中$NF可以表示最后一个字段,$(NF-1)表示倒数第二个字段

awk语法

分为三部分:BEGIN{ }pattern{ }END{ },BEGIN为处理数据之前执行的命令,pattern为每行都会执行的命令,END为处理数据后执行的命令,头和末尾匹配一次,中间每行匹配一次。
例:awk -F: ‘BEGIN{num=0;print “###start###”} $1~/^luo{2,}/ && $3>2000 || $NF ~ /bash/ {print NR,NF,$1,$3,length($1),$(NF-1);num++} END{print "lins:"num}’ /etc/passwd
开始指定分隔符为:,定义变量num=0,并且最开始执行输出###start###,pattern部分指定以(luo并且后面接2到无数个字符)开头并且第三列的值要大于2000的行,或者最后一个字段是bash的行 ;
awk中指定多个输入分隔符:[/:];
在匹配时~为模糊匹配,==是精确匹配;
边界符号:\ \

awk和shell传参问题

awk当中,直接使用shell里的变量,需要使用双引号,里面的位置变量需要转义
例:
shell中定义变量 sg=lzy
awk中引用sg变量:awk -F: “/$sg/{print $1}” /etc/passwd

awk流控

if

单分支:if statement(语句): awk -F: ‘{if ($1 ~ /luoziyao/) print “yaoge”}’ /etc/passwd;
双分支:if statement1 else statement2:awk -F: ‘{if ($1 ~ /luoziyao/) print “yaoge”;else print “dage”}’ /etc/passwd;
多分支:awk -F: ‘{if ($1 ~ /luoziyao/) print “yaoge”;else if ($3>5000) print “dageda”;else print “dage”}’ /etc/passwd;

for

类似于python字典里的key和value
awk的for循环格式
for (i=0;i<10;i++) {print $i;}
for (i in array) {print array[i]} --》直接从数组的下标里读一个值,以此类推,取完所有的值,遍历

例:awk -F: ‘{split($6,home_dir,“/”);for (i=2;i<4;i++)print i,home_dir[i]}’ /etc/passwd

函数

length:awk -F: ‘length($1) >6 {print $1}’ /etc/passwd 统计长度
split: 将一段字符串分割符号,对文本进行分割,存放到数组里,使用for循环遍历读取数组里的内容
substr: awk -F: ‘{if (length($1)>6) print substr($1,1,6)}’ /etc/passwd
substr($1,1,6) 类似于切片操作 对$1 第一个开始 切6个
system: 将linux命令放在awk里面
awk ‘{system("useradd "$1)}’ name.txt

数组

!!awk里的数组下标从1开始

  • awk里如何使用数组存放数据?

将所有的/etc/passwd 所有的用户存放在user数组里,例如 awk -F: ‘{user[$1]=$3}’,就是将$3里的值赋

  • 给user[$1]数组 awk里如何取出数组里存放数据?
    for 循环
    while 循环

grep

grep命令主要用于对文本的过滤,grep家族有:grep,egrep(grep -e)、fgrep(用的少)
grep常见用法:
grep –i 查找时忽略大小写;

  • -v:反转查找;
  • -n:显示符合模式要求的行号;
  • -r:递归搜索所有文件;
  • -o:只显示匹配的内容;
  • -E:支持更多的元字符(支持扩展正则);
  • -A:找到匹配行以及后几行; After
  • -B:输出匹配行以及前几行; Before
    接*代表对当前目录下的文件都查找 接一个-r就表示对当前目录下的文件以及子文件进行查找(递归查找)

sed

sed有什么用?

sed - stream editor for filtering and transforming text stream
流,数据流,文本流 就是一个文本过滤和转换(替换)的流 编辑器(工具);
核心功能:sed -i ‘s/luoziyao/luodayou/’ rengxj.txt (核心功能,替换)把luoziyao换成
luodayou

sed的命令参数

  • -n 表示安静模式,不输出不匹配的行
  • -r 识别扩展正则
  • -i 直接对原文件进行编辑
  • -e 识别多个命令操作
    例:

sed -n ‘2,3p’ passwd -n就是不显示不匹配的行 2,3p 显示第二和第三行
sed -n ‘1p;$p’ passwd 实现输出第一行和最后一行
cat passwd -n|sed –n ‘1~3p’ 1~3就是步长为3 个间隔三行输出

sed指令信息参数

  • p 输出信息
  • i insert,指定信息前插入信息
  • a append指定信息后追加新的信息
  • d delete删除指定信息
  • s substitute替换信息
  • c 替换一整行信息
  • g 实现逐个替换
    例:

sed -i ‘s/tongtong/jingjing/g’ rengxj.txt g实现所有东西挨个替换

sed -i ‘2c cali haha’ rengxj.txt 2c对第二行进行整行替换 替换成 cali haha
sed -i ‘s/^2/3/’ hosts

sed的查找

1、 根据行号
2、 根据模式 --字符串
3、 正则匹配

sed中&的用法

&用于表示替换命令中的匹配模式
例:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值