Shell 常用语句查询

<font color=blue >目录</font>

[TOC]


<font color=blue>工作常用</font>

df -TH  //查看磁盘大小,解决:删除比较大无用的文件
df -i  //查看inode:文件的字节数,拥有者id,组id,权限,改动时间,链接数,数据block的位置,解决:删除数量过多的小文件
du -h --max-depth=1  //Linux中查看各文件夹大小命令
  • linux下查看当前用户的 三个命令
1,whoami;

2,id -un;

3,who -H  可以列出当前所有的    NAME (用户名)    LINE (窗口列表)    TIME(开启时间)     COMMENT(目录层次)

 (注:who 显示当前在线用户,加-H显示上边红字一栏,并且与下边信息对应)

比如:

[root@static-192-165-1-222 home]# who -H
NAME LINE TIME  COMMENT
home tty1 2016-06-30 14:28 (:0)
home pts/0 2016-07-01 10:12 (:0.0)
home pts/1 2016-07-01 11:33 (:0.0)
home pts/2 2016-07-04 18:13 (:0.0)

 

在linux下是对应的!下文将    介绍useradd 与usermod 中将叙述部分相关命令.

---------------------------------->人生犹如负重致远,不可急于求成。 自律使人自由!

<font color=blue>【菜鸟教程】常用语句和命令</font>


<font color=blue>Bash shell基本命令</font>

<font color=#FF00FF>添加环境变量</font>

例如要将/home/rongdeguo/Code 加入到环境变量中,可以在shell中输入

export PATH=$PATH:/home/rongdeguo/Code

然后查看环境变量。

echo $PATH //查看PATH变量

set //查看当前的环境变量

删除环境变量使用unset。

unset lx //删除环境变量lx

<font color=Maroon> Bash手册</font>

  • Man命令用来访问存储在Linux系统上的手册页面。
    • Eg: man ls
  • Info页面信息
  • -help or --help

<font color=Maroon> pwd命令</font>

  • pwd命令显示当前目录。

<font color=Maroon> cd命令</font>

  • cd命令在Linux系统中 切换目录;
    • 单点符(.),表示当前目录;

    • 双点符(..),表示当前目录的父目录;

    • (/), 表示进入系统根目录,上面命令执行完后拿ls命令看一下,当前目录已经到系统根目录了

    • cd ~ 进入当前用户的家目录

    • cd 跟"cd ~"命令相同,都为进入当前用户的家目录

    • cd - 进入上次所在的目录

<font color=Maroon> ls/l命令</font>

  • ls命令列出当前目录中的文件和子目录。Ls命令有很多参数可以定制输出内容;
  • l命令长列表命令,按文件的时间排序
  • ll命令长列表命令,按文件名排序。等价于"ls -l"
  • 过滤输出列表,Eg:"ll my*"
  • 参数:

    • -F 在目录后面加(/),方便用户分辨目录;
    • -a 将以点号(.)开头的隐藏文件也显示出来,默认情况是不限制这些文件的;
    • -R 递归选项,列出当前目录下包含的子目录及其包含的文件;
    • -l 长列表格式输出,在每一行列出当个文件或目录。输出的第一行显示了目录中包含的总块数。
  • linux命令之ll按时间和大小排序显示

    # 代码示例
    ll -Sh       # 按大小排序
    ll -rt       # 按时间排序
    

<font color=Maroon> touch命令创建文件</font>

  • touch命令可以创建空文件和变更已有文件的访问时间或修改时间。

<font color=Maroon> cp命令</font>

  • cp命令将已有文件或目录复制到其他位置。

Eg: cp source destination
- source 源对象
- destination 目标对象
-

  • 参数:
    • -i 提示是否真的要文件复制;Eg: cp -i source destination

<font color=Maroon> ln命令</font>

  • ln命令可以实现文件链接,即在两个位置上拥有同一个文件且不用生成单独的副本。

<font color=Maroon> mv命令实现文件重命名,在Linux中也称为移动文件</font>

-- 重命名
mv source_file target_file

-- 重命名文件
mv user_image_monthly.txt user_image_monthly_20191113.txt

-- 移动文件(schedule_file是文件夹名)
mv user_image_monthly_20191113.txt schedule_file

<font color=Maroon> mkdir命令</font>

  • mkdir创建一个新的目录,即文件夹。

