ZBlog

1566977443612

Shell

shell介绍

  • Shell是用户与Linux系统进行操作沟通的桥梁
  • shell的种类有很多 ,介绍的这种是bash 也就是Bourne Again Shell
  • shell文件的后缀通常是 .sh
  • shell脚本中的第一行通常是 #!bin/bash
  • 脚本执行方式
    • a.sh 已经配置过环境变量 且脚本有足够的权限
    • bash a.sh 直接执行
    • bash -x a.sh单步执行
    • bash -n a.sh 语法检查

shell中的变量

  • 变量不需要声明,初始化也不需要指定数据类型
  • 变量的命名规范
    • 变量名中只能含有数字、字母、下划线,不能以数字开头
    • 严格区分大小写
    • 变量的赋值使用=号,变量等号赋值之间不能有空格
    • 显示变量 echo ${变量名}
  • 本地变量
    • 只对当前的shell进程有效 相当于是Java中的private
      • 定义 :aa=value
      • 引用 : ${aa}
      • 取消该变量 : unset aa
  • 环境变量
    • 自定义的环境变量只对当前的shell进程以及他的子shell进程有效 对其他shell进程无效
    • 定义 : export aa=vlaue
    • 如果想要对所有的shell进程都有效的话需要修改系统的环境变量
      • vi /etc/profile
      • source /etc/profile
    • 和windows中的环境变量类似
  • 位置变量
    • ‘位置变量 $1$2$3$4
    • 在函数执行的时候穿的变量
      • test.sh aa bb cc dd
    • $0 表示的是脚本自己
    • $1 表示第一个参数 …..
    • 相当于Java中的args参数
  • 特殊变量
    • $ ? 接收上一个命令返回的状态码 在0-255之间
    • $# 参数的个数
    • $* $@ 表示所有参数
    • $$ 获取当前shell脚本的进程号
  • 引号
    • ‘’ 单引号不解析变量
    • “” 双引号解析变量
    • 单引号包双引号不解析
    • 双引号包单引号解析

shell中的循环以及判断

  • for循环

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      第一种格式
      for (i=0;i<10;i++)
      do
      .....
      done
      第二种格式
      for (i in 0 1 ... 10)
      do
      ......
      done
      第三种格式
      for (i in {1..10})
      do
      ......
      done
  • 条件测试

    • 整型
      • gt 大于
      • lt 小于
      • ge 大于等于
      • le 小于等于
      • eq 等于
      • ne 不等于
    • 字符串
      • = 等于
      • != 不等于
  • while循环

    • 1
      2
      3
      4
      while [$aa -gt $bb ];
      do
      .....
      done
  • if条件判断

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      单分支
      if [$aa -gt $bb ];
      then
      ......
      fi
      双分支
      if [$aa -gt $bb ];
      then
      ......
      else
      ......
      fi
      多分支
      if [$aa -gt $bb ];
      then
      ......
      elif [$aa -gt $bb ];
      then
      .......
      elif [$aa -gt $bb ];
      then
      .......
      else
      ......
      fi

