ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux中往文件中的某行插入数据 以及 行列转化的做法(paste、xargs等)

2021-04-10 20:52:48  阅读:209  来源: 互联网

标签:xargs 中往 paste cat 172.20 172.16 txt root kevin


 

sed -i 'ni\x' test.file        表示向test.file文件里的第n行的前面添加x内容
sed -i 'na\x' test.file       表示向test.file文件里的第n行的后面添加x内容

sed -i '/m/i\x' test.file     表示向test.file文件里匹配m字符串的行的前面添加x内容
sed -i '/m/a\x' test.file    表示向test.file文件里匹配m字符串的行的后面添加x内容

-i     表示in front,前面
-a    表示after,后面

比如向a.txt文件的首行添加123456789
# sed -i '1i\123456789' a.txt

比如向a.txt文件的第3行添加hhhhh
# sed -i '3a\hhhhh' a.txt

比如向a.txt文件匹配abcd字符串的行的前面添加66666
# sed -i '/abcd/i\66666' a.txt

比如向a.txt文件匹配1234字符串的行的后面添加hahaha
# sed -i '/1234/a\hahaha' a.txt

在/etc/my.cnf文件中匹配[mysqld]行的下面添加"skip-grant-tables", 注意[mysqld]前面需要加一个转义符!
# sed -i '/\[mysqld]/a\skip-grant-tables' /usr/local/mysql/my.cnf

比如向/etc/puppet/puppet.conf文件中的第2行的前面添加"    server=puppet01.test.cn"内容
然后再向第3行添加"    runinterval = 600"内容
# /bin/sed -i '2i\    server=puppet01.test.cn' /etc/puppet/puppet.conf
# /bin/sed -i '3i\    runinterval = 600' /etc/puppet/puppet.conf

##################   远程批量关闭进程main的脚本   ##################

[root@kevn script]# cat 6_main_stop.sh 
#!/bin/bash
for i in $(cat /opt/ip.list)
do
ssh -p22 root@$i 'ps -ef|grep main|grep -v grep|awk -F" " "{print $2}"|xargs kill -9 >/dev/null 2>&1'
done

##################  取文件中最后一个字符  ################## 

取最后一个字符:awk '{print substr($0,length())}' filename
[root@localhost ~]# cat a
3G
32G
123G
2348G
123131G
123123123123123G
[root@localhost ~]# awk '{print substr($0,length())}' a
G
G
G
G
G
G
[root@localhost ~]# awk -F"G" '{print $1}' a
3
32
123
2348
123131
123123123123123

##################  将多行文本转换成一行并用逗号隔开  ################## 

[root@kevin ~]# cat test
172.16.60.211
172.16.60.212
172.16.60.213
172.16.60.214
172.16.60.215
172.16.60.216
172.16.60.217
172.16.60.218
172.16.60.219
172.16.60.220
172.16.60.221
 
1)使用xargs方法,并用tr实现逗号隔开
[root@kevin ~]# cat test| xargs | tr ' ' ','   
172.16.60.211,172.16.60.212,172.16.60.213,172.16.60.214,172.16.60.215,172.16.60.216,172.16.60.217,172.16.60.218,172.16.60.219,172.16.60.220,172.16.60.221
 
2)使用sed实现多个字符串的替换。sed可以替换多个字符串,可以弥补tr的不足,后面g表示匹配多个。
[root@kevin ~]# cat test |xargs|sed 's/ /,/g'
172.16.60.211,172.16.60.212,172.16.60.213,172.16.60.214,172.16.60.215,172.16.60.216,172.16.60.217,172.16.60.218,172.16.60.219,172.16.60.220,172.16.60.221

##################  将一行内容按照字段分为多列  ################## 

[root@k8s-master01 ~]# cat a.txt
172.20.100.100,172.20.100.101,172.20.100.102,172.20.100.103,172.20.100.104,172.20.100.105,172.20.100.106

将逗号替换为换行
[root@k8s-master01 ~]# sed 's/,/\n/g' a.txt
172.20.100.100
172.20.100.101
172.20.100.102
172.20.100.103
172.20.100.104
172.20.100.105
172.20.100.106

