如何在文件中的特定列中搜索shell中的字符串?

时间:2014-01-18 15:12:21

标签: linux bash shell unix scripting

我正在学习shell脚本。我编写了一个脚本,用以下标签分隔格式

索引当前工作目录中的所有文件和文件夹

路径文件名文件/目录上次修改日期大小文本文件(是/否)

例如,我的文件'index.txt'中的两行是

home/Desktop/C    C    d    Thu Jan 16 01:23:57 PST 2014    4 KB    N
home/Desktop/C/100novels.txt    100novels.txt    f    Thu Mar 14 06:04:06 PST 2013    0 KB Y

现在,我想编写另一个脚本来搜索上一个文件中的文件,该文件包含命令行参数,即文件名。还有可选参数-dir(如果只搜索目录),-date DATE(最后修改日期),-t(仅限文本文件)等。如何解决这个问题?

我知道在文件中搜索字符串的grep命令,但假设我输入了文件名,它会在整个文件中搜索文件名,而不是只搜索文件名列。我该怎么做呢?还有其他命令来实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

“我想在特定字符串的特定列中搜索...怎么做?”

例如,要搜索目录:

awk -F '\t' '$3 == "d"' filename

您还可以通过正则表达式或子字符串匹配进行搜索。请在学习时发布更多问题。

单引号可防止变量替换(以及其他形式的扩展) - see the bash manual。所以你必须通过其他方式传递价值:

awk -F'\t' -v s="$search_file" '$2 == s' ./index.txt > final.txt

或者,使用双引号,更脆弱,更难阅读IMO

awk -F'\t' "\$2 == \"$search_file\"" ./index.txt > final.txt

此外,您不要混用单引号和双引号。根据您需要的功能选择一个或另一个。

答案 1 :(得分:0)

您可以使用命令awk。例如,使用awk打印文件的第一列:

awk -F ":" '{print $1}' /etc/passwd 

(请注意,-F标志是为列选择字段分隔符,在您不需要的情况下)。然后,您可以使用grep在该列中进行过滤。祝你好运!