Shell编程学习笔记

常用命令介绍

历史命令(History)
  • history:查看历史命令,默认1k条
  • !!:上一条命令
  • !$:获取上一条命令的最后一个参数
  • !+数字:运行第几条历史命令
  • !+字符串:从历史命令最近一条开始匹配,以该字符串开头的命令
别名(alias)
  • 列出所有的别名设置:alias
  • 设置别名:alias a=’b’
  • 取消别名设置:unalias a
重定向
  • 重定向符号
    • 重定向,覆盖原来的内容:>
    • 重定向,追加到原来的内容:>>
    • 反向重定向,目标是一个程序:<
    • 错误重定向,覆盖原来的内容:2>
    • 错误重定向,追加到原来的内容:2>>
    • 错误重定向到标准输出:2>&1
//执行结果输出到1.log,错误信息输出到2.log
sh test.sh > 1.log 2>2.log
//效果等同于:sh test.sh > 1.log 2>1.log
sh test.sh > 1.log 2>&1
//错误信息追加到1.log
sh test.sh >> 1.log 2>>&1
  • 快速清空文件内容
    • : > filename 或者 > filename
    • echo “” > filename 或者 echo > filename(cat打印会有一个空行)
    • echo -n “” > filename(去除空行)
    • cat /dev/null > filename
    • truncate -s 0 filename
任务
  • 暂停任务:ctrl+z
  • 停止任务(前台执行的):ctrl+c
  • 查看后台运行的任务:jobs
  • 后台执行任务
    • filename &(Shell关闭后任务会停止)
    • nohup filename &(Shell关闭后任务继续执行)
    • setsid filename (Shell关闭后任务继续执行)
  • 前台继续执行暂停的任务:fg job_id
  • 后台继续执行暂停的任务:bg job_id
  • 终止后台执行的任务:kill %job_id或者kill pid
管道
  • 管道符号:|
  • 分割命令:cut
//对文件内容按分号分割,并且去除第2到4段的内容
cat filename|cut -d ':' -f 2-4
//对文件内容进行分割,并且取出第10个字符
cat filename|cut -c 10
  • 匹配命令:grep
    • 统计匹配到的行数:-c
    • 显示行号:-n
    • 忽略大小写:-i
    • 反向输出:-v
    • 颜色显示:–color=auto
//查找含有home关键字的行,并且输出行号,颜色标识
cat filename|grep -n --color=auto 'home'
//搜索多个字符串匹配
grep -E "aaa|bbb|ccc"
  • 排序命令:sort
    • 忽略大小写:-f
    • 数字排序:-n
    • 不显示重复行:-u
    • 指定分隔符:-t
    • 指定根据排序的段:-k(与-t一起使用)
    • 反向排序:-r
//文件内容每行按:分割,然后根据第三段内容进行排序
cat filename|sort -t ':' -k 3
  • 不显示重复行:uniq [-ic]
  • 统计数据:wc [-lwm]
//统计文件行数
cat filename|wc -l
  • 重定向并且输出到终端:tee
//输出结果重定向到1.log,并且打印到终端
cat filename|tee 1.log
  • 替换命令:tr [-ds]
//将文件中的所有小写字母转换为大写字母
cat filename|tr '[a-z]' '[A-Z]'
  • 标准输入作为命令的参数:xargs
//将执行结果作为一行输出
ls|xargs

Shell正则

grep/egrep
  • 符号匹配:
    • 匹配零个及以上的字符:ro*t
    • 匹配任意的一个字符:ro.t
    • 匹配零个或者一个字符:ro?t(与-E一起使用)
    • 匹配一个或者多个字符:ro+t(与-E一起使用)
    • 贪婪模式,匹配所有:.*
