sed awk 这俩丑陋的东西,还有必要学么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
otmb
V2EX    程序员

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

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

    碰到这货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
    wakman660  
       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  
    PRO
       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 之类的现在解释器都支持。
    R4rvZ6agNVWr56V0
        65
    R4rvZ6agNVWr56V0  
       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     Solana     2414 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 15:35 PVG 23:35 LAX 08:35 JFK 11:35
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86