AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1529761
Accepted
Supr0
Supr0
Asked: 2020-03-03 13:46:26 +0800 CST2020-03-03 13:46:26 +0800 CST 2020-03-03 13:46:26 +0800 CST

SED 失败,为什么?

  • 772

另请参阅:字符串操作 - 在某个单词之后获取部分

我的脚本:

    # get list of curent possible F2B 'get' options, as a array (omitting the 'action..') ..
    f2b_opts_cmd="$(sudo fail2ban-client --help | grep -i 'get <jail>' | grep -vw 'act')"
    f2b_opts="$(sed -e "s/get\s<JAIL>\s\([^ ]*\).*/\1/" $f2b_opts_cmd | tr '\n' ' ')"
    echo $f2b_opts`  

我究竟做错了什么?这段代码只给了我一个完整的“sed: can't read ..”行列表??

顺便说一句,如果我使用管道结构:f2b_opts_cmd="$(sudo fail2ban-client --help | grep -i 'get <jail>' | grep -vw 'act' | sed -e "s/get\s<JAIL>\s\([^ ]*\).*/\1/" | tr '\n' ' ')" 它包括我认为被过滤掉的“动作”行?(在 cmdline 上执行时,它不包括那些“Action”行)

sed bash-scripting
  • 1 1 个回答
  • 118 Views

1 个回答

  • Voted
  1. Best Answer
    user1141630
    2020-03-03T20:26:04+08:002020-03-03T20:26:04+08:00

    编辑:只需阅读您之前的问题。其中提到了数组变量。作为f2b_opts_cmd字符串变量和f2b_optsbash 数组:

    f2b_opts_cmd=$(fail2ban-client -h | awk '/get <JAIL>/ && !/<ACT>/')
    f2b_opts=( $(awk '{print $3}' <<< "$f2b_opts_cmd") )
    echo "${f2b_opts[@]}"
    

    为什么以下不起作用:

    # get list of curent possible F2B 'get' options, as a array (omitting the 'action..')
    f2b_opts_cmd="$(sudo fail2ban-client --help | grep -i 'get <jail>' | grep -vw 'act')"
    
    f2b_opts="$(sed -e "s/get\s<JAIL>\s\([^ ]*\).*/\1/" $f2b_opts_cmd | tr '\n' ' ')"
    :                                                   ^
    echo $f2b_opts
    
    • 参数扩展$f2b_opts_cmd提供sed要读取的文件列表。相反,将参数扩展的结果定向到 的标准输入sed:
    f2b_opts=$(sed -e 's/get\s<JAIL>\s\([^ ]*\).*/\1/' <<EOF
    $f2b_opts_cmd
    EOF
    )
    

    bash为上述<< here-doc重定向提供了一个更简洁的替代方案,称为here-string:

    f2b_opts=$(sed -e 's/get\s<JAIL>\s\([^ ]*\).*/\1/' <<<"$f2b_opts_cmd")
    
    • grep -vw 'act'不起作用,因为您要过滤掉的行是大写字母 ( <ACT>)。用于-i忽略大小写,或指定具有适当大小写的模式grep -vw 'ACT'
      • 至于为什么在命令行上尝试它会起作用——我只能猜测你可能已经grep别名为grep -i
    • 无需sudo查看--help输出
    • 对参数使用单引号通常比双引号更容易——在双引号中,某些字符保留特殊含义 ( $ ` \)——在单引号'中只需要处理文字
    • 管道tr是不必要的。当bash扩展一个未引用的替换时,它会根据 shell 变量的值将结果拆分为单独的单词IFS(详见手册)
    • 一个管道... | grep | grep | sed通常可以由单个sed或awk脚本替换。sed从提供的原始脚本向后工作:
    f2b_opts=$(fail2ban-client -h | \
        sed -nE '/get <JAIL>/{/<ACT>/!s/(\s*\S*){3}.*/\1/p;}')
    

    awk似乎更容易使用:

    f2b_opts=$(fail2ban-client -h | awk '/get <JAIL>/ && !/<ACT>/{print $3}')
    
    • 0

相关问题

  • bash shell 脚本从包含引号的字符串中获取子字符串

  • sed 模式匹配日期

  • 如何在 Xubuntu 16.04.6 中对齐 ls 命令输出的列?

  • sed - 从一行中删除除最后一次出现的字符之外的所有字符

  • 解析 macOS plist 值

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve