# awk从放弃到入门（2）：awk分隔符

- 24

- A+

所属分类：Linux基础

在本博客中，AWK是一个系列文章，本人会尽量以通俗易懂的方式递进的总结awk命令的相关知识点。

awk系列博文直达链接：AWK命令总结之从放弃到入门（通俗易懂，快进来看）

在前一篇文章中我们略微提到过"分隔符"，但是并没有细说，那么我们今天就聊聊什么是分隔符，awk有哪些分隔符，awk的默认分割符是空格，但是，这样描述并不精确，因为，awk的分隔符还分为两种，"输入分隔符" 和 "输出分隔符" 。

此处我们先将分隔符的概念列出，看不懂没关系，我们会一一进行举例，到时自然会明白。

输入分隔符，英文原文为field separator，此处简称为FS

输入分割符，默认是空白字符(即空格)，awk默认以空白字符为分隔符对每一行进行分割。

输出分割符，英文原文为output field separator，此处简称为OFS

awk将每行分割后，输出在屏幕上的时候，以什么字符作为分隔符，awk默认的输出分割符也是空格。

光看概念是不是不容易搞明白？没关系，我们来动手实践一下，胜过千言万语。

## 输入分隔符

我们现在通过一些小例子，搞明白这两个分隔符的作用，不过我们要一个一个来，我们先看一些"输入分隔符"的小例子

输入分隔符比较容易理解，当awk逐行处理文本的时候，以输入分隔符为准，将文本切成多个片段，默认使用空格，但是，如果一段文字中没有空格，我们可以指定以特定的文字或符号作为输入分割符，比如下图中的例子，我们指定使用"#"作为输入分隔符。

上图中，我们使用了-F 选项，指定了使用#号作为输入分隔符，于是，awk将每一行都通过#号为我们分割了。

除了使用 -F 选项指定输入分隔符，还能够通过设置内部变量的方式，指定awk的输入分隔符，awk内置变量FS可以用于指定输入分隔符，但是在使用变量时，需要使用-v选项，用于指定对应的变量，比如 -v FS='#'，如下图

其实不管是通过-F选项，还是通过FS这个内置变量，目的都是设置指定的输入分隔符，达到的效果是相同的，我们会在另一篇文章中单独对awk的变量进行总结，如果你不理解这些变量，没有关系，后面自然会明白。

而此处，我们使用了awk中的一个选项，就是-F，还记得我们之前总结的awk的使用语法吗。

我们说过，awk的语法如下

awk [options] 'Pattern{Action}' file

而-F，就是options的一种，用于指定输入分隔符。

-v也是options的一种，用于设置变量的值。

再结合之前的文章，我们已经将options 、pattern 、action都简单的应用了一遍，好了，我们已经"会用"awk了。

## 输出分隔符

那么什么是输出分隔符呢？聪明的你应该已经发现了，当awk为我们输出每一列的时候，会使用空格隔开每一列，其实，这个空格，就是awk的默认的输出分隔符，下图中红线标注的空格部分，就是awk的默认的输出分隔符。

输出分割符的意思就是：当我们要对处理完的文本进行输出的时候，以什么文本或符号作为分隔符。

我们可以使用awk的内置变量OFS来设定awk的输出分隔符，当然，使用变量的时候要配合使用-v选项，示例如下

现在，我们可以同时指定输入分隔符和输出分割符了，示例如下

我们刚才解释了awk的输出分隔符，如果，在输出的时候，我们想要让两列合并在一起显示，不使用输出分隔符分开显示，该怎么做呢？如下图所示，蓝线之上使用默认的输出分隔符进行了分隔，而蓝线之下的两种方法均未使用输出分隔符进行分隔，而是将两列合在一起显示了。

细心如你一定发现了，上图中的示例在语法上的区别就是，一个有"逗号"，一个没有"逗号"。

awk '{print $1 $2}' 表示每行分割后，将第一列（第一个字段）和第二列（第二个字段）连接在一起输出。

awk '{print $1,$2}' 表示每行分割后，将第一列（第一个字段）和第二列（第二个字段）以输出分隔符隔开后显示。

好了，awk的分隔符就总结到这里，希望这篇文章能对你有所帮助。

我的微信公众号
关注"实用运维笔记"微信公众号，当博客中有新文章时，可第一时间得知哦~
赞 218
赏
分享

- awk

- 版权声明：本站原创文章，于2017年3月22日14:21:02，由 朱双印 发表，共 1650 字。
- 如需转载，请在文章头部注明出处：awk从放弃到入门（2）：awk分隔符 | 朱双印博客

awk从放弃到入门（11）：拾遗之”三元运算”与”打印奇偶行”
awk从放弃到入门（10）：awk内置函数
awk从放弃到入门（9）：awk数组详解
awk从放弃到入门（8）：awk动作总结之二

### 发表评论取消回复

欢迎 pangzi 再次光临！
修改信息

正在提交, 请稍候...
#

昵称*

邮箱*

网址

