1. “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
2. 分号可分隔一行中多条命令,shell分别执行
3. 命令以 & 符结尾,shell将在后台执行前面的命令,并不等该命令执行完,则执行下一条命令
4. sed (stream editor), 最常用功能是文本的替换
s命令以g结尾表示全局性,如果没有g,则会替换第一个匹配,加数字n,表示替换第n个匹配的内容
sed address command 可以处理特殊指定的行
sed '/eee/ s/555/8888/' sed.txt 将含有eee的行中的555改为8888
sed '/eee/! s/111/39829287/' sed.txt 将不包含eee行中, 包含111改为3982987
sed '/^$/d' dataTest.dat 删除空白行
sed -n 4p 打印显示第4行
5. cut 命令选择文件中特定域内容。
cut -c 以字符内容为主,选出特定字符
cut -d \t 以指定的域分割符分割文件, 结合-f选择指定的域
cut -f 选择指定列
例 : cut -d " " -f 2 sed.txt 以空格作分割符,,选择第一列
cut -c 1-3 sed.txt 选择第1-3 个字符
5。 paste a.dat b.dat -d "\t" 拼接文件各列 -d delimter 分割符
6. join 命令可以拼接key相同的字段
join -t $'\t' ageRaw.txt app.dat > ageJoinApp.dat
bb 8 2
ff 2 4
cc 4 4
dd 5 5
join file1.txt file2.txt
输出:aa 1 2 2 1
bb 2 3 8 2
join -1 2 -2 3 file1.txt file2.txt # 以第一个文件的第二列和第二个文件的第三列做匹配字段
输出: 1 aa 2 aa 2
2 bb 3 bb 8
4 cc 6 ff 2
4 cc 6 cc 4
join -o 1.1 1.1 2.2 1.2 file1.txt file2.txt # 输出第一个文件的第1列,第二个文件第2列,第一个文件第1列
join -a1 file1.txt file2.txt # 左连接
join -a2 file1.txt file2.txt # 右连接
join -a1 -a2 file1.txt file2.txt # 全连接
join -v1 -v2 test1.dat test2.dat # 只显示没有join上的两个文件内容
7. uniq 用于选择sort后的重复行操作,(它只处理相邻行重复的内容,因此常与sort联 用)
sort test.txt | uniq -c -c 列出每行重复的个数,
2 aaa
3 bbb
2 ccc
sort test.txt | uniq -d -d 仅列出重复行
aaa
bbb
sort test.txt | uniq -u -u 仅列出非重复行
8. wc -c 计算字节数
wc -l 行数
wc -w 字符数
9. 文件描述符0、1、2分为别标准输入、输出、错误输出
ls 1> standout.dat 2> standerr.dat 将标准输出到第一个文件 ,错误输出到第二个文件
ls > test.dat 2>&1 将错误输出,也输出到第一个文件,其中 &1 是shell语法,表示标准输出文件
10. df -h dir 以人类可读形式,给出目录空间资源使用情况
11. du -h dir 以人类可读形式,给出目录大家
12. diff newUserId.dat payUserId.dat 比较文件的不同
diff a.dat b.dat -y -W 50 -y表示并列输出, -W表示列宽
diff a.dat b.dat -u -u表示以合并的试显示不同的行
13. shell数学运算
a=2
let a++ //自加
let a-- //自减
let a+3
a=2
b=3
let c=a+b
echo $c
let c+=2
echo $c
--------------
a=2;b=3
c=$[ $a + $b ]
d=$((a + b))
e=`expr 3 + 4`
expr 5 \* 4
echo $c
-----------------
14. 数组定义(索引值以0开始)
a=("a" "b" "c")
b=(1 2 3 4)
echo ${a[2]}
echo ${b[3]}
c[0]="a"
c[1]="b"
echo ${c[1]}
echo ${!a[*]} #列出索引列表
echo ${!a[@]} #列出索引列表
15. 延时4秒 sleep 4
16. 压缩连续的空白行 : cat -s test.dat
显示行号 : cat -n test.dat
显示不可见字符:cat -v test.dat
cat -v test.dat | tr -d "^M"
移除空白行 : cat test.sh | tr -s '\n'
17. find [files or dirctory] [options]
例
1. find game/ new* 查找game下包含new的所有文件
find etlTask/* -name "*at2tab*"
2 find game/ -name 'data' 查找game目录下,文件名为data的文件或目录
find ./* ! -name 'data' 不包含data的
多条件查找
find $subDir/ \( -name api.kkmh.com80_comic_refactor_server* -o -name api.kkmh.com80_topic_backend* -o -name ${month}* \) >> $baseDir/dataRep/comic$month".dat"
3 find newUserPay "new" | xargs grep "input" 搜索newUserPay目录下 包含 "new"文件名的 ,包含 input字符的行
4 删除找到内容
18. xargs 将标准输入转换为命令行参数,也可将单行变为多行
cat dataTest.dat | xargs
cat dataTest.dat | xargs -n 3 换成3行
echo "a#b#c#d" | xargs -d "#"
find ./* "*.dat" | xargs cat | wc -l
19. tr 命令对标准输入,进行替换、删除及压缩,注意,它只能对标标准输入,不能对参数
原理:tr 将一个集合,映射到另一个集合
替换 :echo "HELLO " | tr 'A-Z' 'a-z'
删除 :
echo "abcda" | tr -d 'a' 删除字符串a,
echo "abcdefga" | tr -d 'a-c' 删除a至c之间的字符
tr -d '\n\t' 删除回换行
tr -s " " 删除空格
-c [set] 设定补集 echo "a1b2c3" | tr -d -c "0-9" 将非0-9的内容输出
cat dataTest.dat | $[ $(tr '\n' '+') 0 ] 将数字列相加
20. 文件校验和 : md5sum dataTest.dat
21. comm 可求两个文件的交集、差集,及求差,计算前需要对两文件进行sort排序
comm a.dat b.dat 对经sort排序过的两个文件进行排序,输出以 \t 分割,第一列为仅第一个文件 中出现,第二列为仅第二文件中出现,第三列为两文件交集
-1、-2、-3为删除输出列,comm a.dat b.dat -1 -2 仅输出第三列
comm a.dat b.dat -3 | sed 's/\t//g' 将两个文件各自有的,输出合并。
22. pushd . 将当前路径加入栈,popd . 输入栈中记录的目录
23. grep 匹配
grep -c "a" a.dat -c 计算匹配文本的行数
grep -v "a" a.dat -v 找出不匹配的内容 inverse
grep "a" . -R -n 递归匹配内容
grep -i aa dataTest.dat -i 忽略大小写
grep -e "aa" -e "b" dataTest.dat 多个匹配样式
egrep "@URL:|@FILTER:|@CONTENT:" 匹配多个模式,同时显示
grep -E ‘abc|xyz’ 匹配多个模式
grep "相关错误讯息\|正确\|文件过期" $report_log 多个条件或
grep ^[1-9]*$ 正则所有数字,不加引号
24. 迭代文件每一行
while read line;
do
echo $line
done < dataTest.dat
或 : cat dataTest.dat | while read line; do echo $line; done
25. 列出所有端口信息 lsof -i
26. history 列举近期使用的命令
27. watch 监视命令输出 watch 参数 命令
-n或--interval watch缺省每2秒运行一下程序
-d或--differences 用-d或--differences 选项watch 会高亮显示变化的区域
每隔一秒高亮显示网络链接数的变化情况 : watch -n 1 -d netstat -ant
每隔一秒高亮显示http链接数的变化情况 : watch -n 1 -d 'pstree|grep http'
监测当前目录中 gz 的文件的变化 :
watch -d 'ls -l| grep gz'
或者 watch du -b weibo-* (可用)
watch -n 2 -d wc -l weibo-*
watch ls . 监视当前目录
ls data/ | wc -l | xargs watch 监视目录文件 个数
watch du -k 7DayDevice.dat 监视文件大小变化
28. which 命令用于查找某条命令的位置 which hadoop
whereis 类似于which
whatis chown 查询命令的作用
29. vim 全选 ggVG ,全选复复制 ggyG
多行选中 : 按下大写V
多行注释 :1. 进入vi/vim编辑器,按CTRL+V进入可视化模式(VISUAL BLOCK)
2. 移动光标上移或者下移,选中多行的开头
3. 选择完毕后,按大写的的 I 键,此时下方会提示进入“insert”模式,输入你要插入的注释符
4. 最后按ESC键,你就会发现多行代码已经被注释了
5. 删除多行注释的方法,同样 Ctrl+v 进入列选择模式,移到光标把注释符选中,按下d,注释就被删除了
30.vim全局替换替换命令:
:%s/源字符串/目的字符串/g
31. 得到当前时间戳 date +%s
date -d "2017-12-01 00:00:00" +%s
时间戳转换为日期 date -d @1496198664
32 printf "%-5s,%4.2f" abcde 5.987 格式化输出,与echo类似
33. read abc #等待读取输入,直到回车后表示输入完毕,并将输入赋值给变量abc
read one two three #在控制台输入1 2 3,它们之间用空格隔开。
#echo "one = $one, two = $two, three = $three"
34. 别名就是提供一种便捷的方式来完成某些长串命令的操作。省去不必要的麻烦,提高效率。一般可以是函数或者alias命令来实现。
alias vi='vim'
35. wget http://www.linuxde.net/testfile.zip
wget --limit-rate=300k http://www.linuxde.net/testfile.zip
以下的例子是从网络下载一个文件并保存在当前目录
36. nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!
37. 查看系统类型 cat /etc/issue
38. top 命令查看系统运行进程状况
按下 1 键,可以查看CPU状态
top -p 8943 显示指定进程号
39. gzip压缩 :gzip a.dat 可得到a.dat.gz
gip解压 gunzip a.dat.gz 可解压该文件, 或gzip -d a.dat.gz
查看压缩内容:gzip -l a.dat.gz
递归压缩目录 : gzip -rv test 递归解压:gzip -rd test
使用 zip 压缩
zip -r bossData.zip bossData/
打包压缩命令: tar -zcvf bigFile2Small.tar.gz part/
查看压缩包文件: tar -ztvf small.tar.gz
解压文件 tar -zxvf /tmp/etc.tar.gz /usr/local/src
gzip -d **.gz
unzip yasuo.zip
40. date获取时间
1.获取当前时间
DATE=`date +%Y-%m-%d`
2.获取前一天时间
DATE=`date -d "-1 day" +%Y-%m-%d`
old_date=$(date -d "1 days ago" +%Y-%m-%d)
DATE=`date -d "-7 day" +%Y-%m-%d`
startTime=`date +%Y-%m-%d" "%H:%M:%S`
3 获取前一小时
date -d "2019-03-01" +%Y%m%d # 日期格式化 ,输出为 20190301
date -d "+3 days 2019-03-01" +%Y%m%d # 日期格式化 ,输出为 20190304
date -d "1 hours ago 2010-01-11 13:24:59"
date -d "1 hours ago" +%Y%m%d%H
nowDate=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
4 获取前一个月
date -d "last month" +%m
41. ps命令
显示所有进程信息,连同命令行 ps -ef
列出目前所有的正在内存当中的程序 ps -aux
42. nc 命令 netcat 内网文件传输
查看端口内容 : (echo stats;echo quit) | nc 10.75.57.23 11234 | grep "baoquan.in.items"
a.接收端启动命令: nc -l 2389 > flumeTest.tar.gz
b.发送端启动命令:nc 10.9.33.117 2389 < flumeTest.tar.gz
43. column 命令:用来格式化列信息
column [-tx] [-c columns] [-s sep] [file ...]
mount | column -t
ll | column
44. sort 命令
按内存资源的使用量对进程进行排序 : ps aux | sort -rnk 4
按 CPU 资源的使用量对进程进行排序 : ps aux | sort -nk 3
45. script 命令可以用来记录所输入的命令,等exit时输出结束
46. stat 获取文件具体时间 stat tmp2.dat
Access: 2017-09-25 09:46:04.000000000 +0800
Modify: 2017-09-25 09:45:34.000000000 +0800
Change: 2017-09-25 09:45:34.000000000 +0800
[search@10 qi-user_type-format]$ stat tmp2.dat | grep Change
Change: 2017-09-25 09:45:34.000000000 +0800
47. #*/ 与 ##*/
#*/ : 删掉第一个 / 及其左边的字符串
##*/ 得到最后的内容
例如:a="a/b/c/d/e/f/g/a.txt",
b=${a#*/} ---> b/c/d/e/f/g/a.txt
c=${a##*/} ---> a.txt
48. exit
exit 0 : 上一条命令执行成功,则退出脚本
exit 1 : 上一条命令执行失败,则退出脚本
exit $? : 根据上一条命令的退出码退出脚本,脚本常用
49. 获取时间
DATE=`date +%Y-%m-%d`
DATE=`date -d "-1 day" +%Y-%m-%d`
DATE=`date -d "-7 day" +%Y-%m-%d`
date -d "1 hours ago 2010-01-11 13:24:59"
date -d "1 hours ago" +%Y%m%d%H
nowDate=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
date -d "last month" +%m
date "+%s" 时间戳
50. 计算任务运行时间
start=$(date +%s) #开始时间
retrievalHbase $inputFile $type $fin alResultDir
end=$(date +%s) #结束时间
time=$(( $end - $start ))
echo $time
51 同时杀死多个任务
ps -ef | grep off_setqueue.php | awk '{print $2}' | xargs kill -9
52 awk 把字符串数据按数值输出
(echo stats;echo quit) | nc 10.77.104.65 11233 | grep "" | awk -F " " '{tmp=$3};END{tmp=tmp+0;print tmp}'
53 删除队列名
printf 'delete contrib_async_mq+sub1+sub3\r\n'|nc 10.73.12.198 11233
print 'delete evaluate+topic_pic\r\n' | nc 10.77.104.194 11233
54 dirname 得到当前目录名
basename 得到文件名
baseDir=`cd $(dirname $0); pwd`
filePath=$(cd "$(dirname "$0")/../.."; pwd)
basename /data1/data_final/user_fans.txt
55 sleep
sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时
57 给邮箱发邮件
echo "file num is 100" | mail -s "topicNumAlarm" baoquan3@staff.weibo.com
mail -s "话题推荐数据推送报表-"$fileTime $users < $baseDir/dataRep/mail.dat
加附件
echo "file num is 100" | mail -s "topicNumAlarm" -a uid.dat baoquan3@staff.weibo.com
显示表格
formail -I "From: 962543810@qq.com" -I "To:baoquan3@staff.weibo.com" -I "MIME-Version:1.0" -I "Content-type:text/html;charset=zh_CN.utf-8" -I "Subject:邮件标题" < out.dat | /usr/sbin/sendmail -t "baoquan3@staff.weibo.com"
formail -I "From: search@10.73.12.132" -I "To:$users" -I "MIME-Version:1.0" -I "Content-type:text/html;charset=zh_CN.utf-8" -I "Subject:话题推荐数据推送报表-"$fileTime < $baseDir/dataRep/mail.dat | /usr/sbin/sendmail -t "$users"
mutt -s "media" -e 'set content_type="text/html set charset="utf-8"' -c $users -a $outFile < $tableFile
58 多行注释:
进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来
按大写字母I,再插入注释符,例如//
按esc键就会全部注释了
59 取消多行注释:
进入命令行模式,按ctrl + v进入 visual block模式,按字母l横向选中列的个数,例如 // 需要选中2列
按字母j,或者k选中注释符号
按d键就可全部取消注释
60 split
-C: 文件大小 ; -l : 行数; -a :指定后缀长度 -d : 后缀以数字形式
61 ln 链接命令
ln -s /data1/minisearch/hadoop-baoquan3/test/exportDate.dat tmp.dat
它表示 : 软链接文件 tmp.dat 是指向 /data1/minisearch/hadoop-baoquan3/test/exportDate.dat
ln -s 【源文件】【目标文件】
-s 创建软链接
不加 -s 创建硬链接
62 for 循还
# 按数字循环
for i in {0..99}
按固定列宽
for i in $(seq -f "%02g" 0 24)
数组
selectIndex=("754" "730" "766" "758" "744" "797" "735" "719")
for i in ${selectIndex[@]};
-----------------------
len=${#INDEX[@]}
for((i=0;i<len;++i))
do
echo ${INDEX[$i]}","${PERCENT[$i]}
63 求每个月天数
cal 7 2003 | sed '/^$/d' | awk '{print $NF}' | tail -1
64 脚本互斥锁
flock -xn ./lock.gene1 -c "geneConf.sh aa bb"
65 输出小数
awk '{ if($1 == 0){print $2/1}else{printf "%.6f",$2/$1} }'
lineNum=`cat $baseDir/dataRep/tmp.dat | awk '{a+=$3;b+=$4;c+=$5;d+=$6}END{e=c/a;f=0;if(c!=0){f=d/c};printf "%d\t%d\t%d\t%d\t%.4f\t%.4f",a,b,c,d,e,f}'`
lineNum=`cat $inFile | awk '{a+=$3;b+=$4;c+=$5;d+=$6}END{e=c/a;f=0;if(c!=0){f=d/c};printf "'$lineDate'\t'$lineType'\t%d\t%d\t%d\t%d\t%.4f\t%.4f",a,b,c,d,e,f}'`
66 wait 命令
wait命令可以使当前shell进程挂起,等待所指定的由当前shell产生的子进程退出后,wait命令才返回。wait命令的参数可以是进程ID或是job specification,如
sleep 3 &
[3] 869
wait 869
wait命令一个很重要用途就是在Bash shell的并行编程中,可以在Bash shell脚本中启动多个后台进程(使用&),然后调用wait命令,等待所有后台进程都运行完毕,再继续向下执行。如
command1 &
command2 &
wait
wait $! #$!表示上个子进程的进程号,wait等待上一个子进程退出
67 惊叹号
!!代表了上一条执行的命令。可以看到,当输入两个感叹号时,它显示上条命令的同时会执行上一条命令。