Shell(5)-linux系统bash用法


    本篇博客将介绍linux系统中比较常用的 bash 以及用法,例如被称为Linux系统中的"三剑客"--grep , sed , awk ; 还有cut ,seq , sort , wc , uniq , diff ,通配符等 .

 

     在Linux系统中查找文件一般都会用到通配符 , 管道  , bash技巧命令来输出我们想要得到的结果 , 首先我们先了解通配符的作用:


 一 . 通配符


     作用 : 是用来在文件搜索时代替文件名中的一个或多个正真字符 .

     常用通配符符号有 : ?  *  []

     

     ?  作用 : 匹配任意单个字符 .

     例 : ls  /dev/tty?  , 输出的结果为 /dev/tty 加任意一个字符 , 如图 :

     

image.png

     再尝试使用命令 ls /dev/tty?? , 结果为 : 

     

image.png


     *  作用 : 匹配任意0个或多个字符 , 意为所有 

     例 : ls  /dev/tty*

     

image.png

     同理 , ls  /etc/*.conf , 输出的结果为显示目录 /etc 下的所有以conf结尾的文件 , 这里不做尝试 .


     []  作用 : 匹配[]中的任意单个字符

     例 : ls  /dev/tty[123]5

     

image.png

     也可以连续一个范围进行匹配 , 如 ls  /dev/tty[1-6]5

     

image.png


     管道符 |  :将前一个命令的结果(标准输出) 传给后一个命令继续处理 

     例 : head -6  /etc/passwd  |  cat  -n    #查看文件/etc/passswd的前6行 后, 再用cat查看显示行号

      

image.png

      说明 : 管道符可以一个接着一个 , 例在上面的例子上再输出前3行信息

      

image.png




 二 . Linux系统三剑客其二(grep , sed )入门 

       


     1 . grep : 匹配关键字 , 显示文件中关键字所在的整行内容


     例 : grep  root  /etc/passwd         #显示/etc/passwd文件中所包含root关键字的行

     

image.png


     常用选项 :  -n         显示行号

                       -i          不区分大小写

                       -v         取反

                       -c         带关键字的函数

                       -n         静默执行 , 不在屏幕显示匹配到的内容 , 通常用于shell脚本

      更多选项用法可以用 grep  --help 查看用法



     2 . sed流编辑器

          是一种文本编辑器 , 默认情况下是不会修改原文件的 , 也是一种非交互式的编辑器

          工作原理 : 一行一行处理文件 , 当从文件中读取一行后 , 首先放到模式空间(内存缓冲区)匹配关键字进行相应的处理 , 处理完将结果输出到屏幕上 , 接着处理下一行内容 , 直到所有行都读取完毕 , sed 结束 .


     sed的语法 :   sed  [option] '地址命令'  文件名

     常用选项 :  -n   静默输出 , 关闭模式空间的输出 , 不会输出未匹配到的行

                      -e   允许进行多项编辑 , 应用于对同一行做多次处理 , -e  "命令1"  -e  "命令2" ..-e "命令n"

                      -f    后接sed脚本 , 指定执行的sed脚本

                      -r    允许使用扩展正则

                      -i     直接作用于原文件


     sed 地址定址 :

     定址用于决定对哪些行进行编辑 , 地址形式可以是数字 , 正则表达式或二者结合 . 如果没有指定地址 , sed将处理输入文件中的所有行 .


     例 : 文件准备 , 将/etc/passwd文件中的前10行内容添加行号覆盖写入/pass文件中 , 然后查看/pass文件中的内容

           

image.png

           

           输出单行 :

           sed  -n  '1p'  /pass     #显示/pass文件中的第一行 ,1p 指print 第1行

           

image.png

           同理 , 输出/pass文件第5行 :

           

image.png

         

           输出指定的多行 : 

           

image.png

           指定行数 , 行数号与行数号之间用逗号隔开


           打印从i行开始的后几行 (i,+n)

           

image.png


           打印从第1行开始 , 再加上n行为止 

           

image.png

        

           关键字匹配: 处理符合模式(匹配关键字)的行 , -r 表示启用正则表达式

           例 : 显示/etc/passwd文件中以root开头的内容

           

image.png


    sed的子命令 : 

    sed的子命令告诉sed对指定行进行何种操作 , 包括打印p , 删除d , 修改(追加a , 插入i , 替换s , 字符替换c)

   

     将/etc/passwd这个文件前10行导入新文件/pass1:   head  /etc/passwd  >  /pass1

           

          d : 删除(delete)

          sed  '/^root/d'  /pass1     处理/pass1文件显示删除以root开头的行号 

         

image.png


          i : (i\text) 在符合模式的行的上面插入(insert)\以后的text文本 , 结果将在终端上显示 , 默认不会改变原文件

          sed '/^root/i\hello'  /pass1  

         

image.png

      


          a : (a\text) 在符合模式的行的下面追加\以后的text文本 , 处理结果同 i

          

image.png

          结合上面两个例子 , 使用 -e 选项 同时执行 , 结果如图所示 :

          

image.png


         c : (c\text) 用新文本覆盖符合模式的行中的文本

         例 : 用 hello world 覆盖/pass1文件中的第 2 行

         

image.png


         s : 用一个字符替换另一个字符

         例 : sed  's/root/ROOT/g'  /pass1    #指定替换所有匹配到的

         

image.png

         sed  's/root/ROOT/2'  /pass1    #指定替换匹配到的的第二个

         

image.png




     cut命令 : 提取文件中指定的字段 , 字符内容 . 默认分隔符为空格

     

     格式 :  cut  [选项]..  [文件]..

     常用选项 :  -b   按照字节切 , utf-8编码中每个汉字占三个字节(好比4个汉字就取得12个字节)

                      -c    按照字符切

                      -d    指定分隔符

                      -f     指定以分隔符分割的哪个字段


     实例 :  将 /etc/passwd 文件中的前5行覆盖写入/pass 文件中( head  -5  /etc/passwd  > /pass)

                显示/pass文件中以 : 分隔的第6行内容 , 家目录内容:

                

image.png

                显示/pass文件中的第一列(用户名)和第7列(shell解释器)的内容:

                

image.png

                同理 : cut  -d :  -f  1-3  /pass    取1~3列内容

                以字符大小切 , 例 :echo '×××' | cut  -b  1-12

                

image.png

        



     seq : 按顺序打印出一些数字 , 例如: 1 2 3 4 5 ...

      

     用法 :  seq  [选项]  ...尾数

               seq  [选项]  ... 首数  尾数

               seq  [选项]  ...首数  增量  尾数


      实例 :  seq  5       #按顺序输出1~5的数

               

image.png

               同理 : seq  5~10     #按顺序输出5~10的数    

                         seq  1  2  10    #输出1~10之间的奇数

                         seq  10  -1  0    #输入10~0之间的数

               补齐输出 : -w   例 : seq  -w  1  50  200

               

image.png

       扩 : 使用echo命令也能实现seq同样的效果 , 格式 echo {首数..尾数..增量}


 

     sort排序 : 排序分为升序 和 降序 , 默认是按升序进行排列


     常见选项 : -n  (--numeric--sort)   根据数值比较 , 默认是按单个字符来比较

                     -r   逆序输出排序结果

                     -t   指定分割符

                     -k   排序键(key , 即排序的列字段)

                     -u   去掉重复行

      实例 : seq 1 10 | sort 

               

image.png

               seq  1  10 | sort -n

               

image.png

               seq  1  10 | sort - nr

               

image.png

               sort  -t :  -k  2  -n  文件名    #按 : 分割开的以第2列是数值大小排序 (使用的最多)

               例 : 按/etc/passwd 文件中第3列uid数值大小进行排列

               

image.png


     

     wc : 统计行数 , 单词数 , 字节数

     例 : wc  /etc/passwd    #在/etc/passwd这个文件中有45行 , 92个单词数 , 2356个字节

           

image.png

           wc  -l    统计行数

           

image.png

           wc  -c  统计字节数

           

image.png

           wc  -m  统计单词数

           

image.png

           统计 /bin 目录下有多少个命令

           

image.png


         

     uniq : 合并连续重复的行 


     常用选项 :  -u    只显示没有连续重复的行

                      -c     统计连续重复行的次数

                      -d    只显示连续重复行一次 , 哪一行连续重复了就显示哪行

                      -i     忽略大小写


     例 : 准备一个文件 a.txt , 在文件输入内容并查看a.txt如图所示 :

           

image.png

           uniq  -c  a.txt     #统计连续出现的次数

           

image.png

           uniq  a.txt    #对a.txt 文件中连续重复的行只显示一次

           

image.png

           uniq  -u  a.txt      #不显示连续重复的行

           

image.png

           uniq  -d  a.txt    #仅显示连续出现的内容一次

           

image.png

           结合sort排序使用 , 显示没有重复的行

           

image.png

 



    diff 命令 : 

    vimdiff  : 比较两个文件的差异

     

     实例 : 准备两个存在差异的文件 : 

              head  -3  /etc/passwd  >  /tmp/pass3

              head  -5  /etc/passswd > /tmp/pass5

               准备好上面两个文件之后 ,先使用vimdiff 对比/pass3 和 /pass5的文件内容 , 再用diff命令对比两个文件的差异 , 将显示出两个文件不同内容:

               

image.png

               

image.png

               

               通过显示差异 , 可以制作补丁 : 

               diff  /pass3  /pass5  >  /pass35.patch   #制作补丁文件/pass35.patch(增加内容) 并查看此文件 :

               diff  /pass5  /pass3  >  /pass53.pattch   #制作补丁文件/pass53.patch(减少内容)

               

image.png

               

               patch 打补丁 : 

               首先安装patch -- yum  install  -y  patch ,然后给/pass3 文件打补丁 , 最后查看/pass3文件内容 :

               

image.png

               同理 patch  /pass3  /pass53.patch  会减少/pass3的最后两行



    tr : 替换字符 , 被替换的字符与替换的字符数必须是相等的

    用法 : tr   旧字符   新字符


    实例 : 准备一个文件 b.txt , 内容如图 :

             

image.png

              

             cat  b.txt | tr  20  89     #将cat  b.txt 结果中的20 替换成了 89(不改变原文件)

             

image.png

             cat  a.txt | tr  "a-z" "A-Z"   #替换时一一替换 , 字母变成大写

             

image.png

  



      以上都是比较常见的 bash 和 它们的用法 , 下一篇再介绍 awk 的简介作用以及它的入门操作          


原文地址:https://blog.51cto.com/14181896/2359243

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER