- sed awk 非交互式
- 文件操作模式与行操作模式
vim 文本编辑器
set awk 行编辑器
sed 一般用于对文本内容做替换
sed
- sed的模式空间
- 替换命令s
- 将文件以行为单位读取到内存(模式空间)
- 使用sed的每个脚本对该行进行操作
- 处理完成后输出该行
sed 的替换命令 s
元字符
sed s/old/new fileName
sed - e s/old/new -e s/old/new fileName1 fileName2 ...
set s/old/new;s/old/new fileName
sed -i '' fileNname ...
sed -r 's/'
cut
aws -F
sed -n 'script' filename 阻止默认输出
只匹配查询字符的 第二次结果 进行替换
head -5 /etc/passwd | sed 's/root/!!!!/2'
只输出替换成功的行
head -5 /etc/passwd | sed -n 's/root/!!!!/p'
将替换成功的行输入到指定文件
head -5 /etc/passwd | sed -n 's/root/!!!!/w /tmp/a/txt'
w file 将模式空间的内容写入到文件
sed 的多行模式
N,D,P
N:将下一行加入到模式空间
cat > b.txt << EOF
hell
o bash hel
lo bash
hello bash
hello bash
hello sed
sed 'N;s/\n//; s/hello bash/hello sed\n/;P;D'
awk 字段和记录相关的知识
每一行和分割的部门,
记录和字段,引用和拆分
- 每行称作AWK的记录
- 使用空格、制表符 分割开的单词称作字段
- 可以自己指定分割的字段
awk '{print $1 }' filename
awk 可以使用-F 改变字段分隔符
分隔符可以使用正则表达式
cat /boot/grub2/grub.conf
awk '/^menu/{print $0}' /boot/grub2/grub.cfg
awk -F "'" '{print $2}' /boot/grub2/grub.cfg
awk表达式
赋值操作符
= 是常用的赋值操作符
var1 = "name"
var2 = "hello" "world"
var3 = $1
其他赋值操作符
++ -- += -= *= /= %= ^=
算数操作符
系统变量
FS OFS字段分隔符,OFS 表示输出的字段分隔符
head -5 /etc/passwd | awk 'BEGIN;{print $1}'
head -5 /etc/passwd | awk 'BEGIN;{print $1,$2}'
head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}'
head -5 /etc/passwd | awk -F ":" '{print $1}'
RS 记录分隔符
RS 标记输入的行的分隔符
\n
head -5 /etc/passwd | awk 'BEGIN{print $0}'
NR 和 FNR 行数
NF字段梳理
关系操作符
布尔操作符
条件语句
if 开头
if ()
{
awk 语句
}
else
awk语句2
cat kpi.txt
user1
user2
user3
user4
user5
awk >=80
awk '{if($2>=80) {print $1;print $2}}' kpi.txt
循环
while 循环
while(表达式)
awk语句1
do 循环
do {
awk 语句1
} while(表达式)
for 循环
for ()
awk '{ for (i=2;i<=NF;i++){ sum+=$i} print sum}'
awk '{ for (i=2;i<=NF;i++){ sum+=$i} print sum/(NF-1)}'
awk数组:
awk '{sum=0; for(col=2;col<=NF;col++){sum+==$col} avg[$1]=sum/(NF-1)};END{for(i in avg){sum2+=avg[i]} print sum2/NR }'
$NF
vim kpi.awk
{
sum=0
for(col=2;col <= NF; col++){
sum+=$col;
}
average[$1]=sum/(NF-1)
if(average[$1] >= 80)
else if(average[$1] > = 80)
letter= "a"
print $1,letter
}
END{
for(i in average)
{
sum_all +=average[i];
}
avg_all=sum_all/NR;
for(user in averagee){
}
}
awk函数
算数函数
int() sin() cos() rand() srand()
awk 'BEGIN{pi=3.14;print int(pi)}'
awk 'BEGIN{pi=3.14;print rand()}'
awk 'BEGIN{pi=3.14;srand();print rand()}'
man awk
/gsub
N n
字符串函数
gsub(r,s,t)
index(s,t)
length(s)
match(s,r)
split(s,a,sep)
sub(r,s,t)
substr(s,p,n)
自定义函数
function 函数名 (参数){
awk 语句
return awk变量
}
awk 'function a() {
return 0
} BEGIN { print a()}'
awk 'function double(str) BEGIN { print double("12123")}'