使用 grep 查找文本文件中的特定行

使用 grep 查找文本文件中的特定行
     2              METEOROLOGICAL DATA                         VERSION /      
     8    PR    TD    HR    ZW    ZT    WD    WS    RI      # / TYPES OF   MOD/TYPE/ACC 
  3979316.8350  1050313.7180  4857065.7030      592.1910 PR SENSOR POS XYZ/H           
                                                            END OF HEADER 
 10  1  1  0  0 15  927.9    4.3   99.1                
 10  1  1  0  1 15  927.9    4.3   99.1                
 10  1  1  0  2 15  927.9    4.3   99.1                
 10  1  1  0 15 15  927.9    4.2   99.1               
 10  1  1  0 16 15  927.9    4.2   99.0                
 10  1  1  0 30 15  927.7    4.1   99.1                
 10  1  1  0 31 15  927.7    4.1   99.1                
 10  1  1  0 45 15  927.5    4.1   99.1                
 10  1  1  0 46 15  927.5    4.0   99.1                
 10  1  1  1  0 15  927.4    4.1   99.1                
 10  1  1  1  1 15  927.4    4.1   99.1                

在此文本数据示例中,如何按顺序提取“ END OF HEADER”部分后第五列数字数据中的所有 0,15,30,45,如下所示;

10  1  1  0  0 15  927.9    4.3   99.1  
10  1  1  0 15 15  927.9    4.2   99.1 
10  1  1  0 30 15  927.7    4.1   99.1 
10  1  1  0 45 15  927.5    4.1   99.1
10  1  1  1  0 15  927.4    4.1   99.1 

答案1

一个简单的例子是:

$ awk '$5 == '0' || $5 == '15' ||  $5 == '30' ||  $5 == '45' {print}' test.txt

正如 fedorqui 在下面的评论中提到的那样,更快的一行代码是:

$ awk '$5 ~ /^(0|15|30|45)$/' test.txt

语法解释:

$5  - the desired column from the text.
~   - the match symbol... matching was between the two slashes (/).
^/$ - the regex symbols indicating the beginning and end of the field.
|   - the or specifier for either item in the "()" group.

通过仅接受与符合匹配条件的项目相匹配的行来过滤标题~

答案2

grep尽管awk它是用于字段分离数据的首选工具,但它是完全可行的。

grep

grep -E '^10[[:blank:]]+([^[:blank:]]+[[:blank:]]+){3}(0|15|30|45)[[:blank:]]' file.txt
  • 10在开始处匹配,([^[:blank:]]+[[:blank:]]+){3}匹配接下来的 3 个字段,然后匹配第 5 个字段以获得所需的字段

如果你使用 PCRE ( -P),你可以[:blank:]用替换\s,这样看起来会比较好看:

grep -P '^10\s+([^\s]+\s+){3}(0|15|30|45)\s' file.txt     

例子:

$ cat file.txt                                        
    2              METEOROLOGICAL DATA                         VERSION /      
    8    PR    TD    HR    ZW    ZT    WD    WS    RI      # / TYPES OF   MOD/TYPE/ACC 
 3979316.8350  1050313.7180  4857065.7030      592.1910 PR SENSOR POS XYZ/H           
                                                           END OF HEADER 
10  1  1  0  0 15  927.9    4.3   99.1                
10  1  1  0  1 15  927.9    4.3   99.1                
10  1  1  0  2 15  927.9    4.3   99.1                
10  1  1  0 15 15  927.9    4.2   99.1               
10  1  1  0 16 15  927.9    4.2   99.0                
10  1  1  0 30 15  927.7    4.1   99.1                
10  1  1  0 31 15  927.7    4.1   99.1                
10  1  1  0 45 15  927.5    4.1   99.1                
10  1  1  0 46 15  927.5    4.0   99.1                
10  1  1  1  0 15  927.4    4.1   99.1                
10  1  1  1  1 15  927.4    4.1   99.1    

$ grep -E '^10[[:blank:]]+([^[:blank:]]+[[:blank:]]+){3}(0|15|30|45)[[:blank:]]' file.txt
10  1  1  0  0 15  927.9    4.3   99.1                
10  1  1  0 15 15  927.9    4.2   99.1               
10  1  1  0 30 15  927.7    4.1   99.1                
10  1  1  0 45 15  927.5    4.1   99.1                
10  1  1  1  0 15  927.4    4.1   99.1                

$ grep -P '^10\s+([^\s]+\s+){3}(0|15|30|45)\s' file.txt                         
10  1  1  0  0 15  927.9    4.3   99.1                
10  1  1  0 15 15  927.9    4.2   99.1               
10  1  1  0 30 15  927.7    4.1   99.1                
10  1  1  0 45 15  927.5    4.1   99.1                
10  1  1  1  0 15  927.4    4.1   99.1        

答案3

您可以使用sed和来执行此操作awk:(
假设您的主题文本位于名为的文件中example.txt

sed -n '/END OF HEADER/,${
/END OF HEADER/d
p
}' example.txt | awk '($5 == 0 || $5 == 15 || $5 == 30 || $5 == 45)'

归因 - awk 命令取自steeldriver 的评论

解释

塞德

  • 忽略一切/END OF HEADER/
  • /END OF HEADER/d意味着删除包含模式空间之外的行/END OF HEADER/,并且由于它不再位于模式空间中,因此下一个命令p将不会执行任何操作
  • p - 将每一行拉入模式空间后进行打印

awk 的

  • 如果第 5 列是 0 或 15 或 30 或 45 则打印它

相关内容