如何调用常见的 bash 命令集(例如“find”、“xargs”和“grep”来在文件中查找文本)?

如何调用常见的 bash 命令集(例如“find”、“xargs”和“grep”来在文件中查找文本)?

为了定制我的 bash 用户体验,有没有办法使用 .bashrc 来调用常见的命令集。例如,我发现这组命令可以在文本文件中查找搜索字符串,

find /directory -type f -print0 | xargs -0 grep -i 'search string'

我希望能够使用自定义别名(如 grepfindfile)来调用它,然后查看上面的内容命令集在 bash 中显示的方式与从历史记录中提取最后一条命令的方式相同。

或者我必须创造某种bash 脚本? 像 bashrc 文件一样,命令行用户是否共享他们的生产力脚本?它们叫什么?我最喜欢的派对小工具

--

CF。这里问的 VIM 问题类型相同如何在 vim 中创建查找和替换命令的快捷方式?

答案1

您可以在 .bashrc 中创建一个函数,如下所示:

searchString ()
{
  if [ "$1" ] ; then
    find /directory -type f -print0 | xargs -0 grep -i "$1"
  else
    echo "usage ..."
  fi
}

答案2

我支持老式的方法:在您的主目录中创建一个 bin 目录并将其添加到 PATH(某些发行版如果~/bin在登录时找到,将默认执行此操作)。然后在其中创建您可能觉得有用的任何脚本。

为什么?

  1. 别名和 shell 函数很不错,但通常只能在 Shell 本身中使用它们。您无法从其他程序(如 xargs)或 shell 调用它们。但脚本文件则不然。您可以像调用任何其他 UNIX 命令一样调用它们,没有任何限制。如果使用 #!/bin/usedshell 进行编码,则当前 shell 无关紧要,也可以从任何其他 shell 调用它们。

  2. 如果有人修改了诸如 .*profile 和 .*shrc 之类的登录脚本,则必须在第二个屏幕上执行登录以验证输入错误不会阻止成功登录(很烦人)。

  3. 如果我必须在其他用户环境中工作,我只需将我的 bin 目录附加到 PATH 即可立即使用我的脚本,而无需修改其他环境设置。

初学者补充说明:

不要为非常简单的任务创建太多方便的脚本或别名。总有一天,记住所有自己的脚本会比记住它们所基于的 unix 命令更困难 :-)

答案3

我通常将此类命令放在 ~/bin 目录中的 bash 脚本中。我更喜欢使用脚本而不是函数,因为脚本对于我打开的所有 shell 来说都是立即可见的。

对于我不经常使用或每次都需要修改的命令,我有一个使用 grep 搜索的命令行文件,然后只需将其从屏幕复制并粘贴到命令行即可。

我还保存了一个非常大的 bash 历史文件,这样在使用命令后至少一周内都可以从历史记录中获取它们。如果我发现自己经常调用同一个命令,我会把它放到脚本中。

我刚刚发现此解决方案在超级用户中的其他地方使用 bashhistory -s命令将命令添加到您的 bash 历史记录中。该解决方案可能最接近您的原始请求。

答案4

首先将其缩短为

grep -ir 'search string' /directory

-r选项用于递归模式。

:-)


一般来说,缩短命令有三种方法。

  1. 别名:非常基础,只允许替换命令。可以输入~/.bashrc

    alias ll="ls -lFh"
    alias md="mkdir"
    

    将扩展ll ~/musicls -lFh ~/music

    别名也有优势——它们可以内联扩展;你只需要为此配置一个键盘快捷键。例如,将以下内容放入你的~/.inputrc

    "\e[1;3C": alias-expand-line
    

    这对应于键AltRight →

  2. 对于更复杂的事情(多个命令,参数)–功能允许使用标准语法功能;同样适用于~/.bashrc

    count() {
        sort "$@" | uniq -c | sort -n -r
    }
    

    这些可以包含多个命令、设置变量、设置条件……任何可以在 shell 脚本中执行的操作。但是,它们不能内联扩展。

  3. 外部的脚本– 几乎与函数相同,但没有foo() { ... }并且在单独的文件中。(~/bin是一个受欢迎的位置。)

    #!/bin/bash
    post() { curl -sF "sprunge=<$1" http://sprunge.us/; }
    
    if [ -z "$1" ]; then
            file=$(mktemp /tmp/sprunge.XXXXXXXX)
            cat > "$file"
            if [ -s "$file" ]; then
                    post "$file"
            else
                    echo "stdin empty" >&2
            fi
            rm -f "$file"
    else
            for file; do
                    echo -n "$file →"
                    post "$file"
            done
    fi
    

    将脚本放在单独的文件中有一个好处:它们不局限于bash功能。许多我先用bash脚本开始,然后用 Python 重写,后来又变成了 Perl……

相关内容