使用 head 和 cut 的别名管道

Max*_* Li 4 bash alias

我想创建一个别名以快速查看带有逗号分隔符的表格格式文件:

alias thead='head | cut -d, -f1- | column -s, -t'
Run Code Online (Sandbox Code Playgroud)

后来像这样使用它

thead file.csv
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用。什么是正确的语法?

Kus*_*nda 10

对于比简单命令更高级的任何东西,请使用 shell 函数而不是别名:

thead () {
    head -- "$1" | cut -d, -f1- | column -s, -t
}
Run Code Online (Sandbox Code Playgroud)

这个 shell 函数将head在它的第一个参数上运行,然后通过管道发送结果(虽然,由于由于cut获取所有-f 1-,这部分可能会被删除;我将它保留在这里,因为你在原始文件中拥有它管道)。

或者,

thead () {
    head -- "$2" | cut -d "$1" -f1- | column -s "$1" -t
}
Run Code Online (Sandbox Code Playgroud)

... 能够将其用作

thead ',' filename
Run Code Online (Sandbox Code Playgroud)

甚至,为了允许可选的分隔符(如果没有给出,则使用逗号),

thead () {
    local delim=','

    if [ "$#" -gt 1 ]; then
        delim=$1
        shift
    fi
    
    head -- "$1" | cut -d "$delim" -f1- | column -s "$delim" -t
}
Run Code Online (Sandbox Code Playgroud)

上面的函数定义可以放在你通常定义别名的地方。


在别名中使用管道的问题在于,当您将别名与参数一起使用时,该参数将被添加到管道的末尾,而不是在管道中的第一个命令之后。


bash手册包含句子

对于几乎所有目的,别名都被 shell 函数取代。


Sté*_*las 10

alias 扩展只是由外壳再次解析的文本替换,因此当您执行以下操作时:

thead file.csv
Run Code Online (Sandbox Code Playgroud)

这只是替换为:

head | cut -d, -f1- | column -s, -t file.csv
Run Code Online (Sandbox Code Playgroud)

并再次解释。

如果你写过:

<file.csv thead
Run Code Online (Sandbox Code Playgroud)

或者

cat file.csv | thead
Run Code Online (Sandbox Code Playgroud)

或者

{ thead; } < file.csv
Run Code Online (Sandbox Code Playgroud)

它会起作用,因为它会被替换为:

<file.csv head | cut -d, -f1- | column -s, -t
cat file.csv | head | cut -d, -f1- | column -s, -t
{ head | cut -d, -f1- | column -s, -t; } < file.csv
Run Code Online (Sandbox Code Playgroud)

分别。无论如何,正如@Kusalananda 所说,为此使用函数或脚本比使用别名要好得多。在这里,我只想做:

thead() { head "$@" | cut -d, -f1- | column -s, -t; }
Run Code Online (Sandbox Code Playgroud)

所以你可以做thead -n 12 file.csv file2.csv例如。