<font color=Maroon> rm/rmdir命令</font>

  • rm命令删除文件,在Linux中也称为移除文件。
    • rm -rf file/dir // 不要询问,递归删除
  • Rmdir命令删除目录,即文件夹。

<font color=Maroon> find命令</font>

  • find -name 文件名:查找文件

<font color=Maroon> file命令</font>

  • File命令查看文件类型。

<font color=Maroon> cat命令</font>

  • Cat命令显示文本文件的所有内容。
  • 参数:
    • -n 给所有行加行号;
    • -b 只给有文本的行加行号;
    • -T 用^I字符组合替换文中的所有制表符;

<font color=Maroon> more命令</font>

  • more命令显示分页文本文件的内容。
  • Eg: more file_name #显示文件的前面一部分内容

<font color=Maroon> less命令</font>

  • less命令( less is more )显示分页文本文件的内容,并且能识别上下键翻页。

<font color=Maroon> tail命令</font>

  • Tail命令显示文件最后几行内容,默认情况显示末尾10行。
  • 参数:
    • -n 控制显示的行数;
    • Eg: tail -n 20 file_name #显示文件的后20行

<font color=Maroon> head命令</font>

  • head命令显示文件开头几行内容,默认情况显示前10行。

<font color=Maroon> vi/vim命令</font>

  • vi/vim命令编辑文件
    • i 进入插入模式
    • "Esc"按键退出插入模式
    • :q 未修改退出
    • !q 强制退出
    • :wq 保存修改并退出
  • vim的查找功能
    vim是一款强大的编辑器。在vim下要查找字符串。
一,全匹配:

1,从上往下查找,比如“string” :   /string

2,从下往上查找,比如“string” : ?string 

 

二,模糊匹配(正则表达式)

1,. :通配1个字符 ,如 匹配 server, 可以用  /se...r

2,* :通配多个字符,如 匹配 privilege,可以用 p*ge

 

三,快速查找


1, Shift + * :让光标停留在想要查找的单词的任意一个字母上面, 然后输入 Shift + * ,即可快速选中该单词,并且通过 n  或  N 进行上一个或下一个的匹配。

2,yw :让光标停留在单词的第一个字母上, 然后输入yw拷贝该单词, 然后输入 / (Ctrl + R) 0 (即 /”0),回车, 就查找到了第一个匹配的单词, 并且通过 n  或  N 进行上一个或下一个的匹配。

<font color=Maroon> chomd命令</font>

  • chomd命令改变文件权限
    • Eg: chomd +x file_name #赋予文件属主执行文件的权限

<font color=Maroon> 文件的上传/下载</font>

  • rz XXXXX.txt 上传
  • rz -y XXXXX.txt 覆盖上传
  • sz XXXXX.txt 下载

<font color=Maroon> Linux下文件(文件夹)的压缩和解压</font>

https://baijiahao.baidu.com/s?id=1640987338729787489&wfr=spider&for=pc

  1. zip命令

例如:zip -r mysql.zip mysql 该句命令的含义是:将mysql文件夹压缩成mysql.zip

zip -r abcdef.zip abc def.txt 这句命令的意思是将文件夹abc和文件def.txt压缩成一个压缩包abcdef.zip

  • unzip命令

与zip命令相反,这是解压命令,用起来很简单。 如:unzip mysql.zip 在当前目录下直接解压mysql.zip。

  • tar命令

例如:tar -cvf 123.tar file1 file2 dir1 该句命令实现一个tar压缩,它是将两个文件(file1和file2)和一个文件夹(dir1)压缩成一个123.tar文件。

tar -zxvf apache-tomcat-7.0.75.tar.gz 该命令在解压安装tomcat时使用,是将apache-tomcat.7.0.75.tar.gz直接解压到当前目录下。tar同时具有压缩的解压的功能,使用时根据参数和命令结构区分。


<font color=#FF00FF>字符串操作</font>

<font color=Maroon> 拼接字符串</font>

<pre>
your_name="runoob"

使用双引号拼接

greeting="hello, "your_name" !" greeting_1="hello,{your_name} !"
echo greetinggreeting_1

使用单引号拼接

greeting_2='hello, 'your_name' !' greeting_3='hello,{your_name} !'
echo greeting_2greeting_3
</pre>

