[转帖]shell编程-字符截取命令

shell,编程,字符,截取,命令 · 浏览次数 : 0

小编点评

**printf 文件内容的方法:** ```bash # 打印字符串 printf '%s\\t%s\\t%s\\t%s\' $(cat /etc/issue) # 打印整数 printf '%8i\' 33[root@localhost profile.d] # 打印浮点数 printf '%5.2f\' 33.00 # 打印字符串,并以换行符结束 printf '%s\\t%s\\t%s\\t%s\' $(cat /etc/issue) ```

正文

grep 命令

命令格式: grep [选项] 查找的字符串 文件名

作用: 在文件中搜索查找字符串,显示匹配字符串所在的行。

选项:

  • -i:查找时忽略大小写。
  • -n:显示行号。
  • -v:反向查找(把不含有要搜索字符串的所有行显示出来)。
  • -c:计算匹配到 ‘搜寻字符串’ 的次数。
  • -r:在指定的目录中查找,默认是在文件中查找。
  • –color=auto:将匹配的关键字用颜色显示。

说明:[选项] 和 查找的字符串 之间的顺序可以互换。

查找的字符串可用引号(单引号或双引号)括起来,也可省略引号。

# 显示文件中以 ; 开头的行
grep ^; /tmp/a.txt 

显示文件中不以 ; 开头的行

grep -v ^; /tmp/a.txt

在当前的目录中查找包含 abc 的行,忽略大小写并显示行号

grep -inr abc .

显示文件中包含 "id":1 的行,忽略大小写并显示行号

