为什么我的awk打印内容未显示在终端上

时间:2018-08-19 21:07:16

标签: bash awk

我有以下脚本,该脚本在命令上执行“ which -a”,然后执行“ ls -l”,让我知道它是否是链接..即“ grep”,因为我安装了gnu命令(Mac使用iTerm)。

#!/usr/bin/env bash
which -a $1 | xargs -I{} ls -l "{}" \
| awk '{for (i = 1; i < 9; i++) $i = ""; sub(/^ */, ""); print}'

当我从脚本“ test grep”运行它时,我没有收到任何输出,但是当我通过“ bash -x test grep”运行它时,我收到了以下信息:

bash -x test grep
+ which -a grep
+ xargs '-I{}' ls -l '{}'
+ awk '{for (i = 1; i < 9; i++) $i = ""; sub(/^ */, ""); print}'
/usr/local/bin/grep -> ../Cellar/grep/3.1/bin/grep
/usr/bin/grep

最后两行是我要显示的内容。认为这样做会更容易;-) ..我还尝试附加管道,认为printf将解决此问题:

| while read path
do
   printf "%s\n" "$path"
done

感谢和..有没有更好的方法来获取我需要的东西?

4 个答案:

答案 0 :(得分:1)

问题是您将脚本命名为test

如果您要运行PATH中没有的命令,则需要指定它所在的目录,例如./test

尝试运行test不会出错,因为有一个内置的名为test的bash命令被使用。为了进一步避免混淆,标准test不产生任何输出。

结论:

  • 使用./在当前目录中运行脚本。
  • 切勿调用您的测试程序test

答案 1 :(得分:1)

感谢从未命名脚本“测试” ..旧习惯很难打破(我来自非unix背景。

我以以下内容结束

for i in $(which -a $1)
do
   stat $i | awk NR==1{'$1 = ""; sub(/^ */, ""); print}'
done

或更简单

for i in $(which -a $1)
do
  stat -c %N "$i"
done

答案 2 :(得分:1)

考虑以下shell函数:

cmdsrc() {
  local cmd_file cmd_file_realpath
  case $(type -t -- "$1") in
    file) cmd_file=$(type -P -- "$1")
          if [[ -L "$cmd_file" ]]; then
            echo "$cmd_file is a symlink" >&2
          elif [[ -f "$cmd_file" ]]; then
            echo "$cmd_file is a regular file" >&2
          else
            echo "$cmd_file is not a symlink or a regular file" >&2
          fi
          cmd_file_realpath=$(readlink -- "$cmd_file") || return
          if [[ $cmd_file_realpath != "$cmd_file" ]]; then
            echo "...the real location of the executable is $cmd_file_realpath" >&2
          fi
          ;;
    *)    echo "$1 is not a file at all: $(type -- "$1")" >&2 ;;
  esac
}

...如此使用:

$ cmdsrc apt
/usr/bin/apt is a symlink
...the real location of the executable is /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/apt
$ cmdsrc ls
/bin/ls is a regular file
$ cmdsrc alias
alias is not a file at all: alias is a shell builtin

答案 3 :(得分:0)

提出一些建议,并提出以下建议: prt下划线只是一个精美的printf函数。我决定不使用readline,因为最终命令解析可能对我来说并不陌生,而且我只处理常规文件..因此无法处理所有情况,但最终却提供了我一直在寻找的输出。感谢您的所有帮助。

llt ()
{
    case $(type -t -- "$1") in
        function)
            prt-underline "Function";
            declare -f "$1"
        ;;
        alias)
            prt-underline "Alias";
            alias "$1" | awk '{sub(/^alias /, ""); print}'
        ;;
        keyword)
            prt-underline "Reserved Keyword"
        ;;
        builtin)
            prt-underline "Builtin Command"
        ;;
        *)

        ;;
    esac;
    which "$1" &> /dev/null;
    if [[ $? = 0 ]]; then
        prt-underline "File";
        for i in $(which -a $1);
        do
            stat "$i" | awk 'NR==1{sub(/^  File: /, ""); print}';
        done;
    fi
}