有回复时邮件通知我

## 目前评论：24 其中：访客 15 博主 9

2. pyyu 1
   回复 2019年11月7日 下午6:03 沙发

   输入分隔符，输出分隔符有错字，博主关注下

4. Edwina_coco 0
   回复 2019年9月24日 上午11:34 板凳

   博主牛逼！！！！！

6. 萌新 1
   回复 2019年6月11日 下午1:05 地板

   感谢博主，加油。

8. ash1one 0
   回复 2019年5月20日 下午9:06 4楼

   豁然开朗！

10. yilanyouxue 0
    回复 2018年12月18日 下午3:21 5楼

    博主您好，您的awk系列文章，干货满满而又通俗易懂，我受益匪浅。
    有个不情之请——希望能复制转载，我会遵守您的转载要求。
    十分感谢！

12. drgcaosheng 4
    回复 2018年7月13日 上午11:34 6楼

    -F后面可以接多个分隔符，如：
    awk -F ‘[{}]’ ‘{print $2,$4}’

14. 小柯 1
    回复 2018年4月8日 上午11:12 7楼

    我有一个疑问，我们在实际得使用过程中，只需要在屏幕上显示的东西指的是的输出分隔符，那输入分隔符到底是干嘛用的。

16. 蜗居年华 1
    回复 2017年10月30日 下午2:28 8楼

    对于我一个开发狗来说很受用啦. 我要把你加到我的友情链接里.

    - 朱双印 Admin
      回复 2017年10月30日 下午3:55 1层

      @蜗居年华 可以，互换链接吧

      - 蜗居年华 1
        回复 2017年11月5日 下午10:26 2层

        @朱双印 已将您添加到我的链接啦, 欢迎互链(www.xiefayang.com)

        - 朱双印 Admin
          回复 2017年11月6日 上午8:43 3层

          @蜗居年华 友链已加，加油，共勉~~

18. Jacky 1
    回复 2017年8月5日 上午10:10 9楼

    博主你好，我想要将一个python文件中的函数名字输出来，
    我使用了 grep “def” file_name.py | awk -F [‘ ‘\(] ‘{print $2}’ | awk ‘{if(NF>0) print$0}’ 可以达到效果
    但是我想输出中函数名还要带参数，比如def fun(var1, var2): 输出fun(var1, var2)
    这就要求我的分隔符’ ‘只匹配第一次，请问如何才能实现我想要的功能呢？

    - 朱双印 Admin
      回复 2017年8月5日 上午11:51 1层

      @Jacky 直接用def当做分隔符行吗，然后就取到def后面所有的文本
      awk -F ‘def’ ‘/def/{print $2}’ test.py
      或者用sed也行
      sed -nr ‘/def/s@def (.*):@\1@p’ test.py

20. 易知难 4
    回复 2017年7月28日 下午2:22 10楼

    总结：
    1.输入分割符可以通过 -F#（或者别的符号也可以制定多个分割符 如-F#*）指定，也可以用 -vFs=”分隔符”指定
    2.输出分割符可以按—->{print$1″分隔符”$2″分隔符”$3}设置 逗号就是分隔符空格

    - 朱双印 Admin
      回复 2017年7月28日 下午11:45 1层

      @易知难 第二条总结可以更加准确一点，再细想想~~加油~~~

22. echo 6
    回复 2017年6月18日 下午8:47 11楼

    我就喜欢这种短小精悍，通俗易懂的文章

    - 朱双印 Admin
      回复 2017年6月18日 下午8:55 1层

      @echo 尽量将文章写得短一点，这样方便大家阅读，也方便理解，加油~

24. just_wkj 1
    回复 2017年4月18日 下午12:47 12楼

    博客文章写得很不错,我也想转载awk系列的

    - 朱双印 Admin
      回复 2017年4月18日 下午2:07 1层

      @just_wkj 转载授权无法发送至您的邮箱，总是被退信，请确认您的邮箱6XXXXXXX3@qq.com可以正常接收邮件

    - 朱双印 Admin
      回复 2017年4月18日 下午2:08 1层

      @just_wkj 博客暂时只支持转载评论的文章，无法一次性转载系列文章

26. dahu 1
    回复 2017年3月28日 上午8:49 13楼

    博主你好，文章内容可以复制转载吗，好像只能看，不能复制

    - 朱双印 Admin
      回复 2017年3月28日 上午9:08 1层

      @dahu 本博客文章经过博主授权后即可转载，转载时需在文章头部写明本博客原文链接
      如果您需要转载这篇文章，我会将此文章发送到您的账号邮箱，谢谢你的关注。

      - dahu 1
        回复 2017年3月28日 上午10:08 2层

        @朱双印 好的，谢谢，我想要您的awk系列文章

        - 朱双印 Admin
          回复 2017年3月28日 上午10:55 3层

          @dahu 此文章已经发送至您的邮箱，按照授权要求，即可转载此文章，感谢你的关注。

- 文章目录

×
×
拖拽到此处
图片将完成下载