bash:grep只包含特定条件的行
我正在尝试grep出文件中第三个字段与某些条件匹配的行。 我试着使用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
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_