如何设置永久别名

How to set permanent alias

谁能帮我设置以下脚本为别名:

ps axu | awk '{print , , , }' | head -1 && ps axu | awk '{print , , , }' | sort -k3 -nr |head -20

我尝试在 .bashrc 行下添加文件

alias abc='ps axu | awk '{print , , , }' | head -1 && ps axu | awk '{print , , , }' | sort -k3 -nr |head -20'

但是运气不好,我遇到了以下错误

$abc
Usage: grep [OPTION]... PATTERN [FILE]... sort: read failed: /apps/: Is a directory Try 'grep --help' for more information.

我不知道 grep 的来源,但你的问题是引号不是那样嵌套的。

当您将单引号 awk 脚本放在别名的单引号内时,引号匹配不正确。

将每个 "inner" 单引号替换为 '\'',它应该可以工作。

alias abc='ps axu | awk '\''{print , , , }'\'' | head -1 && ps axu | awk '\''{print , , , }'\'' | sort -k3 -nr |head -20'

提示:不要调用 ps 两次:将输出通过管道传递给一组命令。作为一个函数,你将更少引用悲伤。

abc() {
    ps axu | awk '{print , , , }' | {
        IFS= read -r header && echo "$header"  # the first line
        sort -k3 -nr | head -20                # all the rest
    }
}

命令ps是非常可配置的。这两个命令几乎是等价的,你通过awk选择,并且配置了ps格式:

ps axu | awk '{print , , , }'
ps axopid,pcpu,pmem,comm

其中用户 u 格式已替换为特殊格式 o pid,pcpu,pmem,cmd。是相似的,不完全相同只是因为命令名称和一些格式。我们稍后再讲。

如果命令名称不是交易破坏者,ps 甚至可以使用 k 选项按某些选定的键进行排序,并且只选择 20 行我们得到:

ps axopid,pcpu,pmem,comm k-pmem | head -20

它取代了您初始命令的所有选择、排序和格式设置。我认为这应该足以满足所有实际用途。

但是如果您确实需要与原始输出相同的输出,我们需要扩展命令以显示所有参数。对于某些命令,这样的输出很长并且格式不正确。此外,您使用的 awk 处理无法通过普通 ps 复制。我们需要删除第一个 space 中的命令部分,并且为了获得更好的格式,我们需要一些 printf love。

总而言之,这得到了完全相同的输出(好吧,格式更好一点):

ps axopid,pcpu,pmem,cmd k-pmem | head -20 | awk '
    {gsub(/ .*/, "", ); printf "%5s %4s %4s %-.50s\n", ,,,}'

并且,只是将其设为单行以使其更易于使用 copy/paste:

ps axopid,pcpu,pmem,cmd k-pmem | head -20 | awk '{gsub(/ .*/, "", ); printf "%5s %4s %4s %-.50s\n", ,,,}'

如此一来,别名就变成了一行。

希望别名能够正常工作。