<font color=blue >目录</font>
[TOC]
<font color=blue>工作常用</font>
df -TH //查看磁盘大小,解决:删除比较大无用的文件
df -i //查看inode:文件的字节数,拥有者id,组id,权限,改动时间,链接数,数据block的位置,解决:删除数量过多的小文件
- Linux中查看各文件夹大小命令:https://www.cnblogs.com/iconfig/p/4863063.html
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
- 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} !"
echo greeting_1
使用单引号拼接
greeting_2='hello, '{your_name} !'
echo greeting_3
</pre>
<font color=Maroon> 截取字符串</font>
测试字符串
etl_date="2019-03-01-00-00"
使用#截取"-"之后的内容
使用%截取"-"之前的内容
符号 | 方向 | 前后字符串 |
---|---|---|
#*- | 从左往右 找第一个字符‘-’ | 截取字符‘-’之后的字符串 |
%%*- | 从左往右 找第一个字符‘-’ | 之前 |
##*- | 从右往左 找第一个字符‘- | 之后的字符串 |
%*- | 从右往左 找第一个字符‘- | 之前 |
格式 | 说明 |
---|---|
$${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:0-10:7} #从右边第10个字符开始,截取7个字符
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 firstday 1 day" +%Y-%m-%d)
echodate -d "$firstday -1 day" +%Y-%m-%d
#加减一周
echodate -d "$firstday-1 week " +%Y-%m-%d
echodate -d "$firstday+1 week " +%Y-%m-%d
#加减一月
echodate -d "$firstday-1 month " +%Y-%m-%d
echodate -d "$firstday+1 month " +%Y-%m-%d
#加减一年
echodate -d "$firstday-1 year " +%Y-%m-%d
echodate -d "$firstday+1 year " +%Y-%m-%d
<font color=Maroon> 字符串替换的实现</font>
- 方法一:推荐使用,方便
<pre>
maxTime="2020-04-28"
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
https://blog.csdn.net/u010003835/article/details/80750003
<pre>
string="hello,shell,split,test"
array=({array[@]}
do
echo $var
done
</pre>示例
<pre>
date_flag="2020-03-22"
my_array=({my_array[1]}""{my_array[0]}"_"{my_array[2]}"
echo sample_p
</pre>
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 " -(date +%Y-%m)+'-01'
etl_day=first_day -1 day" +%Y-%m-%d) #上月最后一天
last_month=etl_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 #mkdir创建文件夹
else
rmdir $dir_r #rmdir删除文件夹
fi
</pre> -
判断文件是否存在
<pre>
file_r="/home/edw/log/table_list_end.txt"如果file_r存在则清空文件内容,否则创建该文件
if [ -f 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 file)
do
if [ month_max ] #当文件名中的(倒数8-2数字表示文件的月份)小于等于当前月table_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个epoch"
cnt=cnt+1 ]
done
</pre>测试过的示例
<pre>
nowTime='2019-01-01'
endTime='2019-01-05'
while [[ endTime ]] # 双方括号允许高级字符串模式匹配运算,但是并不是所有的shell都支持双方括号
do
echo 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个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>
- 菜鸟:https://www.runoob.com/linux/linux-comm-crontab.html
- https://www.cnblogs.com/sharesdk/p/7852903.html
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>
新增调度任务可用两种方法:
- 在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
- 直接编辑/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脚本执行不成功, 可以查看:
- 文本权限 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 -d "-1 days" +%Y-%m-%d) #昨天
</pre>
<font color=#FF00FF>Shell 脚本文件中常用语句</font>
<pre>
0,获取当前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 (hive -e "select etl_date from 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="{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 && 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 line
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格式的几种办法。
- <mark>cat -A filename</mark> 从显示结果可以判断,dos格式的文件行尾为^M"。
- 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>
解决方法:
- 使用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>
- linux 发送邮件(含附件) https://www.iteblog.com/archives/2027.html?from=like#mailx
<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>
- 示例:
<pre>
email_contents="hi 董晓琳,\n
附件是本月提取的数据,烦请查收。" #邮件内容
echo -e $email_contents | mailx -s "车贷数据" \ #邮件标题
-a /home/edw/log/car_data_monthly.txt \ # 附件
-r cuiyahong180629@credithc.com \ # from somebody
-c mazhongwei180808@credithc.com,xiaoshan161031@credithc.com \ # cc somebody
dongxiaolin180725@credithc.com # to somebody
</pre>