其他文本处理命令以及bash变量中的一些字符串的处理方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了其他文本处理命令以及bash变量中的一些字符串的处理方法相关的知识,希望对你有一定的参考价值。

其他的文本处理命令:

1.wc

2.cut命令:

  cut - 在文件的每一行中提取片断 

  注意:能够被cut修剪的文件或数据内容,一般是具有某种特定格式或结构的文本文件或数据内容;

  如 :/etc/passwd

  格式:cut [OPTION]... [FILE]...


  常用选项:

   -d, --delimiter=DELIM:指定在实施修剪操作时所使用的字段分隔符号,默认是TAB(空白字符);

   -f, --fields=LIST:根据指定的字段分隔符号来指定要保留的字段编号列表;

     LIST可以称为字段列表,地址定界,书写方法:

      1.NUM:选择被指定的单个数字所表示的字段,该字段将被保留;

      2.NUM1,NUM2,NUM3,……:离散的多个被指定的字段的数字的列表;所有数值所代表的字段均被保留;

      3.NUM1-NUM2:连续的多个被指定的字段的数字列表,所有数值所代表的字段均被保留;

      NUM1-:从NUM1开始直到行尾的所有字段;

      -NUM2:从行首第一个字节开始直到NUM2的所有字节

   --output-delimiter=STRING:指定输出数据时的字段分隔符号;

   例:取出用户名,UID,以及默认的shell

      [[email protected] ~]# cut -d ":" -f 1,3,7 --output-delimiter=" " /etc/passwd

      对于某些特定格式的数据进行剪切提取,并以规范的格式输出也可以用下一个awk命令

      [[email protected] ~]# df | tr -s ' ' '\t' | cut -f 3,5


3.awk:

  gawk - pattern scanning and processing language


  常用选项:

   -F fs,--field-separator fs:指定字段分隔符,默认空白字符;


   对于awk,根据字符分隔符切分出来的各字段,分别使用$1,$2,$3,……$NF来进行标识:$1,$2,$3……$NF是awk的内部变量;


   awk|gawk [Options] ...'/PATTERN/{print $1,$2}'

   例:[[email protected] ~]# df | awk '{print $3,$5}' |tr ' ' '\t'

       已用    已用%

       3696340 8%

       0    0%

       88    1%

       9140    1%

       0    0%

       154172 77%

       16    1%

       8086368 100%



4.sort:

  sort - sort lines of text files

  对于指定文件中的行按照ASCII编码表中的字符顺序进行排序输出;

  格式:sort [OPTION]... [FILE]...


  常用选项:

   -n:以数字的数值大小为排序依据进行排序;

   -r:倒序显示排序结果;

   -R:随机排序:只是此随机排序算法非常简陋,不太适用于复杂环境中的排序要求;

   -u, --unique:重复出现的行,只出现一次,去重;连续且相同的行称为重复行;

   -t,--field-separator=SRP:指定字段分隔符;

   -k:指定根据哪个关键字字段进行排序,一般和-t同时使用;

   随机选取用户:[[email protected] ~]# sort -R /etc/passwd | head -1

                 halt:x:7:0:halt:/sbin:/sbin/halt


5.uniq

  uniq - 删除排序文件中的重复行

  注意:uniq命令本身不具备排序的功能;

  格式:uniq [OPTION]... [INPUT [OUTPUT]]


  常用选项:

   -c, --count:对于重复的行计算重复次数;(常用于统计日志文件)

   -d, --repeated:只显示重复的行,且每个重复行只显示一个作为代表;

   -u, --unique:只显示无重复行;


6.diff

  diff - compare files line by line 对两个文件内容进行逐行比较

  格式:diff [OPTION]...FILE


  制作patch文件:

  # diff file1 file2 > patch_file

  注意:patch_file中记录的是file2的内容和file1文件相比有哪些不同;使用patch_file时,应该向file1打补丁;