<font color=Maroon> 截取字符串</font>

测试字符串
etl_date="2019-03-01-00-00"

  • 使用#截取"-"之后的内容

  • 使用%截取"-"之前的内容

符号 方向 前后字符串
#*- 从左往右 \to 找第一个字符‘-’ 截取字符‘-’之后的字符串
%%*- 从左往右 \to 找第一个字符‘-’ 之前
##*- 从右往左 \leftarrow 找第一个字符‘- 之后的字符串
%*- 从右往左 \leftarrow 找第一个字符‘- 之前
格式 说明
$${string: start :length}$ 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%%*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
  • https://www.cnblogs.com/zwgblog/p/6031256.html
    <pre>
    first_day={etl_date:9} #左边第10个字符开始,一直到结束(从0开始) month={etl_date:0-10:7} #从右边第10个字符开始,截取7个字符
    echo {var:0:5} #从左边第几个字符开始,及字符的个数 echo{var:0-7} #从右边第7个字符开始,一直到结束。
    注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
    </pre>

<font color=Maroon> Shell使用date对输入时间进行加减</font>

  • date +%Y-%m-%d #今天

  • date "+%Y-%m-%d %H:%M:%S" #带时间的格式

  • date -d "-1 day" +%Y-%m-%d #昨天

  • date -d "+1 day" +%Y-%m-%d #明天

  • 指定日期上加减

firstday='2019-01-01'


#加减一天

echo (date -d "firstday 1 day" +%Y-%m-%d)

echo date -d "$firstday -1 day" +%Y-%m-%d


#加减一周

echo date -d "$firstday-1 week " +%Y-%m-%d

echo date -d "$firstday+1 week " +%Y-%m-%d


#加减一月

echo date -d "$firstday-1 month " +%Y-%m-%d

echo date -d "$firstday+1 month " +%Y-%m-%d


#加减一年

echo date -d "$firstday-1 year " +%Y-%m-%d

echo date -d "$firstday+1 year " +%Y-%m-%d

<font color=Maroon> 字符串替换的实现</font>

  • 方法一:推荐使用,方便
    <pre>
    maxTime="2020-04-28"
    echo {maxTime/'-'/'_'} # 替换一次 echo{maxTime//'-'/'_'} # 双斜杠替换所有匹配
    </pre>
  • 方法二:字符串替换tr实现
string="2020-03-22"  
echo $string | tr '-' '_'
>>2020_03_22

