bash:grep只包含特定条件的行

bash:grep只包含特定条件的行,bash,awk,grep,Bash,Awk,Grep,我正在尝试grep出文件中第三个字段与某些条件匹配的行。 我试着使用grep,但没能通过文件中的一个字段过滤掉。 我有一个文件,里面有这样的记录: 12794357382;0;219;215 12795287063;0;220;215 12795432063;0;215;220 cat your_file | while read line; do if [ `echo "$line" | cut -d ";" -f 3` == "215" ]; then # This

我正在尝试grep出文件中第三个字段与某些条件匹配的行。 我试着使用grep,但没能通过文件中的一个字段过滤掉。 我有一个文件,里面有这样的记录:

12794357382;0;219;215
12795287063;0;220;215
12795432063;0;215;220
cat your_file | while read line; do
    if [ `echo "$line" | cut -d ";" -f 3` == "215" ]; then
        # This is the line you want
    fi
done
我只需要grep第三个字段等于215的行(在本例中,仅第三行)

非常感谢您的帮助

简单白鹭(
grep-E

放下锤子

$ awk -F ";" '$3 == 215 { print $0 }' <<< $'12794357382;0;219;215\n12795287063;0;220;215\n12795432063;0;215;220'
12795432063;0;215;220
$awk-F”“'$3==215{print$0}'grep:

在这种情况下,awk将更容易:

awk -F';' '$3==215' yourFile

像这样的怎么样:

12794357382;0;219;215
12795287063;0;220;215
12795432063;0;215;220
cat your_file | while read line; do
    if [ `echo "$line" | cut -d ";" -f 3` == "215" ]; then
        # This is the line you want
    fi
done

以下是第三个字段为215的行的sed版本:

sed -n '/^[^;]*;[^;]*;215;/p' file.txt

将第三个字段放在行的开头,简化您的问题:

cut -d ";" -f 3 file | paste -d ";" - file
然后
grep
查找与第三个字段匹配的行,并删除开头的第三个字段:

grep "^215;" | cut -d ";" -f 2-
然后你可以
grep
得到你想要的任何东西。因此,完整的解决方案是:

cut -d ";" -f 3 file | paste -d ";" - file | grep "^215;" | cut -d ";" -f 2- | grep _your_pattern_

优势:易于理解缺点:许多进程。

纯bash中的预处理解决方案,仍然需要
grep

while read line; do
  OLF_IFS=$IFS; IFS=";"
  line_array=( $line )
  IFS=$OLD_IFS
  test "${line_array[2]}" = 215 && echo "$line"
done < file | grep _your_pattern_
读行时
;做
OLF_IFS=$IFS;IFS=“;”
行数组=($line)
IFS=$OLD_IFS
测试“${line_数组[2]}”=215&&echo“$line”
完成
不错!非常感谢你!!我不知道你能用awk做到这一点。令人惊叹的!
{print$0}
在这里甚至是多余的。注意,这也会保留像
abc这样的行;def;0215;foo
为什么
awk
会优先于
grep
?我从来没用过awk。不知何故,它总是看起来像是一个偏僻的病房或是一个充满活力的房间。但是never aw esome.awk是为表格数据设计的,而grep更倾向于自由格式的文本。(如果OP需要)你不能通过使用
$3~/^215$/
匹配
。。。
0-d
有什么用?你知道最后一个字段总是三位数吗?您需要什么样的
-E
选项?+1在其他场景中有用的酷配方。另一个缺点是文件被读取了两次——但同时,我想磁盘缓存可以将影响降至最低。
while read line; do
  OLF_IFS=$IFS; IFS=";"
  line_array=( $line )
  IFS=$OLD_IFS
  test "${line_array[2]}" = 215 && echo "$line"
done < file | grep _your_pattern_