7.patch:

  patch - apply a diff file to an original

  格式:patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]


  常用选项:

   -i patchfile or --input=patchfile:用于指明patch文件的路径;


 条件测试命令:

   test命令 == [命令,bash的内建命令;

   格式:

    test expression

    [ expression ]

    [[:bash的关键字,一般仅用于某些特定结构或这种格式之中;

    [[ expression ]]


   注意:此类条件测试命令,一般没有执行结果,仅有执行状态返回值,如果其执行状态返回值为0则表示true,如果其执行状态返回值为1,则表示false;


   条件测试命令共有三类条件测试表达式:


   1.数值测试:双目操作;

    测试操作符:

     -eq:测试两个数值是否相等;相等为真,不等为假;

     -ne:测试两个数值是否不等;相等为假,不等为真;

     -lt:小于,测试左边的数值是否小于右边的数值;小于为真,不小于为假;

     -gt:大于,测试左边数值是否大于右边数值;大于为真,不大于为假;

     -le:小于等于,测试左边的数值是否不大于右边数值;如果不大于为真,大于为假;

     -ge:大于等于,测试左边的数值是否不小于右边数值;如果不小于为真,小于为假;


    注意:bash仅支持整数,不支持浮点数;


   2.字符串测试:

    双目测试:

     ==|=:测试两个字符串是否为相同的字符串;相同为真,不同为假;

     !=:测试两个字符串是否不相同;不同为真,相同为假;

     >:测试左边的字符串所对应的ASCII编码是否比右边的字符串ASCII编码大;大于为真,小于为假;

     <:测试左边的字符串所对应的ASCII编码是否比右边的字符串ASCII编码小;小于为真,大于为假;

     STRING=~PATTERN:测试左侧的字符串STRING能否被右边的模式PATTERN匹配;能匹配为真,不能为假;


     注意:>,<,=~这三类测试操作符只能用在[[expression]]测试语句中使用

     [[email protected] ~]# [ a == a ]

     [[email protected] ~]# echo $?

     0

     [[email protected] ~]# [ a == b ]

     [[email protected] ~]# echo $?

     1



    单目测试

     -z'STRING':测试STRING是否为空字符串,空为真,不空为假;

     [[email protected] ~]# [ -z $MYVAR ]

     [[email protected] ~]# echo $?

     0

     -n'STRING':测试STRING是否为非空字符串,不空为真,空为假;

     [[email protected] ~]# [ -n $MYVAR ]

     [[email protected] ~]# echo $?

     0

   注意:

   1】通常情况下,字符串是要用引号引用的,单引号或双引号都可以,只有在特定的情况下,只能选择单引号或双引号之一;

   2】[]和[[]]在某些情况下,意义不完全相同,要区分对待;

   3】如果使用[]或[[]]进行条件判断,在表达式的两端都有留空白字符,以区分命令和参数之间的关系;

   4】所有的双目测试操作符和参数之间也要留有空白字符空间;


   3.文件测试:

    单目测试:

     -a|-e FILE:测试文件是否存在,存在为真,不存在为假;

     -b FILE:测试文件是否存在且为块设备文件,存在且为块设备为真,否则为假;

     -c FILE:测试文件是否存在且为字符设备文件,存在且为字符设备为真,否则为假;

     -d FILE:测试文件是否存在且为目录文件,存在且为目录文件为真,否则为假;

     -f FILE:测试文件是否存在且为普通文件,存在且为普通文件为真,否则为假;

     -h|-l FILE:测试文件是否存在且为符号链接文件,存在且为符号链接文件为真,否则为假;

     -s FILE:测试文件是否存在且其大小要大于零,存在且大小大于0为真,否则为假;

     -S FILE:测试文件是否存在且为套接字文件,存在且为套接字为真,否则为假;

     -t FD:测试文件描述符是否在终端上被打开,被打开为真,否则为假;

     -r FILE:测试文件是否存在且当前用户是否被授予读权限,存在且授权为真,否则为假;

     -w FILE:测试文件是否存在且当前用户是否被授予写权限,存在且授权为真,否则为假;

     -x FILE:测试文件是否存在且当前用户是否被授予执行或搜索权限,存在且授权为真,否则为假;


     文件特殊权限标识测试:

     -u FILE:测试文件是否存在且设置了SUID,存在且授权为真否则为假;

     -g FILE:测试文件是否存在且设置了SGID,存在且授权为真否则为假;

     -k FILE:测试文件是否存在且设置了STICKY,存在且授权为真否则为假;


     文件的所有权测试:

     -O FILE:测试文件是否存在且其属主为当前有效用户;存在且属主为当前有效用户为真,否则为假

     -G FILE:测试文件是否存在且其属组是否为当前有效用户的所在组;存在且属组为当前有效用户的所在组为真,否则为假;


    双目测试:

     FILE1 -ef FILE2:测试两个文件是否拥有相同的Inode标号:即:两个文件是否为硬链接;


   测试语句中添加逻辑运算符号:

    1.利用bash的逻辑运算符号:

      [ expression1 ] && [ expression2 ]

      [ expression1 ] || [ expression2 ]

      ![ expression ]

    2.利用条件测试本身的逻辑运算符号:

     [ expression1 -a expression2 ]

     [ expression1 -o expression2 ]


   命令的执行结果:

    1.命令的正常输出结果;

    2.命令的执行状态返回值;

     0-255

     0:标识命令成功执行或者条件判断为真;

     1-255:表示命令执行失败或者条件判断为假;

     1,2,127:系统默认保留的;

     3-126,128-255:用户自定义命令执行状态返回值;


   exit命令:

    exit - exit the shell

    格式:exit [n]

       退出shell时可以使用n作为状态返回值;如果没有指定n,则默认的状态返回值为最后一条命令的状态返回值;


    注意:

      当shell脚本运行时一旦遇到exit命令将立即结束运行此脚本的shell进程,同时次脚本的运行也会停止,其后续的所有命令不会再被解释执行,因此包含了exit命令的脚本,不要使用source命令来执行;


bash的颜色显示规则:

 调用了ASCII编码对于颜色的设置方案‘


 Ctrl键:\033

 [:控制字符和颜色代码之间的分隔符;

 所有的颜色代码都应该使用m结尾;


 颜色代码:

  0:关闭颜色显示属性,恢复为黑白色;

  1:加粗子显示文本字符;

  4:为文本字符添加下划线标识;

  5:使文本字符闪烁;

  7:将文本字符的背景颜色和前景颜色交换;

  8:将文本字符的背景颜色设置为与前景颜色相同;


  30-39:设置文本字符的前景色,38,39为保留,未被使用;

  40-49:设置文本字符的背景色,48,49为保留,暂时未使用;


  注意:此类控制字符和颜色代码必须放置在echo -e 模式中显示;


程序的组成部分:

 一个完整的应用程序,一般包括四类文件:

   二进制文件;

   头文件和库文件:

   帮助文件:

   配置文件:


  bash——CLI中的一种:


  bash同样属于完整的应用程序,上述四类文件,bash都有;

   二进制文件:/bin/bash

   头文件和库文件:/lib64/

   帮助文件: /usr/share/man/man1/bash.a.gz

   配置文件:

    三类:

     1.profile类:

       为交互式登录的shell进程实现功能初始化的配置文件;

     2.bashrc类:

       为非交互式登录的shell进程实现功能启动配置的配置文件;

     3.logout

       为交互式登录的shell进程提供终止及清理类功能的配置文件;


   bash的类型:

    1.交互式登录的bash

     1)直接通过某个终端输入账户信息和密码之后打开的bash进程;

     2)su - | -l USERNAME执行切换登录大开的bash进程;


     配置文件的加载顺序:

      /etc/profile --> /etc/profile.d/*.sh -->~/.bash_profile --> ~/.bashrc --> /etc/bashrc


    2.非交互式登录的bash

     1)在图形界面下,通过菜单项或右键菜单打开的终端所启动的bash进程;

     2)使用su USERNAME执行切换登录打开的bash进程;


     配置文件的加载顺序:

      ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

   bash的配置文件:

    1.profile类:

     全局配置文件

      /etc/profile

      /etc/profile.d/*.sh


      注意:在RHEL或CentOS系列的发行版操作系统中,通常会存在这样的情况;如果一个配置文件的内容很多,格式很复杂,将会尝试将此配置文件切割拆分为多个片段配置文件,往往把最核心最主要的主配置文件中,将一些附属的或者扩展的配置内容分散存放在各个片段配置文件中;而被切分出来的片段配置文件一般会统一保存在“程序名称.d”命名格式的目录中;而我们约定,在这类目录中保存的片段配置文件的后缀名称会是统一的字符串;


     个人配置文件:

      ~/.bash_profile


      profile类配置文件的作用:

       1.用于定义用户的环境变量;

       2.用于运行脚本或者执行命令;


    2.bashrc类:

     全局配置文件:

      /etc/bashrc


      个人配置文件:

      ~/.bashrc


      bashrc类配置文件的作用:

        1.用于定义本地变量

        2.定义命令别名

        3.用于定义umask


      注意:只有root用户才能修改全局类的bash配置文件,普通用户只能修该其家目录中属于其个人的配置文件;


       为什么要为bash使用配置文件?

       所有利用bash命令行完成的命令行完成的命令操作,只要没有涉及到文件修改的,一般都只是针对当前的shell生效,一旦shell进程结束,则此前所有的操作的生命周期就咋偶到尽头,即配置失效;


       配置文件的作用:

        1.能够使用户赖以生存的配置信息长期有效;

        2.能够让用户保存此前的配置内容;


       让配置文件中新进修改的内容生效:

        1.注销重新登录,打开新的shell进程;

        2.source命令;

        3.exec命令;


    3.logout类:

      个人配置文件:

       ~/bash_logout


       作用:在关闭shell进程之前,清除某些用户自定义的配置,删除某些临时文件或目录,以及撤销用户此前定义的变量,清理某些可能会引发安安全问题的隐患等操作;


 bash的变量中存放的字符串的处理方式:

  bash变量:

   弱变量:

    1.无需事先定义即可应用;

    2.变量没有数据类型的硬性要求默认是字符型;


   1.字符串切片:

     ${#VAR}:返回字符类型变量的变量值的长度;

     ${VAR:offset}:返回字符型变量中第“offset”位置之后的内容不包括第“offset”位置的字符;offset取值范围为:0-$[${#VAR}-1]

     ${VAR:offset:number}:返回字符型变量中从第offset个字符后长度为number的字符部分;

     ${VAR -length}:取字符型变量字符串最右侧的“length”个字符


     注意:在“-length”之前要留有空格;


   2.基于模式(PATTERN)取字符串

     ${VAR#*PATTERN}:自左而右查找VAR变量中所存储的字符串中,第一次被PATTERN匹配到的字符,删除从字符串开始到第一个被PATTERN匹配的字符之间的所有字符;

     ${VAR##*PATTERN}:自左而右查找VAR变量中所存储的字符串中,所有被PATTERN匹配到的字符,删除从字符串开始到最后一次被PATTERN匹配的字符之间的所有字符;

     ${VAR%PATTERN*}:自右向左去查找VAR变量所存储的字符串中,第一次被PATTERN匹配到的字符,删除从字符串结尾到第一个PATTERN匹配到的字符之间的所有字符;

     ${VAR%%PATTERN*}:自右向左去查找VAR变量所存储的字符串中,所有被PATTERN匹配到的字符,删除从字符串结尾到最后一个PATTERN匹配到的字符之间的所有字符;


   3.查找替换:

     ${VAR/PATTERN/SUBSTRING}:在VAR变量中,查找能够被PATTERN匹配到的内容,将其中第一个匹配到的结果PATTERN替换为SUBSTRING;

     ${VAR//PATTERN/SUBSTRING}:在VAR变量中,查找能够被PATTERN匹配到的内容,将所有匹配到的结果PATTERN替换为SUBSTRING;

     ${VAR/#PATTERN/SUBSTRING}:在VAR变量中查找行首匹配PATTERN的内容,将匹配的内容更换成SUBSTRING;

     ${VAR/%PATTERN/SUBSTRING}:在VAR变量中查找行尾匹配PATTERN的内容,将匹配的内容更换成SUBSTRING;


   4.查找删除:

     ${VAR/PATTERN}:在VAR变量中,查找能够被PATTERN匹配到的内容,将其中第一个匹配到的结果PATTERN删除;

     ${VAR/PATTERN}:在VAR变量中,查找能够被PATTERN匹配到的内容,将所有匹配到的结果PATTERN删除;

     ${VAR/#PATTERN}:在VAR变量中查找行首匹配PATTERN的内容,将匹配的内容删除;

     ${VAR/%PATTERN}:在VAR变量中查找行尾匹配PATTERN的内容,将匹配的内容删除;


   5.字符串的大小写转换:

     ${VAR^^}:将变量中的小写字母转换为大写字母;

     ${VAR,,}:将变量中的大写字母转换为小写字母:


   6.变量赋值操作:

     ${VAR:-value}:如果VAR变量为空值或者变量为被定义,那么就直接返回value中的值;否则就返回VAR的值;

     ${VAR:+value}:如果VAR已被定义且不为空,则返回value的值;

     ${VAR:=value}:如果VAR变量为空值或者未被定义,那么直接返回value中的值并且将vvalue的值赋给变量VAR;否则返回变量VAR的值;


   7.变量的间接引用:

     如果第一变量的值恰好是第二个变量名,那么从第一变量引用第二个变量而方法,就称为变量的间接引用,也称为间接变量引用;

      如:VAR1=VAR2,VAR2=HELLO6


     bash提供了这样的间接变量引用的的方法:

      eval MYVAR= \$$VAR1


以上是关于其他文本处理命令以及bash变量中的一些字符串的处理方法的主要内容,如果未能解决你的问题,请参考以下文章

Bash

Linux里面bash是啥?

#8 bash变量中的字符串处理

linux里面bash是啥?

Linux权限用户以及文本处理的一些相关命令

Bash命令输出未保存到文本文件或变量[重复]