echo $string | tr '-' "" #报错tr: when not truncating set1, string2 must be non-empty
function check(){
    local a="$1"
    printf "%d" "$a" &>/dev/null && echo "integer" && return
    printf "%d" "$(echo $a|sed 's/^[+-]\?0\+//')" &>/dev/null && echo "integer" && return
    printf "%f" "$a" &>/dev/null && echo "number" && return
    [ ${#a} -eq 1 ] && echo "char" && return
    echo "string"
}

<font color=#FFOOFF>常用函数变量</font>

<mark>注意:在变量、等号=和值之间不能出现空格</mark>

  • yesterday=$(date -d "-1 day" +%Y-%m-%d) #昨天

  • month_max=$(date -d "-1 day" +%Y%m)

  • mytest=(one two three four five) #数组变量

    • echo(${mytest[2]})
    • echo(${mytest[*]})
  • 计算日期
    <pre>
    let dth=(date +%d)-1 #当天日期号-1, 整数运算let 不能省 first_day=(date -d " -dth day" +%Y-%m-%d) #本月1号,也可以直接这么获取更简洁:first_day=(date +%Y-%m)+'-01'
    etl_day=(date -d "first_day -1 day" +%Y-%m-%d) #上月最后一天
    last_month={etl_day:0-10:7} #上月月份 echoetl_day ,$last_month
    </pre>

  • echo 转义符 http://www.zsythink.net/archives/96


<font color=#FF00FF>处理数据文件的命令</font>

<font color=Maroon> 排序命令sort</font>


<font color=#FF00FF>Shell 的结构化命令</font>

<font color=Maroon> if语句</font>

  • 语法 ------- P238 --------
    <pre>
    <strong>if</strong> <em>[ condition1 ]</em> #这里的方括号定义了测试条件,相当于test命令。注意,<mark>"["之后</mark>和<mark>"]"之前</mark>必须加上一个空格, 判断符号前后也一定要有空格。
    <strong>then</strong>
    <em>command set1</em>
    <strong>elif</strong> <em>condition2</em>
    <strong>then</strong>
    <em>command set2</em>
    ......
    <strong>elif</strong> <em>condition(n-1)</em>
    <strong>then</strong>
    <em>command set(n-1)</em>
    <strong>else</strong>
    <em>command setn</em>
    <strong>fi</strong>
    </pre>

  • test命令可以判断三类条件

    • 数值比较符
数值比较符 符号描述 描述
n1 -eq n2 n1 == n2 判断n1是否等于n2
n1 -ne n2 n1 <> n2 判断n1是否不等于n2
n1 -ge n2 n1 >= n2 判断n1是否大于或等于n2
n1 -gt n2 n1 > n2 判断n1是否大于n2
n1 -le n2 n1 <= n2 判断n1是否小于或等于n2
n1 -lt n2 n1 <= n2 判断n1是否小于n2
    • 字符串比较符
字符串比较符 描述
str1 = str2 判断str1与str2是否相同
str1 != str2 判断str1与str2是否不同
str1 < str2 判断str1是否比str2小(短)
str1 > str2 判断str1是否比str2大(长)
-n str1 判断str1的长度是否为非0
-z str1 判断str1的长度是否为0
- 文件比较
文件比较符 描述
-d file 判断file是否存在,并且为目录(文件夹)
-e file 判断fifile是否存在
-f file 判断file是否存在,并且是一个文件
-r file 判断file是否存在,并且可读
-s file 判断file是否存在,并且非空
-w file 判断file是否存在,并且可写
-x file 判断file是否存在,并且可执行
-O file 判断file是否存在,并且属于当前用户
-G file 判断file是否存在,并且属于当前用户组
-L file 判断file是否存在,并且为符号链接
-h file 判断file是否存在,并且为软链接
file1 -nt file2 判断file1是否比file2新
file1 -ot file2 判断file1是否比file2旧
  • 示例
    • 判断文件夹是否存在
      <pre>
      dir_r="/home/edw/log"

      如果dir_r不存在则创建该文件夹,否则移除该文件夹

      if [ ! -d dir_r ] then mkdirdir_r #mkdir创建文件夹
      else
      rmdir $dir_r #rmdir删除文件夹
      fi
      </pre>

    • 判断文件是否存在
      <pre>
      file_r="/home/edw/log/table_list_end.txt"

      如果file_r存在则清空文件内容,否则创建该文件

      if [ -f file_r ] # 注意if后面的[ ... ]一定要有空格 then echo "" >file_r #清空文件内容
      else
      touch $file_r #touch创建文件
      fi
      </pre>

<font color=Maroon> for语句</font>

  • 语法
    ------- P260 --------
    <pre>
    <strong>for</strong> <em>var</em> <strong>in</strong> <em>list</em>
    <strong>do</strong>
    <em>commands</em>
    <strong>done</strong>
    </pre>

  • 示例

    • 读取列表的值:
      <pre>
      for test in Alabama Alaska Arizona Arkansas
      do
      echo the next state is $test
      done
      </pre>

    • 读取列表中的复杂值(单引号)
      两种解决方法:

      • 使用转义符(\)来将复杂字符(比如单引号)转义
        <pre>
        for test in I don't know if this'll work
        do
        echo "word:$test"
        done
        </pre>

      • 使用双引号来定义用到单引号的值
        <pre>
        for test in I don't know if this'll work
        do
        echo "word:$test"
        done
        </pre>

    • 读取列表中的复杂值(空格)
      <pre>
      for test in Nevada New Hampshire New Mexico New York North Carolina
      do
      echo "Now going to $test"
      done

    <em>执行结果并不是我们想要的结果。因为for命令用空格划分列表中的每个值,因此需要将代码改为:</em>

    for test in Nevada "New Hampshire" "New Mexico" "New York" "North Carolina"
    do
    echo "Now going to $test"
    done
    </pre>

    • 读取文件中的值
      <pre>
      <em>下面代码实现了一段这样的功能:从table_list.txt中筛选截止当前月的表名存放到table_list_end.txt</em>

    file="/home/edw/log/table_list.txt" #存放原表名的列表
    file_r="/home/edw/log/table_list_end.txt" #筛选后的表名列表
    for table_nm in (catfile)
    do
    if [ {table_nm:0-8:6} -lemonth_max ] #当文件名中的(倒数8-2数字表示文件的月份)小于等于当前月month_max时 then echotable_nm>>$file_r
    else
    break
    fi
    done
    </pre>

<font color=Maroon> while语句</font>

  • 语法
    ------- P270 --------
    <pre>
    <strong>while</strong> <em>conditions</em> #当conditions条件满足时,执行do--done循环;直到conditions条件不满足,才退出do--done循环
    <strong>do</strong>
    <em>commands</em>
    <strong>done</strong>
    </pre>

  • 示例
    <pre>
    cnt=1
    while [ cnt -le 5 ] do echo "这是第cnt个epoch"
    cnt=[cnt+1 ]
    done
    </pre>

  • 测试过的示例
    <pre>
    nowTime='2019-01-01'
    endTime='2019-01-05'
    while [[ nowTime <endTime ]] # 双方括号允许高级字符串模式匹配运算,但是并不是所有的shell都支持双方括号
    do
    echo nowTime nowTime=`date -d "nowTime 1 day" +%Y-%m-%d`
    done
    </pre>

<font color=Maroon> until语句</font>

  • 语法
    ------- P272 --------
    <pre>
    <strong>until</strong> <em>conditions</em> #与while相反,当conditions条件不满足时,执行do--done循环;直到conditions条件满足,才退出do--done循环
    <strong>do</strong>
    <em>commands</em>
    <strong>done</strong>
    </pre>

  • 示例
    <pre>
    cnt=1
    while [ cnt -le 5 ] do echo "这是第cnt个epoch"
    cnt=[cnt+1 ]
    done
    </pre>

<font color=Maroon> 控制循环语句</font>

  • break命令
    break命令跳出循环,可以用于任意类型循环
    • break n #n指定了跳出的循环层级;默认情况下,n=1表示跳出当前循环
  • continue命令
    continue命令可以提前中止某次循环中的命令,但是并不会完全终止整个循环
    • continue n #n指定要继续的循环层级;默认情况下,n=1表示跳出当前循环

<font color=blue>Shell 定时任务</font>


  Linux系统使用cron程序来执行定时任务,cron程序会在后台检查并运行cron时间表。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:

  • minute hour day-of-month month-of-year day-of-week commands

  合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)

  除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

<font color=Maroon>设置需要执行的脚本P350</font>

新增调度任务可用两种方法:

  1. 在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
  2. 直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。
  • 示例:
* 13 * * * 4  python3 /home/jovyan/work/梦楠的数据需求_周统计/mengnan_data.py >> /home/jovyan/work/梦楠的数据需求_周统计/mengnan_data.log

0 6 1 * * sh /opt/edw/edw_batch/script/hive/dwd/overdue_num_monthly.sh >> /home/edw/log/overdue_num_monthly_run.log 2>&1 

Linux shell中2>&1的含义解释:
https://blog.csdn.net/zhaominpro/article/details/82630528

<font color=Maroon>温馨提示</font>

如果shell脚本执行不成功, 可以查看:

  1. 文本权限 chmod +x filename.sh
  • 确认文本格式是fileformat=unix,而不是fileformat=dos(设置方法见常见错误1)

<font color=Maroon>查看调度任务</font>

  • crontab -e配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务

  • crontab -l //列出当前的所有调度任务

  • crontab -l -u jp //列出用户jp的所有调度任务

<font color=Maroon>删除任务调度工作</font>

  • crontab -r //删除所有任务调度工作

<font color=Maroon>直接编辑 </font>

  • vim /etc/crontab ,默认的文件形式如下:

<font color=Maroon> 解决Crontab 获取/etc/profile中的系统变量的问题 </font>

在执行Python脚本时,获取/etc/profile中的系统变量(不同平台或不同环境有所区别)

方式一:直接添加语句

*/1 * * * * source /etc/profile && /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

方式二:使用shell包裹Python脚本

#!/bin/bash
 
source /etc/profile
 
/usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

<font color=blue>Shell 脚本文件</font>

在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。格式如下:
<pre> #!/bin/bash</pre>

<font color=#FF00FF>Shell 脚本文件中常用的日期参数</font>

<pre>
now=(date "+%Y-%m-%d %H:%M:%S") #当前时间 yesterday=(date -d "-1 days" +%Y-%m-%d) #昨天
</pre>

<font color=#FF00FF>Shell 脚本文件中常用语句</font>

<pre>
0:当前Shell程序的文件名 dirname0,获取当前Shell程序的路径
cd dirname $0,进入当前Shell程序的目录
</pre>

<font color=#FF00FF>shell脚本获取hive的查询结果,赋值给变量</font>

<pre>
result=hive -e "select etl_date from $1 where etl_date = '"$yesterday"' limit 1"
echo result </pre> 或者 <pre> result=(hive -e "select etl_date from 1 where etl_date = '"yesterday"' limit 1")
echo $result
</pre>

<font color=#FF00FF>一个完整的Shell 脚本文件参考</font>

<pre>

#!/bin/bash
# -------------说明------------- 
# Filename:  Azkaban_depend_table.sh
# Name : 
# Product : 
# Type :  
# Language : bash shell  
# Date : 2020-03-05  
# Author :cyh
# Modifid_date: 2019-12-19
# Modifid
# Revision:    1.0 
# Description :  略

source /etc/profile
#----------------------------------Define--------------------------------------------------

yesterday=$(date -d "-1 days" +%Y-%m-%d)         #昨天

# --------------------------------- Execute Hive ---------------------------------------------
hive<<EOF
SET mapreduce.job.queuename=big_slow;
SET hive.cli.print.header=TRUE;
set hive.exec.dynamic.partition=true;  
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.jobname.length=10;

----------------------------------- sql语句 ------------------------------------------------
# 写法一:不用shell参数
# insert into dm_userimage.Azkaban_depend_table
# select date_sub(current_date,1) as etl_date
# ;

# 写法二:用shell参数
insert into dm_userimage.Azkaban_depend_table
select ${yesterday}
;  


EOF
#--------------------------------- End ------------------------------------------------------
now=$(date "+%Y-%m-%d %H:%M:%S")           #当前时间
echo "${now} ${yesterday} end!!!"

</pre>

<font color=#FF00FF>一个完整的Shell 脚本文件参考《finishCheck.sh》</font>

<pre>

!/bin/bash

检查指定表的etl_date昨天的分区是否存在且至少有一条记录,检测有数据成功退出,没有错误退出

yesterday=$(date -d "-1 days" +%Y-%m-%d)

yesterday='2020-03-31'

tn="1" if [{tn:0-2}=='-m' ]
then
select_names='snapshot_date'
else
select_names='etl_date'
fi
echo $select_names

result=hive -e "select $select_names from $1 where $select_names = '"$yesterday"' limit 1"
echo result if [[ -nresult && result =~yesterday$ ]]
then
echo "今天的数据运行成功!"
exit 0
else
echo "今天的数据运行失败!"
exit 1
fi
</pre>

<font color=#FF00FF>shell脚本运行python程序</font>

  • 方法一:
    <pre>

    !/bin/bash

    python -c 'print "111";'
    </pre>

  • 方法二:
    <pre>-------------

    !/bin/bash

    python <<EOF #开始符合和结束符合相同
    print '11'
    EOF
    </pre>-----------

加个"-"最下面的EOF就可以不是行头但必须是 "tal"

1、考虑下面的需求,在主shell执行命令,进入其他的命令,后面的输入,想作为命令的输入,而不是主shell的输入,怎么办?

2、使用<<EOF,告诉主shell,后续的输入,是其他命令或者子shell的输入,直到遇到EOF为止,再回到主shell。

3、这里的EOF只是分界符,使用其他的字符也可以。


<font color=blue>脚本读取文件内容并输出</font>

这里主要介绍三种方式:

<font color=#FF00FF> 方式一 </font>

<pre>
#/bin/bash
while read line
do
echo $line
done < a.txt
</pre>

<font color=#FF00FF> 方式二 </font>

<pre>
#/bin/bash
cat a.txt | while read line
do
echo $line
done
</pre>

<font color=#FF00FF> 方式三 </font>

<pre>
for line in (cat a.txt) do echoline
done
</pre>

<font color=blue>常见问答</font>

<font color=#FF00FF> 条件判断[ -n str ] </font>

问:linux里while [ -n "$1" ]这里的-n是什么意思?
答:-n str,字符串不为null,长度大于零

  • 示例
    <pre>
    if [ -n "$1" ]; then
    echo "包含第一个参数"
    else
    echo "没有包含第一参数"
    fi
    </pre>

<font color=#FF00FF> exit n </font>

  • exit 0 代表正常运行程序并退出程序,
  • exit 1 代表非正常运行导致退出程序

<font color=blue>常见错误</font>

<font color=#FF00FF>解决“/bin/bash^M: bad interpreter: No such file or directory”</font>

在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识。
查看脚本文件是dos格式还是unix格式的几种办法。

  1. <mark>cat -A filename</mark> 从显示结果可以判断,dos格式的文件行尾为^M,unix格式的文件行尾为"\"。
  • od -t x1 filename 如果看到输出内容中存在0d 0a的字符,那么文件是dos格式,如果只有0a,则是unix格式。
  • <table><td bgcolor=orange> vi filename打开文件,执行 <mark>: set ff</mark>,如果文件为dos格式在显示为fileformat=dos,如果是unxi则显示为fileformat=unix.</td></table>

解决方法:

  1. 使用linux命令<mark>dos2unix filename</mark>,直接把文件转换为unix格式
  • 使用sed命令sed -i "s/\r//" filename 或者 sed -i "s/^M//" filename直接替换结尾符为unix格式
  • <table><td bgcolor=orange> vi filename打开文件,执行 <mark>: set ff=unix</mark> 设置文件为unix,然后执行:wq,保存成unix格式。</td></table>

<font color=#FF00FF>swap file "*.swp" already exists!的解决方法</font>

Linux下编程难免要开启多个vim共同编辑同一个文件,这时再次保存就会出现:

swap file "*.swp" already exists!

[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

  • 原因:
    使用vim编辑文件实际是先copy一份临时文件并映射到内存给你编辑, 编辑的是临时文件, 当执行:w后才保存临时文件到原文件,执行:q后才删除临时文件。
    每次启动检索式否有临时文件, 有则询问如何处理,就会出现如上情景。
  • 解决方法:
    执行以下命令:找到临时文件,然后删除

ll -a //显示隐藏文件

rm .*.swp //删除隐藏文件

<font color=blue>Sqoop 几种导入导出模式</font>

<font color=#FFOOFF>全量导入</font>

例如:
<pre>
bin/sqoop import \ (输入命令)
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/testdb \ (指定连接jdbc端口和数据库名称)
--username root \ (数据库用户名)
--password root123 \ (密码 若不适用明文指定数据库密码 则可以用-P)
--table user \ (指定数据库中的一张表)
--target-dir /input/import \ (指定数据导入到HDFS上的目录)
--delete-target-dir \ (如果目标目录已存在,则先删除)
--num-mappers 1 \ (指定使用导入数据的map个数,mapreduce(V1)中的方式可以用-m 1 代替(过时))
--fields-terminated-by "," (目标文件的分隔符, 默认情况下,导入HDFS的每行数据分隔符是逗号)
</pre>


<font color=blue>Shell 邮件发送</font>

<font color=#FFOOFF>mailx邮件发送(比较好用)</font>

假设邮件内容存储于msg文件中,那么可以用如下方法:

<pre>mailx -s "test mail" zdd@163.com < msg </pre>

或者

<pre>cat msg | mailx -s "test mail" zdd@163.com </pre>

把打印的内容作为标准输入,送给mail命令

<pre>echo -e $email_contents | mailx -s "test mail" zdd@163.com </pre>

也可以直接从命令行输入邮件内容:

<pre>mailx -s "test mail" zdd@163.com </pre>

上面这条命令会进入命令行输入状态,此时可以输入内容,按Ctrl+d键来结束输入。

其他选项

-r 指定发件人

-c 指定抄送人

-b 指定密送人

多个收件人之间用逗号分隔

<pre>cat msg | mailx -s "test mail" zdd@163.com,zdd2@163.com,zdd2@163.com</pre>

mail和mailx基本是一样的,用法差不多

<font color=#FFOOFF>六种使用Linux命令发送带附件的邮件</font>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容