shell中的字符串

  • 获取字符串的长度

    • 1
      ${#aa}
  • 字符串的截取

    • 1
      ${aa:offset:length}
  • 字符串的替换 /替换一个 //替换所有

    • 1
      2
      ${aa/old/new}
      ${aa//old/new}
  • 取尾部指定个数的字符 不加负号是取除了前n个的所有

    • 1
      ${aa: -5}
  • 大小写转换 ^^转大写 ,,转小写

    • 1
      2
      ${aa^^}
      ${aa,,}

shell扩展

  • 算术运算
    • let var=算数表达式 let var=10+10
    • let var=$[算数表达式] let var2=$[var+10]
    • let var=$((算数表达式))
  • date
    • 输出当前时间
    • 格式化输出 date +%Y-%m-%d
    • date +%s 表示自1970-01-01 00:00:00以来的秒数
    • 指定时间输出 date –date=’2009-01-01 11:11:11’
    • 指定时间输出 date –date=’1 days ago’ date -d’1 days ago’
    • 获取指定日期的前一天 date -d’20181212 1 days ago’ +%Y-%m-%d
  • read
    • 接收键盘的输入或者其他文件的描述的输入
    • read var
    • read如果后面不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中
    • read -p “Enter your name:”var 加入提示文本
    • read -s -p “Enter your password:” pass 表示键盘输入时字符不显示
    • read-t 5 -p “enter your name:” var 指定键盘输入字符数量
  • 后台模式运行脚本
    • 在脚本后面加一个 &字符 test.sh & 后台运行
    • 当用户注销或者网络断开的时候会受到hangup信号关闭所有子进程
    • nohup test.sh 忽略挂断信号
    • 使用nohup test.sh & 来启动一个需要一直执行的脚本
  • 标准输入输出错误重定向
    • 标准输入、输出、错误输出可以使用0、1、2表示
    • 标准加重定向 > 重定向到某一个文件中 >> 也是重定向但是文件信息是追加的
    • 标准正确输出加重定向
      • ls 1>a.txt 将ls命令的正确输出内容保存到a.txt当中 1可以省略
      • lk 2>>a.txt lk是一个错误指令 他会输出报错信息 将它的信息追加到a.txt之中
      • 如果用 ls 2>a.txt 或者 lk 1>a.txt 都是无效的
    • 将正确与错误的标准输出信息都存在同一个文件中
      • ls 1>>a.txt 2>&1
    • 把信息重定向到一个无底洞里,相当于是直接把输出信息删除
      • ls > /dev/null
  • crontab定时器
    • 1566991118734
    • 定时执行指定任务
      • vi /etc/crontab
      • 1566990959096
    • 前面是修改执行时间 中间是用户名 后面是具体需要执行的命令
    • tail -f /var/log/cron 查看crontab的执行日志
    • service crond status
  • ps 以及 jps
    • ps -ef查看所有进程
    • jps查看Java进程
  • vi常用技巧
    • /String 查找某个字符 n下一个
    • :Num 查找某一行
    • yy 复制当前行
    • num yy 从当前行开始复制num行
    • p 粘贴
    • dd 删除当前行
    • 999 dd 删除当前跟后面的所有
    • G 跳转到最后一行
    • gg 跳转第一行
  • 假死问题
    • 在命令行中 按 Ctrl+S可能会造成假死状态 命令无法输入
    • 按 Ctrl+q即可退出

awk

  • awk是一个强大的文本分析工具,相对于 grep的查找,sed的编辑,awk在其对数据分析形成报告时尤为强大。

    • 简单来说awk就是将文本逐行读入,以空格为默认分隔符将每行切片,切开的部分在进行分析处理
    • awk有三个版本 awk nawk gawk
  • awk程序的报告生成能力通常用来从大文本文件中提取数据元素并将它们格式化成可读的报告。最完美的例子是格式化日志文件。awk程序允许从日志文件中只过滤出你想要看的数据

  • 命令格式

    • awk [options] program file

      • options 选项

      • program 程序

      • file 操作的文件

        选项 描述
        -F fs 指定行中的程序分割字段的分隔符
        -f file 指定程序脚本文件
  • awk的基本特性之一即是处理文本文件的能力,他会自动为每个数据元素分配一个变量

    • $0 代表整个文本行
    • $1代表文本行中的第一个数据字段
    • $2代表文本行中的第二个数据字段
    • $n代表文本行中的第n个数据字段
    • 注意:文本行中的文本是自动划分的 awk默认的分割符是任意的空白字符串例如:空格或者制表符
    • 如果想要读取其他分隔字段,可以使用-F选项指定
      • 实例:awk -F: ‘{print $2}’ test.txt 指定分隔符为:
  • 如果awk只能进行一行命令的分析就没有那么大的用处了,所以awk给我们提供了有个方法,将多条编程语言放在一个文件中 然后使用-f指定这个文件执行 这个文件称为是awk脚本

    • 实例:awk -F: -f script /etc/passwd
  • awk中的各种begin,end

    • begin:有时候需要在处理数据之前运行脚本,比如给数据添加一个开头
    • end:允许你在指定一个程序脚本,在awk处理完数据的时候执行它
  • awk的内置变量吧

    • FS:Field Seperator, 输入时的字段分隔符
      • awk ‘BEGIN{FS=”:”}{print $2,$5}’ test.txt
    • RS:Record Seperator,输入行分隔符
    • OFS:Output Field Seperator, 输出时的字段分隔符;
    • ORS:Outpput Row Seperator, 输出时的行分隔符;
    • NF:Numbers of Field,字段数量
      • awk ‘BEGIN{FS=”:”}{print $1,NF}’ test.txt 整行的字段数量
    • NR:Numbers of Record, 行号;所有文件的一并计数;
    • FNR:行号;各文件分别计数;
  • awk中的匹配操作符

    • 正则表达式需要放在/expr/中,/expr/必须出现在它要控制的程序脚本的左花括号前。
      • awk ‘/110.52.250.126/ {print $1}’ access_2013_05_30.log
    • 匹配操作符允许将正则表达式限定在数据行中的特定数据字段。
      • awk ‘ ($1 ~ /110.52.250.126/) {print $1}’ access_2013_05_30.log
      • awk ‘ ($1 !~ /110.52.250.126/) {print $1}’ access_2013_05_30.log
  • 扩展

    • shell中的管道
      • command1 | command 2 他可以将command1输出的数据当做是2的输入数据进行处理
    • wc -l 统计行数
    • uniq -c在输出行的前面加上输出文件出现的次数
    • uniq -u 仅仅显示不重复的行
    • sort -nr
      • n 依照数值的大小排序
      • r 反序
      • k 按照某一列进行排序
    • head -3 取出前三个
  • 统计日志练习统计pv、uv 统计访问次数最多的三个IP

    • 日志文件链接:

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      //清洗不符合规定的数据
      awk '($7 !~ /\.css|\.gif|\.js|\.png|\.jpg/ ){print $0}' access_2013_05_30.log >>clean.log
      //我们粗略的认为清洗过后的条数就可以是pv
      wc -l clean.log 使用shell的方式统计
      awk 'BEGIN{PV=0} {PV++} END{print PV}' clean.log 使用awk的方式统计
      awk 'END{print NR}' clean.log 使用awk的方式统计
      //统计uv
      awk '{print $1}' clean.log |sort -n |uniq -u | wc -l
      //统计排名前三的ID
      awk '{print $1}' clean.log | sort -n | uniq -c | sort -nr -k 1 | head -3

sed

  • sed -i ‘s/aaa/bbb/g’ test.conf
    • i 表示对文件直接进行修改
    • s 表示操作是替换字符
    • aaa 表示的是源字符
    • bbb 表示的是替换的字符
    • g 表示对文件中所有该字符进行替换操作
 上一页

Redis

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Blog Zhao 作为主题 , 总访问量为 次 。
载入天数...载入时分秒...