shell_对文件的操作

 sed命令

语法:

sed [options] '{command}[flags]' [filename]

{}是必须有,[]可选

options:

-r        使用扩展的正则表达式

-n       只打印缓存中的内容,不打印文本内容

-e       执行多个命令

-f        执行文件中的命令

-i        修改原文件

-i.xxxx          修改源文件并且备份源文件

sed常用内部命令:

a     在匹配后添加

i      在匹配前添加

p     打印

d     删除

s     查找替换

c     更改

y     转换 N D P 

命令a使用:(追加)

sed 'a\hello world' data                             在每行后面添加hello world

sed '3a\hello world' data                           在第3行后面添加hello world

sed '2,4a\hello world' data                        在第2-4行后面添加hello world

sed '/3 the/a\hello world' data         先匹配"3 the"的行,然后在这行后面添加hello world,//是匹配模式

命令i使用:(插入)

sed 'i\hello world' data                             在每行前面添加hello world

sed '3i\hello world' data                           在第3行前面添加hello world

sed '2,4i\hello world' data                        在第2-4行前面添加hello world

sed '/3 the/i\hello world' data         先匹配"3 the"的行,然后在这行前面添加hello world,//是匹配模式

命令d使用:(删除)

sed 'd' data                             删除所有行

sed '3d' data                           删除第3行

sed '2,4d' data                        删除2-4行

sed '/3 the/d' data        先匹配"3 the"的行,然后删除这行//是匹配模式

sed -r '/(^#|#|^$)/d' data               删除#开头,包含#以及空行

命令s使用:(替换)

sed 's/dog/cat/' data                              把每行中dog替换成cat

sed '3s/dog/cat/' data                               把第3行中dog替换成cat

sed '2,4s/dog/cat/' data                            把2-4行中dog替换成cat

sed '/3 the/s/dog/cat/' data                          先匹配"3 the"的行,然后把行中dog替换成cat //是匹配模式

命令c使用:(更改)

sed 'c\hello world' data                             所有行改为hello world

sed '3c\hello world' data                           第3行改为hello world

sed '2,4c\hello world' data                        第2-4行改为hello world并且合并为一行

sed '/3 the/c\hello world' data         先匹配"3 the"的行,然后把这行改为hello world,//是匹配模式

命令y使用:(转换)

sed 'y/abcd/ABCD' data                                 按照字符对应关系转换

命令p使用:(删除)

sed 'p' data                             打印所有行

sed '3p' data                           打印第3行

sed '2,4p' data                        打印2-4行

sed '/3 the/p' data        先匹配"3 the"的行,然后打印这行//是匹配模式

标志位的使用

数字    表示新文本替换的模式

g:      表示用新文本替换现有文本的全部实例

p:         表示打印原始的内容

w filename      将替换的结果写入文件

 

sed 's/dog/cat/2' data                              把每行中第二处dog替换成cat

sed 's/dog/cat/g' data                              把每行中所有dog替换成cat

sed '3s/dog/cat/p' data                               把第3每行中dog替换成cat并且打印

sed '3s/dog/cat/w newdata' data                  把第3每行中dog替换成cat并且把修改的行保存在newdata文件,源文件不变

-e和-f的用法

-e用法

sed -e 's/brown/green/;s/dog/cat/' data 

-f用法

创建文件,aaa:

s/brown/green/

s/dog/cat/

sed -f aaa data

sed小技巧

sed -n '$=' data      打印行号

 

 

AWK命令

语法

awk [options] ‘[BEGIN]{program}[END]’ [file]

常用命令选项:

-F fs     指定列分割符

-f file       指定读取程序的文件名

-v var=value   定义awk程序中适用的变量和默认值

awk对字段的提取

字段相关内置变量:

$0    表示正行文本

$1    表示行中第一个数据字段

$2    表示行中第二个数据字段

$N      表示行中第N个数据字段

$NF    表示行中最后一个数据字段

 

awk '{print $0}' data        打印所有列

awk '{print $NF}' data          打印最后一列

awk '{print $3}' data        打印第三列

awk对行的提取

awk 'NR==3{print $0}' data     打印第3行的所有列

-F的用法

awk -F ":" 'NR==1{print $1}' passwd           用:作为分隔符,打印第一行的第1列

awk -F ":" 'NR==1{print $1,$3,$5}' passwd      用:作为分隔符,打印第一行的第1,3,5列

