背景
在工作中经常会碰到,对文本的列、行的操作,主要涉及操作为sed和awk。本文记录哈常见的场景,以便不时之需。
常用特殊字符
- $ 正则表达式中表示一行结尾,常用在(grep、sed、awk、vim中);或用在变量的前导符
- ^ 表示一行开始
- $? 状态值(0,1)
对行的操作
主要使用sed
命令进行操作,-i
参数表示将使用新的内容对源文件进行修改
在某行的前一行或后一行添加内容
即不知道在第几行操作,只给出了某行的内容。
在某行前插入一行:sed -i '/xxx/i\yyy' filename
。i表示插入,即在名称为filename的文件中,内容为xxx的行前插入内容为yyy的行
在某行后追加一行: sed -i '/xxx/a\yyy' filename
。 a表示追加,即在名称为filename的文件中,内容为xxx的行后追加内容为yyy的行
比如test文件内容为:
[root@control ~]# cat test
aaa
bbb
ccc
ddd
ccc
我们在test文本中,行内容为ddd前插入一行555:
[root@control ~]# sed '/ddd/i\555' test
aaa
bbb
ccc
555
ddd
ccc
由于我们使用sed时,没有使用-i
参数,所以修改后的内容并不会添加到test文件中。要想修改test文件则添加i
参数。同理
在某行前或后加一行内容
即在知道行号的前提下,进行操作
操作:sed -i 'N;Miyyy' filename
N表示对行操作,M表示行号,i表示动作即在文件名为filename的M行前插内容为yyy的一行
sed -i 'N;Mayyy' filename
同上,不过a表示追加。
同样对test进行操作:
[root@control ~]# sed 'N;4ai666' test
aaa
bbb
ccc
ddd
i666
ccc
统计行数
可使用wc命令
// 参数-l 表示行 -w表示words
[root@control ~]# wc -l test
5
或使用NR和tail
// tail -nk 表示输出最后k行
// print NR 打印出行的标号,1,2,3,4,5.
[root@control ~]# awk '{print NR}' test | tail -n1
5
对列的操作
方法:对列的操作主要使用awk去获取某一列,然后进行拼接来完成对某一列的删除、增加。 使用awk时,NR代表行
提取某列
操作:awk '{print $i}'
$i代表某列,当然可在其中添加if判断语句
比如,test内容为:
[root@control ~]# cat test
aaa dss uuu
bbb fds iii
ccc xxx lll
ddd 222 ttt
ccc 333 yyy
现在获取第二列
[root@control ~]# awk '{print $2}' test
dss
fds
xxx
222
333
添加列
操作: 简单方法,使用print进行拼接
给test的第一列添加内容为uuu的一列,每列以空格间隔。
awk '{print "uuu " $1" " $2" " $3}' test
uuu aaa dss uuu
uuu bbb fds iii
uuu ccc xxx lll
uuu ddd 222 ttt
uuu ccc 333 yyy
取出test的前两行
NR表示行,使用if条件判断
[root@control ~]# awk '{if(NR <= 2){print}}' test
aaa dss uuu
bbb fds iii
参考
https://www.cnblogs.com/dirt2/p/5991033.html
http://www.361way.com/sed-process-lines/2263.html
https://www.cnblogs.com/tdtdttdd/p/6901757.html
https://www.cnblogs.com/mikasama/p/8032389.html