我正在尝试输出包含特定字符串的行
行的示例:
Column1:Column2:Column3 + ID
Column1:Column2:Column3 - ID
Column1:Column2:Column3
期望的输出:
Column1:Column2:Column3 + ID
尝试-
awk -F: '$3 == + ID' < file.txt > out.txt
它不返回任何输出,因为它在第 3 列中搜索精确的“ + ID ”而没有任何其他输入
现在我知道我可以做
grep -f " + ID" <file.txt >out.txt
但如果 + ID 不在第 3 列中,那么它将输出包含 + ID 的任何行,示例如下
输出:
Column1:Column2 + ID:Column3
注意 + ID 是在第 2 列而不是第 3 列中
现在我还想在一个目录中执行此操作,搜索所有文件而不仅仅是一个特定的 .txt
答案1
您可以使用锚定到字段末尾的正则表达式匹配来代替字符串匹配:
awk -F: '$3 ~ /+ ID$/' < file.txt
Column1:Column2:Column3 + ID
或锚定到行尾,使用grep
:
grep '+ ID$' < file.txt
Column1:Column2:Column3 + ID
答案2
grep -Pie '(Column\d:?){3} + ID$' file.txt > out.txt
例如,如果 Column1:模式重复超过 3 次,则修改{3,}
上面的内容
答案3
这可以通过
find dir -type f -exec grep -H '+ ID$' {} +
这将找到目录中或目录下的所有常规文件dir
,然后grep -H '+ ID$'
尽可能多地批量运行这些文件。结果将包含与正则表达式匹配的文件的文件名以及匹配的文件中的行。
要仅获取文件名,请使用-l
代替-H
with grep
,如果仅获取匹配的行,请使用-L
。
正则表达式+ ID$
将匹配文件中+ ID
在行尾包含确切字符串的任何行。
或者,没有find
但带有grep
能够递归到子目录的 a :
grep -R '+ ID$' dir
grep
在具有不执行此操作的系统上-H
(这是一个非标准选项),您可以使用
find dir -type f -exec grep '+ ID$' /dev/null {} +
如果您只想在这样的系统上匹配行(而不是文件名),请将cat
文件放在一起并 grep :
find dir -type f -exec cat {} + | grep '+ ID$'
答案4
您可以像这样使用 substr:
awk '{ if (substr($0,position,length)=="+ ID" { print $0 } }' myfile.txt