Vim sed awk

liuqiang 2021年06月06日 38次浏览
  • 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")}'