bash
  • macos
  • terminal
  • grep
  • zsh
  • 2016-04-21 25 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}' 
    
    相關問題