V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
otmb
V2EX  ›  程序员

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

  •  
  •   otmb · 2015-01-10 16:19:22 +08:00 · 15174 次点击
    这是一个创建于 3640 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    赶脚没错啊...
    likuku
        9
    likuku  
       2015-01-10 16:43:50 +08:00
    @otmb

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

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

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

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

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

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

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

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

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

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