转自: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