前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell编程学习笔记

Shell编程学习笔记

作者头像
skyyws
发布2022-05-20 08:10:10
5140
发布2022-05-20 08:10:10
举报
文章被收录于专栏:skyyws的技术专栏

常用命令介绍

历史命令(History)
  • history:查看历史命令,默认1k条
  • !!:上一条命令
  • !$:获取上一条命令的最后一个参数
  • !+数字:运行第几条历史命令
  • !+字符串:从历史命令最近一条开始匹配,以该字符串开头的命令
别名(alias)
  • 列出所有的别名设置:alias
  • 设置别名:alias a=’b’
  • 取消别名设置:unalias a
重定向
  • 重定向符号
    • 重定向,覆盖原来的内容:>
    • 重定向,追加到原来的内容:>>
    • 反向重定向,目标是一个程序:<
    • 错误重定向,覆盖原来的内容:2>
    • 错误重定向,追加到原来的内容:2>>
    • 错误重定向到标准输出:2>&1
代码语言:javascript
复制
//执行结果输出到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
代码语言:javascript
复制
//对文件内容按分号分割,并且去除第2到4段的内容
cat filename|cut -d ':' -f 2-4
//对文件内容进行分割,并且取出第10个字符
cat filename|cut -c 10
  • 匹配命令:grep
    • 统计匹配到的行数:-c
    • 显示行号:-n
    • 忽略大小写:-i
    • 反向输出:-v
    • 颜色显示:–color=auto
代码语言:javascript
复制
//查找含有home关键字的行,并且输出行号,颜色标识
cat filename|grep -n --color=auto 'home'
//搜索多个字符串匹配
grep -E "aaa|bbb|ccc"
  • 排序命令:sort
    • 忽略大小写:-f
    • 数字排序:-n
    • 不显示重复行:-u
    • 指定分隔符:-t
    • 指定根据排序的段:-k(与-t一起使用)
    • 反向排序:-r
代码语言:javascript
复制
//文件内容每行按:分割,然后根据第三段内容进行排序
cat filename|sort -t ':' -k 3
  • 不显示重复行:uniq [-ic]
  • 统计数据:wc [-lwm]
代码语言:javascript
复制
//统计文件行数
cat filename|wc -l
  • 重定向并且输出到终端:tee
代码语言:javascript
复制
//输出结果重定向到1.log,并且打印到终端
cat filename|tee 1.log
  • 替换命令:tr [-ds]
代码语言:javascript
复制
//将文件中的所有小写字母转换为大写字母
cat filename|tr '[a-z]' '[A-Z]'
  • 标准输入作为命令的参数:xargs
代码语言:javascript
复制
//将执行结果作为一行输出
ls|xargs

Shell正则

grep/egrep
  • 符号匹配:
    • 匹配零个及以上的字符:ro*t
    • 匹配任意的一个字符:ro.t
    • 匹配零个或者一个字符:ro?t(与-E一起使用)
    • 匹配一个或者多个字符:ro+t(与-E一起使用)
    • 贪婪模式,匹配所有:.*
sed 查找替换
代码语言:javascript
复制
//打印第一行
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
代码语言:javascript
复制
//分隔符匹配,并且打印某个段
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
代码语言:javascript
复制
//获取当前时间的年份,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
代码语言:javascript
复制
//[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:$$

运算
代码语言:javascript
复制
a=1;b=2
let c=a+b
//空格不能少!
c=`expr $a + $b`
c=$((a+b))
c=$[$a+$b]
逻辑判断
  • if条件判断
代码语言:javascript
复制
if [ xxx ]
then xxx
elif [ xxx ]
then xxx
else
xxx
fi
  • case条件判断
代码语言:javascript
复制
case "$1" in:
    start)
        xxx
        ;;
    stop)
        xxx
        ;;
    *)
        xxx
        ;;
esac
  • 比较符号:–gt >;-ge >=;-lt <;-le <=;-eq ==;-ne !=
代码语言:javascript
复制
 if [ $a -lt 3 ]; then echo ok;else echo nook; fi
 if (($a>3)); then echo ok;else echo nook; fi
  • 连接符号:&& ||
代码语言:javascript
复制
    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
代码语言:javascript
复制
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 ]
代码语言:javascript
复制
if [ -z $n ] 
循环
  • for循环
代码语言:javascript
复制
//从1到100,步长为2,步长可以为负数
for i in {1..100..2}
do
    echo $i
done 
  • while循环
代码语言:javascript
复制
while :
do
    sleep(2)
    echo `date +"%F %T"`
done
函数
代码语言:javascript
复制
sum() {
   s=$[$1+$2]
   return $s
sum 1 2
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用命令介绍
    • 历史命令(History)
      • 别名(alias)
        • 重定向
          • 任务
            • 管道
            • Shell正则
              • grep/egrep
                • sed 查找替换
                  • awk
                  • Shell脚本编程
                    • date
                      • 变量
                        • 运算
                          • 逻辑判断
                            • 循环
                              • 函数
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档