sed与awk命令使用

转自:https://dev.zte.com.cn/topic/#/47781

一、Linux脚本中利用sed修改文件内容

常用命令 功能

 a 插入,在当前行后添加一行或多行。多行时需要在每行末尾需用“\”续行(最后不需要)

 c 替换,用此符号后的新文本替换当前行中的文本。多行时需要在每行末尾需用“\”续行(最后不需要)

 d 删除,删除行

 i 插入,在当前行之前插入文本。多行时需要在每行末尾需用“\”续行(最后不需要)

 h 拷贝模板块的内容到内存中的缓冲区

 g 获得内存缓冲区的内容,并替代当前模板块中的文本

 l 列出非打印字符

 n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理

 p 打印行

 q 结束或退出sed

 r 从文件中读取输入行

 ! 对所选行以外的所有行应用命令

 s 替换,用一个字符串替换另一个。通常和正则表达式搭配使用:1,$ s/old/new/g

 g 在行内进行全局替换

 w 将所选的行写入文件

 x 交换暂存缓冲区与模式空间的内容

 y 将字符替换为另一字符(不能对正则表达式使用y命令)

常用项 功能

 -e 进行多项编辑,即对输入行应用多条sed命令时使用

 -n 取消默认的输出,使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来

 -f 指定sed脚本的文件名

 -i  直接修改读取的文件内容,而不是由屏幕输出 

 -r  sed的动作支持的是延伸型正则表达式的语法,想少用\  那你就用-r

1、删除添加

#delete all lines contain “flavor_name”

sed -i ‘/flavor_name/d’ 文件名

在第一行后添加用1a,或者2i

#append info “flavor” into line 1

sed -i ‘1a flavor’ 文件名

在首行添加用1i,

sed -i ‘1i flavor’ 文件名

2、替换

sed -i ‘s/被替换的字符串/新的字符串/g’

3、找到包含auth_url的行,将head替换为4个空格

sed -i ‘/auth_url/s/head/    /g’ 文件名

4、变量引用

反引号(键盘左上角1前面的键)可直接引用变量,如:取一个文件的行数

a=`cat 文件名|wc -l `

sed用单引号包含双引号来引用变量,如:删除包含变量var的值的行。

$ sed -i ‘/'”$var”‘/d’ 文件名

二、shell  awk从文件取内容

$0 这个程式的执行名字

$n 这个程式的第n个参数值,n=1..9

$* 这个程式的所有参数,此选项参数可超过9个。

$# 这个程式的参数个数

$$ 这个程式的PID(脚本运行的当前进程ID号)

$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)

$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)

$- 显示shell使用的当前选项,与set命令功能相同

$@ 跟$*类似,但是可以当作数组用

示例1:文件create-nested-snapshots-and-attach-volume.json的内容:

{% set flavor_name = flavor_name or “m1.tiny” %}

{% set image_name = image_name or “^cirros.*uec$” %}

{% set netid = netid or “” %}

{% set concurrency_number = concurrency_number or 1 %}

{% set times_number = times_number or 1 %}

打印每一行的行号:

cat create-nested-snapshots-and-attach-volume.json|awk ‘{print NR}’     

1

2

3

4

5

打印每一行的行号并用—连接该行内容

cat create-nested-snapshots-and-attach-volume.json|awk ‘{print NR”—“$0}’ 

1—{% set flavor_name = flavor_name or “m1.tiny” %}

2—{% set image_name = image_name or “^cirros.*uec$” %}

3—{% set netid = netid or “” %}

4—{% set concurrency_number = concurrency_number or 1 %}

5—{% set times_number = times_number or 1 %}

打印每一行的行号并用一个空格连接该行内容

cat create-nested-snapshots-and-attach-volume.json|awk ‘{print NR” “$0}’                                  

1 {% set flavor_name = flavor_name or “m1.tiny” %}

2 {% set image_name = image_name or “^cirros.*uec$” %}

3 {% set netid = netid or “” %}

4 {% set concurrency_number = concurrency_number or 1 %}

5 {% set times_number = times_number or 1 %}

打印每一行的行号并用一个空格连接该行内容,grep抓取包含某一字符串的行

cat create-nested-snapshots-and-attach-volume.json|awk ‘{print NR” “$0}’|grep ‘{% set flavor_name = flavor_name’              

1 {% set flavor_name = flavor_name or “m1.tiny” %}

使用$1获取第一个参数,打印包含某一字符串的行的行号

cat create-nested-snapshots-and-attach-volume.json|awk ‘{print NR” “$0}’|grep ‘{% set flavor_name = flavor_name’|awk ‘{print $1 }’  

1

示例2

取第1行以“,”分隔的第2个字符,再在里面过滤出以”:”分隔的第2个字符。

awk -F”,” ‘NR==1,{print $2}’ test1.txt|awk -F”:” ‘{print $2}’ 

awk实现数字字符串自动补零:

123前面补0补足5位

echo 123 | awk ‘{printf(“%05d\n”,$0)}’

8前面补0补足2位

printf “%02d\n” 8

结果08

8前面补0补足3位

printf “%03d\n” 8

结果008

    原文作者:Juggle
    原文地址: https://www.jianshu.com/p/132977d083b3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