bash
  • macos
  • terminal
  • grep
  • zsh
  • 2016-04-21 110 views 2 likes 
    2

    现在一些在我的.zshrc文件中的代码看起来是这样的:如何将一系列bash命令定义为字符串?

    inetFunction(){ 
        echo ${LRED}IP Address:${NC} 
        ifconfig en0 | grep "inet " | awk '{print $2}' 
    } 
    

    $ LRED被定义为改变颜色以淡红色,并且$ NC又回来将它设置为正常。我使用代码alias inet='inetFunction'实现inetFunction。该命令的输出为

    IP Address: 
    xx.x.xx.xxx 
    

    其中“IP地址:”为红色。我想使IP地址绿色的,但由于某些原因,当我尝试任何这些,这是行不通的:

    ${GREEN}ifconfig en0 | grep "inet " | awk '{print $2}' 
    
    ifconfig en0 | grep "inet " | ${GREEN}awk '{print $2}' 
    
    ${GREEN}ifconfig en0 | grep "inet " | awk '{${GREEN} print $2}' 
    

    我甚至尝试了整个事情设置一个变量,如:

    variable='ifconfig en0 | grep "inet " | awk '{print $2}'' 
    

    然后试图做echo ${GREEN} $variable,但它仍然不起作用。

    任何想法?

    +3

    你知道的grep | awk的是一个愚蠢的反模式? awk可以执行grepping:'ifconfig en0 | awk'/ inet/{print $ 1}''。节省昂贵的叉子和管道。 – Jens

    回答

    2

    $GREEN需要呼应。这是一套ANSI颜色代码,您的终端将其识别为改变文本颜色的信号。

    echo -n "$GREEN" 
    ifconfig en0 | grep "inet " | awk '{print $2}' 
    echo -n "$NC" 
    

    或者,浓缩:

    echo "$GREEN$(ifconfig en0 | grep "inet " | awk '{print $2}')$NC" 
    

    此外,作为@Jens指出,你可以结合像grep和awk的命令,以便:

    echo "$GREEN$(ifconfig en0 | awk '/inet/{print $2}')$NC" 
    
    0

    正如John Kugelman's answer${GREEN}需求已经指出为了起作用而被打印。

    当你正在运行awk无论如何,你可以让它做的工作:

    ifconfig en0 | awk '/inet/{print "'${GREEN}'" $2 "'${NC}'"}' 
    ifconfig eno1 | awk "/inet/{print \"${GREEN}\" \$2 \"${NC}\"}" 
    

    这使得更多的控制什么颜色的,特别是更复杂的awk程序。

    很明显,所需的引用是美丽的。需要从shell引用$2,以便可以通过awk进行识别。不得从shell中引用${GREEN}${NC},以便它们可以被shell替换。但因为它们现在只是awk的字符串,所以它们需要放在双引号内awk;这些双引号还需要从shell引用。

    要simplyfy这一点,你可以在命令行上通过设置变量awk-v variable=value参数:

    ifconfig en0 | awk -v green="$GREEN" -v nc="$NC" '/inet/{print green $2 nc}' 
    
    相关问题