[root@k8s-master01 ~]# sed -i 's/,/\n/g' a.txt
[root@k8s-master01 ~]# cat a.txt
172.20.100.100
172.20.100.101
172.20.100.102
172.20.100.103
172.20.100.104
172.20.100.105
172.20.100.106

##################  paste命令用法  ################## 
paste 命令用于合并文件的列,会把每个文件以列对列的方式,一列列地加以合并。

语法
paste [-s][-d <间隔字符>][--help][--version][文件...]

参数:
-d<间隔字符>或--delimiters=<间隔字符> : 用指定的间隔字符取代跳格字符。
-s或--serial:  串列进行而非平行处理。
--help:  在线帮助。
--version:  显示帮助信息。
[文件…]:  指定操作的文件路径

比如:
paste file testfile testfile1            #合并指定文件的内容 
paste file testfile testfile1  -d ":"    #合并指定文件的内容,并使用逗号隔开。-d后面的分隔符可以自行定义!
paste -s file     # 合并指定文件的多行数据。使用-s参数可以将一个文件中的多行数据合并为一行进行显示。

示例如下:
[root@kevin ~]# cat aa.txt
11
22
33
44
55
[root@kevin ~]# cat bb.txt
aa
ab
ac
cc
cd

使用paste命令将文件进行合并
[root@kevin ~]# paste aa.txt bb.txt
11 aa
22 ab
33 ac
44 cc
55 cd

合并后使用":"隔开
[root@kevin ~]# paste -d":" aa.txt bb.txt
11:aa
22:ab
33:ac
44:cc
55:cd

合并后使用"-"隔开
[root@kevin ~]# paste -d"-" aa.txt bb.txt
11-aa
22-ab
33-ac
44-cc
55-cd

paste -s 可以将一个文件中的多行内容合并为一行。例如:
[root@kevin ~]# cat file 
111
222
333
444
555
[root@kevin ~]# cat file |paste -s
111     222     333     444     555
[root@kevin ~]# cat file |paste -s -d":"
111:222:333:444:555
[root@kevin ~]# cat file |paste -s -d ":"
111:222:333:444:555
[root@kevin ~]# cat file |paste -s -d "-"  
111-222-333-444-555
[root@kevin ~]# cat file |paste -s -d "---"
111-222-333-444-555
[root@kevin ~]# cat file |paste -s -d ","  
111,222,333,444,555

看下面一个小需求:
有一个log.txt文件,第二列是ip,现在需要将log.txt文件中的ip列取出来放在一行,并用逗号隔开。

第一种做法:awk + paste
[root@kevin ~]# cat log.txt 
17:05 172.16.60.34 sadfjsafjsdf
17:14 172.16.60.35 asdfasudfasjfasjfklsafsaf
17:45 172.16.60.38 dsafkjdsajflsajfadf

[root@kevin ~]# cat log.txt 
17:05 172.16.60.34 sadfjsafjsdf
17:14 172.16.60.35 asdfasudfasjfasjfklsafsaf
17:45 172.16.60.38 dsafkjdsajflsajfadf

[root@kevin ~]# cat log.txt |awk '{print $2}'
172.16.60.34
172.16.60.35
172.16.60.38

[root@kevin ~]# cat log.txt |awk '{print $2}'|paste -s
172.16.60.34    172.16.60.35    172.16.60.38

[root@kevin ~]# cat log.txt |awk '{print $2}'|paste -s -d","
172.16.60.34,172.16.60.35,172.16.60.38

另一种做法是:awk + xargs + sed
[root@kevin ~]# cat log.txt |awk '{print $2}'
172.16.60.34
172.16.60.35
172.16.60.38
[root@kevin ~]# cat log.txt |awk '{print $2}'|xargs
172.16.60.34 172.16.60.35 172.16.60.38
[root@kevin ~]# cat log.txt |awk '{print $2}'|xargs|sed 's/ /,/g'
172.16.60.34,172.16.60.35,172.16.60.38

标签:xargs,中往,paste,cat,172.20,172.16,txt,root,kevin
来源: https://blog.51cto.com/u_10272167/2698378

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有