sed 查找替换
//打印第一行
sed '1p' -n 1.txt 
//打印第五行到最后一行,并显示行号
grep -n '.*' 1.txt | sed '5,$p' -n 
//包含root行
grep -n '.*' 1.txt | sed '/root/p' -n 
//正则匹配
grep -n '.*' 1.txt | sed -r '/ro?t/p' -n 
//流水线匹配,等价于 grep -n '.*' 1.txt | sed '/root/p;/mysql/p' -n
grep -n '.*' 1.txt | sed -e '/root/p'  -e '/mysql/p' -n 
//删除第五行到最后一行
grep -n '.*' 1.txt | sed '5,$d' 
//替换
grep -n '.*' 1.txt | sed 's/root/toor/g' 
//删除所有数字
grep -n '.*' 1.txt | sed 's/[0-9]//g' 
//删除所有非数字
grep -n '.*' 1.txt | sed 's/[^0-9]//g' 
//直接替换文档
sed -i 
awk
//分隔符匹配,并且打印某个段
awk -F ':' '{print $2}' 1.txt 
//根据分割之后的结果,再进行匹配
awk -F ':' '$1~/root/' 1.txt 
//替换分隔符打印输出
awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt 
//精准匹配
awk -F ':' '$1=="root" {print $1,$2}' 1.txt 
awk -F ':' '$1=="root" || NR>30 {print $1,$2}' 1.txt (或者行号大于30)
awk -F ':' '$1=="root" && NR>30 {print $1,$2}' 1.txt (并且行号大于30//改变某一段的值
awk -F ':' '$1=$3+$4 {print}' 1.txt 
//段数大于3小于10
awk -F ':' 'NF>3 && NF<10 {print $1,$2}' 1.txt 

Shell脚本编程

  • 脚本第一行:#!/bin/bash
  • 注释符号:#
  • 查看脚本执行过程,用于调试使用:bash/sh -x filename
date
//获取当前时间的年份,2017
date +%Y
//获取当前时间的年份,最后两位,17
date +%y
//获取当前时间的月份,05
date +%m
//获取当前时间的日期,27
date +%d
//获取当前时间的小时
date +%H
//获取当前时间的分钟
date +%M
//获取当前时间的秒数
date +%S
//获取当前时间的秒数,1495873175
date +%s
//由秒数推导出日期
date -d @100
//格式化输出当前时间,2017-01-01 20:32:33
date +"%F %T"
//当前时间是周几
date +%w
//当前时间是第几周
date +%W
//获取前一天日期(可以+/-,可以month/hour/min/sec)
date -d "-1 day" +"%F %T"
变量
  • 输出系统内置变量:env
  • 变量设置/取消
    • set wc=”“cat filename|wc -l
    • unset wc
    • set(打印所有变量)
  • 声明变量:export MY_HOME=/home/user(可以在子shell中使用)
  • 系统的变量:/etc/profile/etc/bashrc
  • 用户的变量:~/.bashrc~/.bash_profile
  • 命令提示符:PS1
//[root@wangs ~]# 用户名,主机名,目录
echo $PS1
[\u@\h \W]\$
  • 变量赋值:a=”home/user/hadoop/hive/bin/hive”
  • 命令执行结果赋值给变量:dir=which hadoop
  • 脚本中读取输入:read -p “请输入一个数字:” n
  • 内置变量(保存读取的输入数据):$REPLAY
  • 获取变量参数
    • 获取当前脚本的文件名:$0
    • 获取参数:$n(n表示第几个参数)
    • 获取参数个数:$#
    • 获取所有参数:$*
    • 获取上个命令的退出状态:$?
    • 当前Shell的pid:$$
运算
a=1;b=2
let c=a+b
//空格不能少!
c=`expr $a + $b`
c=$((a+b))
c=$[$a+$b]
逻辑判断
  • if条件判断
if [ xxx ]
then xxx
elif [ xxx ]
then xxx
else
xxx
fi
  • case条件判断
case "$1" in:
    start)
        xxx
        ;;
    stop)
        xxx
        ;;
    *)
        xxx
        ;;
esac
  • 比较符号:–gt >;-ge >=;-lt <;-le <=;-eq ==;-ne !=
 if [ $a -lt 3 ]; then echo ok;else echo nook; fi
 if (($a>3)); then echo ok;else echo nook; fi
  • 连接符号:&& ||
    if [ $a -lt 10 ] && [ $a -gt 3 ]; then echo ok; fi
    if [ $a -lt 10 ] || [ $a -gt 3 ]; then echo ok; fi
    //等价于&&
    if [ $a -lt 10 -a $a -gt 3 ]; then echo ok; fi
    //等价于||
    if [ $a -lt 10 -o $a -gt 3 ]; then echo ok; fi
  • 判断是否存在:-e;-f ;-d ;-r;-x;-w
if [ -e file/dir ]; then echo "exist"; fi
//取反操作
if [ ! -e file/dir ]; then echo "not exist";
//简单判断并输出
[ -f file ] && echo "exist"
[ -f file ] || echo "exist" 取反操作
  • 判断是否为空:if [ -z $n ]
if [ -z $n ] 
循环
  • for循环
//从1100,步长为2,步长可以为负数
for i in {1..100..2}
do
    echo $i
done 
  • while循环
while :
do
    sleep(2)
    echo `date +"%F %T"`
done
函数
sum() {
   s=$[$1+$2]
   return $s
sum 1 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值