从很长的行中提取多个子字符串

时间:2019-06-18 20:10:09

标签: linux string shell

我的一行文字格式很长:

http://address1/user1=username1;ip1=ipaddres1;password1=pass1;some text;http://address2/user2=username2;ip2=ipaddress2;password2=pass2;some text;...etc

我如何从此行中提取用户名(部分在user1 =,user2 =之后)和ip地址(部分在ip1 =,ip2 =之后)(该行中有超过20个用户名和ip地址)并将其放入两个文件中(user.txt,ip.txt)?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用grep查找匹配的部分,并使用cut删除=之前的内容:

grep -o 'user[0-9]=[^;]*' input.txt | cut -d= -f2- > user.txt
grep -o 'ip[0-9]=[^;]*'   input.txt | cut -d= -f2- > ip.txt

-o仅打印匹配的部分。如果同一行上有多个匹配项,则将它们打印到单独的行中。

答案 1 :(得分:0)

使用awk:要存储到单独的文件中:

gawk -v RS='some text' '{$1=$1;match($0,/user[0-9]+=([^;]+).*ip[0-9]+=([^;]+).*/,a);print a[1]>"username";print a[2] > "ipaddress"}' long_file

cat username
username1
username2


cat ipaddress
ipaddres1
ipaddress2

awk假设每个记录之间存在some text

或将grep-P一起使用:

grep -oP 'user[0-9]+=\K[^;]+' long_file > username
grep -oP 'ip[0-9]+=\K[^;]+' long_file >ip_address