• 请不要在回答技术问题时复制粘贴 AI 生成的内容
otmb
V2EX  ›  程序员

sed awk 这俩丑陋的东西,还有必要学么?

  •  
  •   otmb · Jan 10, 2015 · 16928 views
    This topic created in 4315 days ago, the information mentioned may be changed or developed.

    碰到这货10年了,见到这俩,仍然感到十分恶心,不愿去学,
    想问下大神,这俩还有必要学么:)

    86 replies  •  2017-07-15 19:19:18 +08:00
    Sunyanzi
    Sunyanzi
    Jan 10, 2015
    1
    如果不学这两个 ... 你要用什么来替代这两个的功能呢 ...
    Draplater
    Draplater
    Jan 10, 2015
    2
    这两个东西很有用
    unasm
    unasm
    Jan 10, 2015
    3
    我工作中经常用到grep,从这个角度来说有一定学习的必要,但是没有必要太深入,够用就好
    otmb
    otmb
    OP
    Jan 10, 2015
    4
    @Sunyanzi 不能用高级脚本,如perl,python么?
    Busy
    Busy
    Jan 10, 2015
    5
    楼主没有这方面的需求吧,那当然没必要学
    likuku
    likuku
    Jan 10, 2015
    6
    awk 很好用啊...最简单的使用分隔符进行分列这个至少学下吧...
    0zero0
    0zero0
    Jan 10, 2015
    7
    遵循80/20法则,熟练掌握常用的几个sed/awk命令用不了多长时间,但可以起到很大的效果;
    用Perl、Python当然可以实现sed/awk的功能,不过这需要更多的键盘敲击量……
    otmb
    otmb
    OP
    Jan 10, 2015
    8
    awk跑不了:(
    E:\>echo a b c | awk '{print $2}'
    awk: '{print
    awk: ^ invalid char ''' in expression

    赶脚没错啊...
    likuku
    likuku
    Jan 10, 2015
    9
    @otmb

    likukus-MacBook:~ likuku$ echo a b c | awk '{print $2}'
    b
    gangsta
    gangsta
    Jan 10, 2015 via iPhone
    10
    楼主没看过编程珠玑?
    alansalexer
    alansalexer
    Jan 10, 2015
    11
    经常处理些字符串/文件,很方便,尤其一些小任务。
    至于用python/perl也可以,比如python有一个https://github.com/Russell91/pythonpy ,让你可以直接在终端的同一行内执行python任务。
    otmb
    otmb
    OP
    Jan 10, 2015❤️1
    12
    @likuku 试了下linux可以的,cygwin不行:(
    otmb
    otmb
    OP
    Jan 10, 2015
    13
    @gangsta 只看过标题,求细节:)
    besto
    besto
    Jan 10, 2015
    14
    提两个场景。
    1,debian中直接remove包会产生状态为rc的包(配置文件还在)如果去除系统里所有rc包?
    2,一个巨大的项目,现在需要把很多文件中字符串AAA替换成BBB如果做?
    soulgain
    soulgain
    Jan 10, 2015
    15
    同意 @Sunyanzi ,我也想不出有什么东西能替代。
    alexapollo
    alexapollo
    Jan 10, 2015
    16
    @besto 后者<c-h>是大部分IDE支持的功能。。。
    9hills
    9hills
    Jan 10, 2015 via iPhone
    17
    简单的说,就是爱用用……

    用Python也可以,自己选择呗。
    rrfeng
    rrfeng
    Jan 10, 2015
    18
    存在即合理
    besto
    besto
    Jan 10, 2015
    19
    @alexapollo 真的不知道c-h是啥功能。
    yakczh
    yakczh
    Jan 10, 2015
    20
    学python就够了, perl都不用学了
    KDr2
    KDr2
    Jan 10, 2015
    21
    perl one-liner rules them all.
    hanai
    hanai
    Jan 10, 2015
    22
    运维需要哦~
    est
    est
    Jan 10, 2015
    23
    @Sunyanzi perl 啊。一门语言代替awk sed grep
    zhicheng
    zhicheng
    Jan 10, 2015
    24
    现在都是自动化运维,各种云计算的流行也让单机承载的业务越来越少,这两个东西用到的机会会越来越小。
    Zhongwei
    Zhongwei
    Jan 10, 2015
    25
    晚上睡前抽出 1 小时看一下
    The AWK Programming Language
    http://book.douban.com/subject/1876898/
    你会发现,这一小时在未来会节省你百倍的时间
    binux
    binux
    Jan 10, 2015❤️1
    26
    用 python ,处理之前你还要写一个 xx.py 文件吗?
    otmb
    otmb
    OP
    Jan 10, 2015
    27
    @Zhongwei 看说明不过,还看书啊:(
    AWK真是懒婆娘的裹脚布,又臭又长啊:(
    ivvei
    ivvei
    Jan 10, 2015
    28
    没必要学了。有的是可以代替的。
    BGLL
    BGLL
    Jan 10, 2015
    29
    awk 还是很好的嘛,有人说“又臭又长”,但有人觉得一行流就是方便
    walkman660
    walkman660
    Jan 10, 2015
    30
    @otmb
    E:\>echo a b c
    echo出来的不对,得用linux上的echo来输出
    expexp
    expexp
    Jan 10, 2015
    31
    sed 真心是天天必备。
    luoweihua7sync
    luoweihua7sync
    Jan 10, 2015
    32
    你能理解做前端开发的都要用这2货查日志么。。。
    KentY
    KentY
    Jan 10, 2015 via Android
    33
    请定义丑陋与美好。
    你觉得美好的东西,学了多深
    Sunyanzi
    Sunyanzi
    Jan 10, 2015❤️1
    34
    @otmb @est perl 也好 Python 也罢 ... 用一门高级语言来替代命令能完成的事情你觉得靠谱么 ...

    我们换到 Windows 平台来说 ... exe 什么都能做到还要 bat 做什么 ...
    jecvay
    jecvay
    Jan 10, 2015
    35
    需要的! Python能实现但是也没这写起来这么快一句话搞定的.
    zxdy
    zxdy
    Jan 10, 2015
    36
    前两天有个日志解析脚本的优化,本来需要跑30多个小时,用了awk和sed之后,只花了2分半钟,楼主觉得有必要学吗
    nicai000
    nicai000
    Jan 10, 2015
    37
    AWK怎么丑啦!!!!!!!!!!!
    otmb
    otmb
    OP
    Jan 10, 2015
    38
    @zxdy 本来需要跑30多个小时,本来用啥实现的?
    vinceguo
    vinceguo
    Jan 10, 2015❤️1
    39
    谷歌sed tutorial第一条的网站里关于sed和awk的教程都很不错
    http://www.grymoire.com/Unix/Sed.html
    msg7086
    msg7086
    Jan 10, 2015
    40
    基本上你用高级语言来实现的话,就是在重新发明这几个工具而已。
    当然有时候用高级语言看起来更清晰点。
    但是有人觉得one liner更舒服更方便。
    est
    est
    Jan 10, 2015
    41
    @Sunyanzi bat免安装。exe要安装啊。

    问题是你找一个不带perl的发行版试试?

    同样的事,perl 也能做。sed awk grep不能做的perl也能做。凭啥不用perl。
    besto
    besto
    Jan 10, 2015 via Android
    42
    @est 可perl的缺点就是比这两货还丑23333
    uuspider
    uuspider
    Jan 10, 2015
    43
    这两个东西,对着文档练练手,也用不了多长时间吧。

    码农还怕丑陋?还怕“又臭又长”?
    lululau
    lululau
    Jan 10, 2015
    44
    Perl 基本可以替代 sed 和 awk 的功能,而且不用记 sed 和 awk 里面那些不一样的正则语法,但是缺点也十分明显,sed 和 awk 分别都只有 3 个字母,而 perl 是 4 个字母,效率立马下降 33%

    个人觉得对于简单到需要不到 20 个字符的 sed 或 awk 命令就能完成的任务来说,使用 sed 或 awk,对于更复杂的任务或者你记不清某个 meta-character 在 sed 或 awk 中是该转义还是不转义的时候就用 Perl
    sc
    sc
    Jan 10, 2015
    45
    @KDr2 握爪
    KentY
    KentY
    Jan 10, 2015 via Android
    46
    @lululau 如果不清楚正则,不知道什么时候该转意,什么时候不用,那和awk,sed没关系,是对正则知识的欠缺,不补早晚有天会暴露。而且对它不了解,使用上也得不到精妙。

    BTW,你说的那些不同的语法,其实是bre,ere,pcre的区别
    lululau
    lululau
    Jan 10, 2015
    47
    @KentY 博学!

    找了几个简单的 sed/awk one liner,翻译成对应的 perl 命令,熟悉 sed/awk 而对 Perl 不了解的同学可以感受下:

    1. gsed '/^$/d;G' filename

    perl -ne 'print unless /^$/' filename

    2. gsed 's/reg/replace/flags' filename

    perl -pe 's/reg/replace/flags' filename

    3. gsed '1!G;h;$!d' filename

    perl -e 'print reverse <>' filename

    4. gsed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

    perl -pe '$_=reverse'

    5. gawk '{print NR":"NF}' input.txt

    perl -alne 'print $., ":", @F+0' input.txt

    6. gawk '{print $NF}' input.txt

    perl -alne 'print $F[-1]'

    7. gawk 'NF > 2' input.txt

    perl -alne 'print if @F > 2'

    8. gsed -n 100,200p filename

    perl -ne 'print if 100..200' filename
    treo
    treo
    Jan 10, 2015
    48
    如果都10年了还没学,说明你没必要学,学了也记不住,这俩东西学习曲线太陡,一个月不碰就得重新翻man。现在还学这个的也就剩下运维和*nix狂热爱好者了吧
    zxdy
    zxdy
    Jan 10, 2015
    49
    @otmb 用了grep+sed,后来用截取字符串的办法处理每行,效率有了大概9倍的提升,但是经过测试发现实现的效率会随着日志变大而越来越低,可能是shell对大文件读取写入的IO有瓶颈,于是最后用了awk+sed,效果比较明显
    kotokz
    kotokz
    Jan 10, 2015
    50
    sed效率很一般,直接用perl吧
    Tinet
    Tinet
    Jan 10, 2015
    51
    居然说这两东西丑,在没有深入学习之前请不要这样说
    faywanghq
    faywanghq
    Jan 10, 2015
    52
    开房数据盛传之时下载了数据库文件,看了一天sqlserver怎么导入最终搞不定。之后在cygwin下awk一下就搞定了。
    Bruta
    Bruta
    Jan 10, 2015 via iPhone
    53
    这两个都是神器啊…
    anguskwan
    anguskwan
    Jan 10, 2015
    54
    还有比这更性感的么。。。
    FatGhosta
    FatGhosta
    Jan 10, 2015
    55
    我怎么觉得awk和sed是两个神器呢。。。
    Tink
    Tink
    Jan 10, 2015
    56
    我只会sed,但是我知道这俩货太有用了
    love
    love
    Jan 10, 2015
    57
    虽然写过很多bash脚本,但这二货只会用一点点,也不想去学了。现在写复杂的脚本直接上python了,又易调试又好写。
    reverland
    reverland
    Jan 10, 2015
    58
    有些地方……没有python啊。
    编译个python比编译个awk,sed费事些
    semicircle21
    semicircle21
    Jan 10, 2015
    59
    perl python 什么的都能替代, 仅在不能使用这些语言的时候有用, 我能想到两种情况:
    1. 嵌入式: 空间紧张.
    2. 面向很多机器的场景, 每个 image 少个 python, 整体就能省下很多了.
    这种东西实在没必要勉强学, 用到的时候就学, 用过了就自然忘~
    YORYOR
    YORYOR
    Jan 10, 2015
    60
    没想好怎么喷楼主,只跟windows打交道吧
    jarlyyn
    jarlyyn
    Jan 11, 2015
    61
    sed重度粉丝路过。
    没有sed基本都不知道该怎么写shell脚本了。
    xiaowangge
    xiaowangge
    Jan 11, 2015 via Android
    63
    日志解析利器。
    ysmood
    ysmood
    Jan 11, 2015
    64
    @binux 菊苣竟然不知道 python 的 -c 选项吗? 比如打印 “0”:python -c 'print 0' 。即使不用 -c 选项,用 pipe 也是可以的,如 echo 'print 0' | python。这种用法非常标准,ruby,lua,node 之类的现在解释器都支持。
    R4rvZ6agNVWr56V0
    R4rvZ6agNVWr56V0
    Jan 11, 2015
    65
    没必要,你觉得没有必要就真的没有必要。就像有的人认为英文对于他们自己也是没必要的那样。
    bugeye
    bugeye
    Jan 11, 2015
    66
    @est openwrt 不帶perl呢。由於我是perl党,我會裝,但很多人就不會裝了。
    otmb
    otmb
    OP
    Jan 11, 2015
    67
    @bugeye 么的,你用wrt搞啥?好玩么?
    bugeye
    bugeye
    Jan 11, 2015
    68
    @otmb 也就是多撥什麼的,讓ISP們討厭而已。
    bugeye
    bugeye
    Jan 11, 2015
    69
    又想到一個沒有perl的發行版,android.
    otmb
    otmb
    OP
    Jan 11, 2015
    70
    @bugeye 多播对电信光纤有效么?
    bugeye
    bugeye
    Jan 11, 2015
    71
    @otmb 由于我这边不是光纤,不清楚。听说不容易,一般只能2-3拨。不像网线进来,5拨,30拨都能实现。
    otmb
    otmb
    OP
    Jan 11, 2015
    72
    @bugeye 进来就是网线?
    bugeye
    bugeye
    Jan 11, 2015
    73
    @otmb 是啊,光纤到楼100M,进来网线,但因为可以多拨,所以可以把100M进线占满,也就是这样了。再多没有了。
    orzfly
    orzfly
    Jan 11, 2015
    74
    cmd 是不支持单引号字符串的,如果你非要用 cmd 来调用 awk,请记得用双引号。以及 cmd 的转义字符是 ^ 不是 \,这个也请记住免得等会双引号里想用双引号……

    或者你可以在 cmd 里先打开 bash 再说……
    nowcoder
    nowcoder
    Jan 11, 2015
    75
    越丑越贤惠
    binux
    binux
    Jan 11, 2015
    76
    @ysmood -c 里面怎么写 for 循环?
    9hills
    9hills
    Jan 11, 2015 via iPhone
    77
    @lululau 从你的例子,感觉Perl比awk和sed要变态的多。。。

    话说最近喜欢用oneline python 某些场景该可以,就是实在是太多字母了
    9hills
    9hills
    Jan 11, 2015 via iPhone
    78
    @binux -c 中for循环一般用list comprehension替代,当然大多数情况下会变得很丑。。
    ysmood
    ysmood
    Jan 11, 2015
    79
    @binux 写了另一个主题讨论这个问题,http://v2ex.com/t/161060,不知道会不会有用。比如 haskell 语言是没有 for 循环的,很多情况下我代码里不用 for 循环也能用函数式编程的方法解决大部分问题。ruby 和 python 已经很函数式了。map reduce 就能搞定很多常规问题了。
    binux
    binux
    Jan 11, 2015
    80
    @9hills 写过 switch 呢?反正我觉得不如用 awk
    Xbluer
    Xbluer
    Jan 11, 2015
    81
    生产系统是IBM的AIX。不让装Python、Ruby,不用这俩货没得用啊。
    Narcissu5
    Narcissu5
    Jan 11, 2015
    82
    话说每次有人跟我说“Posix命名比windows科学”的时候,我就想吐槽:你知道awk代表什么么?
    otmb
    otmb
    OP
    Jan 11, 2015
    83
    @Xbluer 不让装Python、Ruby,为啥?
    Xbluer
    Xbluer
    Jan 11, 2015
    84
    @otmb Bank系统,不让随便装这类开源软件。领导们认为这玩意不安全,你信么。其实吧,就是没有大公司背书,怕出了问题担责任。
    leafonsword
    leafonsword
    Jan 13, 2015
    85
    简单地列匹配提取用q
    http://harelba.github.io/q/
    复杂的文本处理用Python就行了
    raawaa
    raawaa
    Jul 15, 2017
    86
    非常有用。
    我自己用 javascript 写了一个抓 AV 磁力链接的脚本。抓回来的链接都按番号存在子文件夹里。用 awk 批量处理之后直接喂给 transmission 去下载,节约了我不少生命。现在除了硬盘越来越吃紧之外,我觉得十分满足。Linux 真好。💖
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5604 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 295ms · UTC 02:34 · PVG 10:34 · LAX 18:34 · JFK 21:34
    ♥ Do have faith in what you're doing.