0

我必须从这个数据中 grep-test1.txt:

1 - Billing_Type
604 - Customer_Name
2 - Contact_Name
3 - Customer_Phone_Number
4 - Contact_Phone_Number
5 - Customer_Type
6 - Reason_Code
7 - CALLE 1
8 - CALLE 2
9 - NUMERO
10 - ID
11 - Service Address
1700001031 - Serial_Number
1700001008 - STB_REF_AP_ID
1700001027 - Smart_Card_ID

我在一个循环中比较文件的第一部分,例如 1700001031,等18然后将文件的第二部分复制到一个变量中,如Serial_Number, Billing_Type, CALLE 2.

这是我使用的语句:示例语句

grep -w 1 test1.txt | cut -d'-' -f2 |tr -d ' '

但是这个语句的问题是对于值 1 和 2 将输出两行。对于 1 作为 ID,它将打印:

Billing_Type
CALLE 1

因为 ATTR_NAME 还包含 'CALLE 1' 中的单词 value 1。

我如何只搜索第一部分并获得第二部分而不制作任何额外文件?

4

2 回答 2

4

awk您真的不想为此使用grep

$ awk -F' - ' '$1==1{print $2}' file
Billing_Type

$ awk -F' - ' '$1==7{print $2}' file
CALLE 1

$ awk -F' - ' '$1==1700001031{print $2}' file
Serial_Number

这将对第一个字段进行数字相等测试,如果该行匹配,则使用字段分隔符 $1打印第二个字段。$2-


GNU Grep您可以执行以下操作,但该方法awk绝对是要走的路:

$ grep -Po '^1\s+-\s+\K.*' file
Billing_Type

$ grep -Po '^7\s+-\s+\K.*' file
CALLE 1

$ grep -Po '^1700001031\s+-\s+\K.*' file
Serial_Number

这匹配字符串的开头,^然后是给定的数字,后跟一个或多个空格,破折号和更多空格\s+-\s+\K是符合 perl 的正则表达式的一部分,所以不要指望它被广泛使用,它的作用是使所有字符串中先前匹配的部分被遗忘。最后,我们匹配该行的其余部分,.*并且由于-o选项和\K.


的方法sed是匹配该行,然后用一个空字符串替换该行的开头:

$ sed -rn '/^1\s/{s/^[0-9]+\s+-\s+//p}' file
Billing_Type

$ sed -rn '/^7\s/{s/^[0-9]+\s+-\s+//p}' file
CALLE 1

$ sed -rn '/^1700001031\s/{s/^[0-9]+\s+-\s+//p}' file
Serial_Number
于 2013-09-26T07:21:21.670 回答
1

您只需要^在搜索 ID 号之前添加到您的命令

grep -w '^1' test1.txt | cut -d'-' -f2 |tr -d ' '
于 2013-09-26T07:30:47.237 回答