如何从文件中搜索和剪切字符串?

N. *_*ouk 2 command-line bash sed awk text-processing

我正在尝试编写一个带有类似选项和参数的程序:

./program.sh -f <filename> -string <string>
Run Code Online (Sandbox Code Playgroud)

该程序应该输出<filename>其开头的行,<string>如下所示:

 grep ^<string> <filename> 
Run Code Online (Sandbox Code Playgroud)

另外,它应该返回一些与字符串相关的信息,例如以下示例输入文件中的姓名和年龄:

string name age sex
Akdk john 22 male
Jrtkfp miah 26 female
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这样的行为?

des*_*ert 6

像这样简单的操作可以使用 oneliner 完成,您不需要为此编写整个脚本。我会使用一个函数,您可以将其放入~/.bash_aliases文件中,以便在您打开的每个终端中加载它。

function_name(){ awk /^$2/'{print $1": "$2", "$3}' $1 ;}
Run Code Online (Sandbox Code Playgroud)

这允许您调用function_name <filename> <string>并获得如下所示的结果:

$ cat test
string name age sex
Akdk john 22 male
Jrtkfp miah 26 female

$ function_name test Akdk
Akdk: john, 22
Run Code Online (Sandbox Code Playgroud)

如您所见,您无需任何选项即可实现此目标,仅使用参数要简单得多。如果您以某种方式需要选项,我推荐本教程本文

说明

  • function_name(){ … ;}-定义功能function_name这确实
  • awk /^$2/'{…}' $1– 在作为函数的第一个参数给出的文件 ( $1) 中搜索以函数^的第二个参数 ( $2)开头的行 ( )并使用它
  • awk '{print $1": "$2", "$3}' – 打印第一列(空格分隔),然后是“:”,然后是第二列,然后是“,”,然后是第三列

注意:例如,$1对于bash(运行您的终端的内容)具有不同的含义awk:第一个将其扩展为您提供的第一个参数,第二个将其解释为第一列的快捷方式。这就是为什么我们需要'awk'sprint命令周围加上单引号 ( )的原因,这种方式bash不会扩展,$1而是让它原封不动地进行awk解析。