Linux 使用awk、sed或cut过滤文本文件?

Linux 使用awk、sed或cut过滤文本文件?,linux,awk,sed,grep,cut,Linux,Awk,Sed,Grep,Cut,我正在努力解决这个问题 $ cat test.txt server1 ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com Search ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com Web ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com Web ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com server2

我正在努力解决这个问题

$ cat test.txt  
server1
ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2
ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2
ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
我需要这样的输出:

$ cat test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Search:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Web:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Web:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
server2:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
loaddb:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
ec2dd:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
server2:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
loaddb:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
使用sed: 此方法使用两个sed命令:

N从文件中读入第二行并将其附加到模式空间。这样,图案空间中始终有两条连续的线

s/\n/:/从模式空间的两行之间删除换行符,并用冒号替换

使用awk: 注:

NR%2==1{name=$1;next}

这将读取第一行和所有后续奇数行,并将第一个字段指定给变量名。然后它跳过其余的命令,跳转到下一行开始

打印名称:$0

在偶数行上,打印名称、冒号和当前行

使用纯壳 这里,一行从text.txt读入变量名,下一行读入变量行。然后,这两个字符之间用冒号打印。

使用sed: 此方法使用两个sed命令:

N从文件中读入第二行并将其附加到模式空间。这样,图案空间中始终有两条连续的线

s/\n/:/从模式空间的两行之间删除换行符,并用冒号替换

使用awk: 注:

NR%2==1{name=$1;next}

这将读取第一行和所有后续奇数行,并将第一个字段指定给变量名。然后它跳过其余的命令,跳转到下一行开始

打印名称:$0

在偶数行上,打印名称、冒号和当前行

使用纯壳 这里,一行从text.txt读入变量名,下一行读入变量行。然后这两个字符之间用冒号打印。

您只需使用粘贴命令

美元。Perl中的NR类似于awk中的NR。因此,它只接受奇数行,并将换行符替换为:仅在该特定行上。

您只需使用粘贴命令

美元。Perl中的NR类似于awk中的NR。因此,它只接受奇数行,并将换行符替换为:only on the specific line.

这个awk可以,但是如果您不完全理解它,请小心使用getline

awk '{a=$1;getline;print a":"$1}' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
这是一种更好的方法:

awk 'ORS=NR%2?":":RS' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
这个awk可以,但是如果您不完全理解它,请小心使用getline

awk '{a=$1;getline;print a":"$1}' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
这是一种更好的方法:

awk 'ORS=NR%2?":":RS' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

起初,您只是说不要使用getline函数。但现在您使用getline函数发布了一个答案。为什么?getline do在这个简单的输入中工作得很好,但是如果遇到更复杂的输入,它可能会失败,所以这是一个警告,提醒您在使用它时要小心。对于downvoter:没有必要在不说明原因的情况下给出-1。@AvinashRaj用更好的awk解决方案更新了帖子。起初,你只是说不要使用getline函数。但现在您使用getline函数发布了一个答案。为什么?getline do在这个简单的输入中工作得很好,但是如果遇到更复杂的输入,它可能会失败,所以这是一个警告,提醒您在使用它时要小心。对于downvoter:没有必要在不说明原因的情况下给出-1。@AvinashRaj用更好的awk解决方案更新了帖子。
perl -pe 's/\n/:/g if $.%2==1' file
awk '{a=$1;getline;print a":"$1}' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
awk 'ORS=NR%2?":":RS' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com