如何调用常见的bash命令集(即“find”,“xargs”和“grep”以查找文件中的文本)?


3

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

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

我希望能够使用像grepfindfile这样的自定义别名来回忆这个问题,然后查看bash中显示的上述命令集,就像从历史记录中提取最后一个命令一样。

或者我是否必须创建某种bash脚本?与bashrc文件一样,命令行用户是否共享其生产力脚本?他们叫什么?我最喜欢的bash 小部件

-

CF. 此处针对VIM询问的问题类型如何在vim中为查找和替换命令创建快捷方式?

Answers:


0

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

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

3

我投票支持老式的方法:在你的主目录中创建一个bin目录并将其添加到PATH(如果~/bin在登录时找到一个发行版,默认情况下会有一些发行版)。然后创建在那里可能会发现有用的任何脚本。

为什么?

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

  2. 如果更改登录脚本,如。* profile和。* shrc,则必须始终在第二个屏幕上执行登录,以验证拼写错误是否会阻止成功登录(烦人)。

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

初学者补充说明:

不要为非常简单的任务创建太多便利脚本或别名。将会有更难以记住所有脚本的时间,而不是记住它们基于的unix命令:-)


同样的想法+1我记得我自己的功能变量与学习命令本身。这表明我打算实施哪种解决方案,这有助于我以最大功率回忆和记忆命令!
xtian 2011年

1

我通常将这些命令放在我的〜/ bin目录中的bash脚本中。我喜欢使用比函数更好的脚本,因为脚本对我所有打开的shell都是立​​即可见的。

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

我还保留了一个非常大的bash历史文件,以便在我使用它们之后至少一周内可以从历史记录中获取命令。如果我发现我经常回忆相同的命令,我会把它放在一个脚本中。

我刚刚在超级用户的其他地方发现了这个解决方案,它使用bash history -s命令向bash历史记录中添加命令。该解决方案可能最接近您的原始请求。


对于我已经收集的命令集文件中使用grep的明显建议的+1。
xtian 2011年

1

首先将其缩短为

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 ...


+1全面概述。这是确定我将暂时继续抵制bash脚本的距离,只是因为我找到了[]; 然后对我的PHP思维来说很奇怪。
xtian 2011年

好的,那就写PHP吧。#!/usr/bin/env php...
grawity 2011年

嘿,你在吹我的脑海。我可以使用PHP与bash命令?并且,打印/回显提示?
xtian 2011年

只要安装了CLI版本,是的。例。但它有点受限。
grawity 2011年

1
哦,请注意grep -rfind ... -exec而不是那些不必要的xargs。
grawity 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.