如何使用 grep、sed、awk 或其他 Linux 工具或 bash 脚本在文件的每一行中搜索序列“\t$month\t$day\n”,其中...
\t = tab
\n = new line
$month = Sep #$month is a variable with the content “Sep”
$day = 4 #$day is a variable with the content “4”?
使用 grep,我可以分别找到 \t、\n、$month 和 $day,但为了减少误报,我希望工具在文件的每一行中搜索组合“\t$month\t” $day\n”,并在匹配时将行发送到标准输出,即控制台。
如何搜索文件每行的组合“\t$month\t$day\n”,并使工具将每个匹配行输出到控制台?
示例:以下是文件“start-with-core”的内容
$ cat start-with-core
core4321 Sep 3
core.1234 Nov 4
core4 Sep 4
core10 Sep 4
core11 Nov 4
core44 Sep 2
core400 Sep 3
第一个字段(列)后有一个制表符,第二个字段后有一个制表符,第三个字段后有一个换行符。
$ echo $month
Sep
$ echo $day
4
$ grep $'\n' start-with-core
core4321 Sep 3
core.1234 Nov 4
core4 Sep 4
core10 Sep 4
core11 Nov 4
core44 Sep 2
core400 Sep 3
$ grep $'\t' start-with-core
core4321 Sep 3
core.1234 Nov 4
core4 Sep 4
core10 Sep 4
core11 Nov 4
core44 Sep 2
core400 Sep 3
$ grep "$month" start-with-core
core4321 Sep 3
core4 Sep 4
core10 Sep 4
core44 Sep 2
core400 Sep 3
$ grep "$day" start-with-core
core4321 Sep 3
core.1234 Nov 4
core4 Sep 4
core10 Sep 4
core11 Nov 4
core44 Sep 2
core400 Sep 3
有任何想法吗?谢谢!学生
///\\
答案1
grep
查找与模式匹配的行,因此您似乎想要查找符合以下条件的行:结尾在\t$month\t$day
。
所以:
TAB=$(printf '\t') # or TAB=$'\t' with many shells
grep "$TAB$month$TAB$day\$" < your-file
其中$
(此处已转义,因为 shell 会使用它来进行参数扩展,即使在大多数 shell 中,后跟 时不转义是安全的"
),匹配主题末尾。
awk
适合处理表格数据。您可以使用它来匹配最后一个字段$day
和倒数第二个字段的行$month
:
M=$month D=$day awk -F '\t' '
$NF == ENVIRON["M"] && $(NF-1) == ENVIRON["D"]
' < your-file
awk
==
如果两个操作数看起来都像数字并且没有像这里那样显式键入为字符串,则进行数字比较,因此它会匹配 on但也会Sep
4
匹配Sep
04
// 4.0
...4e0