V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
vision1900
V2EX  ›  Linux

awk 在 .zshrc 和在 zsh 里行为不一致问题

  •  
  •   vision1900 · 2021-01-18 12:55:56 +08:00 · 1963 次点击
    这是一个创建于 1165 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想写个扫描端口的 alias

    先在 zsh 里直接试: netstat -tln | awk '(NR>2) {print $4}

    输出是:

    0.0.0.0:80
    127.0.0.53:53
    0.0.0.0:443
    0.0.0.0:9000
    :::80
    :::9184
    :::60000
    :::9000
    :::9001
    

    在 .zshrc 里: alias sop="netstat -tln | awk '(NR>2) {print $4}'" source 之后 sop 的输出居然是:

    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::80                   :::*                    LISTEN     
    tcp6       0      0 :::9184                 :::*                    LISTEN     
    tcp6       0      0 :::60000                :::*                    LISTEN     
    tcp6       0      0 :::9000                 :::*                    LISTEN     
    tcp6       0      0 :::9001                 :::*                    LISTEN
    

    请问造成 awk 这种行为不一致的原因是什么呢? BTW, sop => scan open ports, 系统 Ubuntu 20.04 x86_64, VPS

    10 条回复    2021-01-18 16:25:08 +08:00
    lcdtyph
        1
    lcdtyph  
       2021-01-18 13:06:43 +08:00 via iPhone
    因为$4 在执行 alias 的时候就被代换成空字符串了,你需要在 alias 的时候把$给转译了
    debuggerx
        2
    debuggerx  
       2021-01-18 13:10:38 +08:00
    搜索引擎关键词: 'alias awk'
    pkookp8
        3
    pkookp8  
       2021-01-18 13:13:43 +08:00 via Android
    更像是 awk 没执行
    sammyM
        4
    sammyM  
       2021-01-18 13:48:17 +08:00
    应该这样写吧 alias sop='netstat -tln|awk "(NR>2){print \$4}"'
    vision1900
        5
    vision1900  
    OP
       2021-01-18 13:48:41 +08:00
    @pkookp8 还是执行了的,只是删除了 netstat 的前两行输出,哈哈
    vision1900
        6
    vision1900  
    OP
       2021-01-18 13:49:28 +08:00
    @lcdtyph 谢谢大佬,问题已经解决,我说 $4 的颜色和周围的字符不一样呢
    lcdtyph
        7
    lcdtyph  
       2021-01-18 13:50:30 +08:00 via iPhone
    @sammyM
    如果外面的 alias 用单引号,里面就不用转译
    Jirajine
        8
    Jirajine  
       2021-01-18 13:51:00 +08:00 via Android
    不要用 alias,用 function
    vision1900
        9
    vision1900  
    OP
       2021-01-18 13:51:45 +08:00
    @sammyM 是的,要转译美刀符,我搞了个简洁输出的版本出来:
    ```
    alias sop="netstat -tln | awk '(NR>2) {print \$4}' | rev | cut -d':' -f1 | rev | sort -n | uniq"
    ```
    vision1900
        10
    vision1900  
    OP
       2021-01-18 16:25:08 +08:00
    @Jirajine 试了下 function 确实可以,谢了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3017 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:00 · PVG 23:00 · LAX 08:00 · JFK 11:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.