grep 从分隔符之前的行的第一部分开始

sub*_*989 0 shell grep

我必须从此数据 test1.txt 中 grep :

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
Run Code Online (Sandbox Code Playgroud)

我正在循环中比较文件的第一部分,例如 1700001031,等,然后将文件的第二部分复制到变量中1,例如,,。8Serial_NumberBilling_TypeCALLE 2

这是我使用过的声明:示例声明

grep -w 1 test1.txt | cut -d'-' -f2 |tr -d ' '
Run Code Online (Sandbox Code Playgroud)

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

Billing_Type
CALLE 1
Run Code Online (Sandbox Code Playgroud)

因为 ATTR_NAME 还包含“CALLE 1”中的字值 1。

我如何仅在第一部分中搜索并获取第二部分而不创建任何额外的文件?

Chr*_*our 5

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
Run Code Online (Sandbox Code Playgroud)

这对第一个字段进行数字相等测试,如果该行匹配,则使用字段分隔符$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
Run Code Online (Sandbox Code Playgroud)

这匹配字符串的字符串的开头^,然后给定的数字后跟一个或多个空格,破折号和多个空格\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
Run Code Online (Sandbox Code Playgroud)