我正在学习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命令,但假设我输入了文件名,它会在整个文件中搜索文件名,而不是只搜索文件名列。我该怎么做呢?还有其他命令来实现这个目标吗?
答案 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在该列中进行过滤。祝你好运!