grep -in '"id":1' /tmp/a.txt

    cut 命令

    命令格式: cut [选项] 文件名

    作用: 提取(显示或查看)文件中的哪几列。

    局限性: 它不能提取多个空格分割的列,它可以识别的分隔符默认是制表符。

    选项:

    • -f:列号,提取第几列,这个选项是必须选项。
    • -d:分隔符,按照手工指定的分隔符分割列,分隔符可以用双引号括起来。

    示例:

    cut -f 1  /etc/passwd
    提取该文件中的第1列。(采用默认的制表符分割列)
    

    cut -d ":" -f 1 /etc/passwd
    提取该文件中的第1列。手工指定将":"作为列的分割符。

    cut -d : -f 1,3 /etc/passwd
    提取该文件中的第1列和第3列。(提取多列之后,会自动在列之间加上分隔符,然后再显示)

    cut -d : -f 1,2,3 /etc/passwd
    提取该文件中的第1列到第3列。

      cut命令是提取文件中的列,而grep命令是提取文件中的行,因此,这两个命令经常需要配合使用。

      示例:

      cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1	
      提取/etc/passwd文件中所有普通用户的用户名。
      

      grep /bin/bash /etc/passwd | grep -v root | cut -d : -f 1
      作用同上。

        对于多个空格分割的列,无法用cut命令得到我们预期的结果。比如下面这条命令的显示结果就很尴尬。

        df -h | cut -d " " -f 2
        
        • 1

        后面,我们会讲解awk命令,这个命令很复杂,但它可以解决这个问题。

        printf 命令

        严格来说,printf命令并不是字符提取命令。

        命令格式: printf ‘输出格式’ 要输出的内容

        作用: 把要输出的内容,按照指定的格式匹配输出。printf不能直接输出文件中的内容,也不支持管道符。

        输出格式(格式里可以加空格、字符或转义字符):

        • %ns:匹配字符串。n是数字,格式化为指定的长度时,如果长度不足,用填充符前置填充到指定的长度。默认的填充符是空格。
        • %ni:匹配整数。n是数字,作用同上。
        • %m.nf:匹配浮点数。m和n是数字,m代表浮点数的总位数,n代表小数位数(超出的话就四舍五入;不足的话,就用0在后面填充)。

        注意: 输出格式必须用引号括起来(单引号或双引号都行)。

        示例:

        [root@localhost profile.d]# printf '%s%s%s\n' 1 2 3 4 5 6
        123
        456
        

        [root@localhost profile.d]# printf '%s%s%s\n' 1 2 3 4 5
        123
        45

        [root@localhost profile.d]# printf '%sa%s%s\n' 1 2 3 4 5 6
        1a23
        4a56

        [root@localhost profile.d]# printf '%s%s%s\n' "1 2 3 4 5 6"
        1 2 3 4 5 6

        [root@localhost profile.d]# printf '%5s\n' 1 2 3
        1
        2
        3

        [root@localhost profile.d]# printf '%5s\n' "123456"
        123456

        [root@localhost profile.d]# printf '%5s\n' "123"
        123

        [root@localhost profile.d]# printf '%8i\n' 3
        3

        [root@localhost profile.d]# printf '%5.2f\n' 3
        3.00

          printf 输出文件内容的方法:

          [root@localhost ~]# printf '%s\t%s\t%s\t%s\n' $(cat /etc/issue)
          CentOS	release	6.6	(Final)
          Kernel	\r	on	an
          \m	
          

            说明:

            在awk命令的输出中支持print和printf。
            

            print会在每个输出之后,自动加上一个换行符。(Linux默认没有print命令)。
            printf是以指定的标准格式输出,并不会自动加入换行符,一般都是手工加\n。

            awk中使用的print或printf并不是Linux的命令,它们是awk中自带的。

              awk 命令

              awk不仅可以截取文件中的哪些列,而且它还是一门编程语言。功能很强大,操作起来比cut复杂得多。

              截取列时,优先选择cut命令。如果cut命令不足以完成,就考虑awk命令。

              awk可以识别的分隔符默认是制表符或空格(就算是多个没有规律的空格也可以识别)。

              命令格式: awk ‘[条件1] {动作1} [条件2] {动作2} …’ 文件名

              • 条件:可省略,可用表达式作为条件。如果用BEGIN作为条件,则它后面的动作会优先执行;如果用END作为条件,则它后面的动作会最后执行。
              • 动作:格式化输出、流程控制语句等。

              使用awk查看/etc/issue文件的第1列和第3列:

              [root@localhost ~]# awk '{printf $1"\t"$3"\n"}' /etc/issue
              CentOS	6.6
              Kernel	on
              

                说明:

                awk命令也可支持管道符。

                示例:

                df -h | awk '{printf $1 "\t" $5 "\n"}'		
                将df -h的输出内容中的第1列和第5列,按照指定格式输出。
                

                  awk命令也会经常配合grep命令一起使用。

                  示例:

                  df -h | grep /dev/sda3 | awk '{printf $5 "\n"}' | cut -d % -f 1
                  通过该命令可以输出根分区的磁盘占用情况(除去了%),以便监测根分区。
                  这里,我事先知道/dev/sda3代表根分区。
                  

                    在awk命令中,可用FS内置变量手工指定分割符。

                    示例:

                    cat /etc/passwd | awk 'BEGIN {FS=":"} $3>=500 {print $1 "\t" $3}'
                    查看/etc/passwd中UID大于等于500的用户名和UID。
                    

                      awk命令也是一门编程语言,它还支持很多功能,比如变量、函数、流程控制等。这里不作深究。

                      sed 命令

                      其实,sed并不是字符截取命令。

                      sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级文本流编辑器。

                      sed主要用来对数据进行选取、替换、删除和新增。

                      sed和vi的区别主要在于,sed不仅仅可以编辑文件中的内容,而且可以(结合管道符)编辑命令的输出结果。

                      命令格式: sed [选项] ‘[动作]’ 文件名

                      选项:

                      • -n:sed命令一般会把所有的数据都输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。
                      • -e:同时执行多个动作。
                      • -i:将sed的修改结果直接作用于文件,而不是从屏幕输出。

                      动作:

                      • a:追加。在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用\表示数据未完结,之后回车,输入下一行的数据。
                      • c:行替换。用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用\表示数据未完结。
                      • i:插入。在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用\表示数据未完结。
                      • d:删除。删除指定的行。
                      • p:打印。输出指定的行。
                      • s:字符串替换。用一个字符串替换另外一个字符串。格式为 “行范围s/旧字符串/新字符串/g" (和vi中的替换格式类似,/g表示全局替换,即替换行中所有匹配到的字符串)。

                      示例:

                      sed 2p /etc/issue		
                      将该文件中的所有内容输出的同时,将第2行再输出一遍(不会作用于文件)。
                      

                      sed -n '2p' /etc/issue
                      只输出文件/etc/issue中的第2行(不会作用于文件)。

                      df -h | sed -n 2p
                      将df -h的执行结果中的第2行输出。

                      sed '2,4d' /etc/issue
                      删除文件中的第2行到第4行,并显示其他行。(不会作用于文件)

                      sed '2a this is a new line' /etc/issue
                      在文件的第2行后添加一行新的数据,将此效果输出。(不会作用于文件)

                      sed 'a this is a new line' /etc/issue
                      在文件的每一行之后添加一行新的数据,将此效果输出。(不会作用于文件)

                      sed 'i this is a new line' /etc/issue
                      在文件的每一行之前添加一行新的数据,将此效果输出。(不会作用于文件)

                      sed '2i one
                      two' /etc/issue
                      在文件的第2行前添加两行新的数据,将此效果输出。(不会作用于文件)

                      sed '3c this is a substitute of third line' /etc/issue
                      将文件中的第3行替换为新的数据,将此效果输出。(不会作用于文件)

                      sed '1s/a/AA/g' /etc/issue
                      将文件第1行中的所有的a替换为AA,将此效果输出。(不会作用于文件)

                      sed '1s/a/AA/' /etc/issue
                      将文件第1行中的第一个a替换为AA,将此效果输出。(不会作用于文件)

                      sed '1,6s/a/AA/g' /etc/issue
                      将第1行到第6行中所有的a替换为AA,将此效果输出。(不会作用于文件)

                      sed -i '1,6s/a/AA/g' /etc/issue
                      将第1行到第6行中所有的a替换为AA。(修改结果直接作用于文件,没有输出)

                      sed -e 's/AA//g;2s/n/N/g' /etc/issue
                      将每行的AA替换为空,同时将第2行的n替换为N,将此效果输出。(不会作用于文件)
                      -e表示同时执行多个动作,动作之间用分号隔开,也可用回车。

                        文章知识点与官方知识档案匹配,可进一步学习相关知识
                        Linux技能树Linux实用命令grep命令3355 人正在系统学习中

                        与[转帖]shell编程-字符截取命令相似的内容:

                        [转帖]shell编程-字符截取命令

                        grep 命令 命令格式: grep [选项] 查找的字符串 文件名 作用: 在文件中搜索查找字符串,显示匹配字符串所在的行。 选项: -i:查找时忽略大小写。-n:显示行号。-v:反向查找(把不含有要搜索字符串的所有行显示出来)。-c:计算匹配到 ‘搜寻字符串’ 的次数。-r:在指定的目录中查找,

                        [转帖]Shell编程之正则表达式与文本处理器(grep、sort、uniq、tr、cut)

                        目录 正则表达式概念正则表达式的作用元字符grep命令在文本中查找指定的字符串sort命令排序uniq命令快捷去重tr命令替换、压缩和删除cut命令快速裁剪命令expr substr 截取方法cut截取方法 split命令文件拆分paste命令文件合并eval变量扫描器位置锚定分组或其他扩展正则表达

                        [转帖]linux shell中 if else以及大于、小于、等于逻辑表达式介绍

                        https://www.jb51.net/article/34332.htm 在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下,方便需要的朋友 比如比较字符串、判断文件是否存在及是否可读等,通常用"[]"来表示条件测试。注意:这里的空格很重要。要确保方

                        [转帖]整理收藏:shell中的test条件测试

                        https://zhuanlan.zhihu.com/p/504991399 shell编程中经常会有很多需要逻辑判断的地方,比如一个文件/文件夹是否存在,字符串是否为空等等,而test就具有这样的优良传统,将我们需要的结果通过简单的表达式查询,从而通过状态码$?取值。 1.对文件类型的检测 -e:

                        [转帖]Bash脚本编程学习笔记10:参数展开

                        https://www.cnblogs.com/alongdidi/p/bash_parameter_expansion.html 简介 原标题叫做《Bash脚本编程之字符串处理》。 其实这里说得字符串处理,对应的是bash官网中的【Shell Parameter Expansion】,不过直接去看

                        [转帖][Docker] Windows里运行docker执行sh文件报错 $'\r': command not found

                        https://www.cnblogs.com/MasterMonkInTemple/p/16358366.html 出现这样的错误,是因为Shell脚本在Windows系统编写时,每行结尾是\r\n,而在Linux系统中行每行结尾是\n,所以在Linux系统中运行脚本时,会认为\r是一个字符,导致

                        [转帖]Linux shell 单引号和双引号

                        https://www.cnblogs.com/airoot/p/15324883.html 在编写shell脚本的时候经常会用到引号,有些时候却老是忘记单引号和双引号之间的区别,所以就整理一下供以后脑子不好使了的时候前来复习一下。首先说下他们的共同点: 好像就只有一个,就是它们都可以用来界定一个字

                        [转帖]Linux—编写shell脚本操作数据库执行sql

                        Linux—编写shell脚本操作数据库执行sql Hughman关注IP属地: 北京 0.0762020.03.20 09:02:13字数 295阅读 1,036 修改数据库数据 在升级应用时,我们常常会遇到升级数据库的问题,这就涉及到sql脚本的编写。 一般我们会通过写sql脚本,然后将xxx.

                        [转帖]Shell编程之免交互

                        目录 交互的概念与Linux中的运用Here Document 免交互tee命令重定向输出加标准输出支持变量替换多行注释Expect实例操作免交互预设值修改用户密码创建用户并设置密码实现 ssh 自动登录 交互的概念与Linux中的运用 交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制

                        [转帖]Shell编程之函数

                        目录 Shell函数使用Shell函数的优点 Shell 函数定义使用原则函数传参函数变量的作用范围 函数递归阶乘递归目录函数库 Shell函数 将命令序列按格式写在一起可方便重复使用命令序列Shell函数定义 调用函数的方法 使用Shell函数的优点 使用函数可以避免代码重复使用函数可以将大的工程