awk -F ":" 'NR==1{print $1 "-" $3 "-" $5}' passwd    用:作为分隔符,打印第一行的第1,3,5列并且用-隔开

awk -F ":" 'NR==1{print "account: " $1,"UID: " $3,"DESC: " $5}' passwd

AWK高级用法

awk定义变量

head -2 /proc/meminfo | awk 'NR==1{Total=$2}NR==2{Free=$2;print (Total-Free)*100/Total"%"}'

awk定义数组

awk 'BEGIN{array[1]="test";array[2]=18;print array[1],array[2]}'

awk运算

赋值运算:=

比较运算:> >= == <= < !=

数学运算:+ - * / % ** ++ --

逻辑运算: && ||

匹配运算:~ !~

用法

seq 1 10 num

awk '$1>=5{print $0}' num

awk '$1!=5{print $0}' num

awk -v 'count=0' 'BEGIN{count++;print count}'     

awk -F: '$1=="root"{print $0}' passwd      精确匹配

awk -F: '$1 ~ "ro"{print$0}' passwd       模糊匹配

awk环境变量

FIELDWIDTHS      以空格分隔的数字列表,用空格定义每个数据字段的精确宽度

FS             输入字段分隔符号

OFS             输出字段分隔符号

RS             输入记录分隔符

ORS                                       输出记录分隔符

用法

awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' /etc/passwd

awk 'BEGIN{FS=":"}$1!~"ro"{print $0}' passwd

awk 'BEGIN{FS=":";OFS="-"}$1=="root"{print $1,$3,$5}' /etc/passwd

awk 'BEGIN{RS="";OFS="\n"}{print $1$,2,$3}' num

awk 'BEGIN{RS="";ORS="#####"}{print $1$,2,$3}' num

流程控制 

if判断语句

for循环语句

while循环语句

do...while循环语句

循环控制

if条件语句

awk '{if($1>5)print $0}' num

awk '{

  if($1>5)

  print $0

}' num

 

awk '{

if($1>5)

  print $1*2

else

  print $1/2

}' num

 

awk ''{if($1>5)print $1*2;else print $1/2}' num

for循环语句

awk -v 'sum=0'  '{sum+=$1}END{print sum}' num2    对$1列求和

awk '{

for (i =1;i<4;i++)

  sum+=$i

print sum}' num2

awk '{sum=0;for(i=1;i<4;i++){sum+=i$}print sum}' num2

while循环语句

awk '{

sum=0

i=1

while(sum<150) {

  sum+=$i

  i++

}

print sum

}' num2

awk '{sum=0;i=1;while(sum<150){sum+=$i;i++}print sum}' num2

do...while循环语句

awk '{

sum=0

i=1

do {

  sum+=$i

  i++

}

while(sum<150)

print sum

}' num2

awk '{sum=0;i=1;do{sum+=$1;i++}while(sum<150);print sum}' num2

循环控制语句

break

awk '{

sum=0

i=1

while(i<4) {

  sum+=$i

  if(sum>150)

    break

  i++

}

print sum

}' num2

awk小技巧

awk 'END{print NR}' /etc/passwd      打印行号

awk 'END{print $0}' /etc/passwd       打印最后一行

awk 'END{print NF}' /etc/passwd      打印列数

 

输出100 “=”的方法

python -c "print('+'*100)"

head -c 100 /dev/zero |awk 'gsub(/./,"+")'

perl -le "print(q(+)x100)"

println("+"*100)

输出50个=的方法

 

  1. echo "" | sed ':a; s/^/=/; /=\{50\}/b; ta'

  2. sed ':a;s/^.\{0,49\}$/&=/;ta' <<<""

  3. awk 'BEGIN{OFS="=";NF=50;print}'

  4. awk 'BEGIN{while(n++<50)printf "=";print""}'

  5. seq -s'a' 50 | tr -d '[0-9]'

  6. for i in `seq 50`; do echo -n =; done

  7. yes "=" | sed '50q' | tr -d '\n'

  8. yes "=" | head -n 50 | tr -d "\n"

  9. perl -le 'print "=" x 50'

  10. python -c "print '='*50"

  11. printf "%0050d\n" 0 | tr "0" "="

  12. eval printf '%.0s=' {1..50}

  13. str=$(printf "%*s" "50"); echo ${str// /=}

 

posted @ 2021-01-05 10:23  goldtree358  阅读(121)  评论(0)    收藏  举报