目录
1 打包解压命令
1.1 打包命令
1.2 解压命令
1.3 打包解压命令总结
2 权限设置
3 指定用户执行命令
4 将用户添加到用户组
5 查看磁盘空间大小及使用情况
6 统计文件大小
6.1 统计当前目录下各个子文件的大小及总大小
6.2 统计文件总大小
7 查找某个文件在哪个位置
8 查看系统运行的XXX项目的进程号(PID)
9 根据进程查端口
10 根据端口查进程id
11 实时监控某文件内容
12 查看用户是否存在
13 将dos格式转换成unix格式
14 查看文件的行数
15 查看系统命令在哪个位置
16 干掉某项目(某类)进程
17 VIM编辑器中常用命令
18 分屏显示文件内容
19 查看系统内存使用情况
20 查看系统健康状况
21 将某文件放到某N级目录下 (且排除某些目录不copy)
22 同时对多台服务器操作的命令xcall.sh
23 集群拷贝(同步)文件命令 xsync.sh
24 读取配置文件中内容
25 创建软连接
26 批量修改某配置文件
27 设置系统时间
28 &和nohup
29 软件安装命令【RPM包】
30 shell读取配置文件souce方法
31 shell根据关键字获取文件某一行的行号
32 获取文件路径
33 获取root用户权限
34 查看文本行号
35 AWK IF条件判断
35 过滤查找
36 显示主机IP、别名及名字
37 locate命令【快速查找】
38 配置免密登录脚本
39 改变文件或目录所属的属主及属组
40 清空文件内容
41 获取每一个位置参数进行遍历
42 按字符分割后某列值进行排序
sort
43 shell 变量初始化赋默认值
44 shell中的多线程(并行处理实现)
45 shell中大写小转换
46添加root用户具备HDFS文件系统访问权限
1 打包解压命令
1.1 打包命令
(1)打包成.tar.gz格式
tar [选项] 压缩包名 源文件或目录
选项:
-z:压缩和解压缩 ".tar.gz"格式-j:压缩和街压缩 ".tar.bz2"格式
打包到当前路径下,源文件位置在/home/centos/phm/pro/下, 案例如下:
tar -czvf 包名 源文件/源文件目录
[root@bigdata-1 phm]# tar -zcvf tmp.tar.gz /home/centos/phm/pro/tar: 从成员名中删除开头的“/”/home/centos/phm/pro//home/centos/phm/pro/inspect.drl/home/centos/phm/pro/relay.drl/home/centos/phm/pro/signal.drl/home/centos/phm/pro/trackcircuit.drl/home/centos/phm/pro/stream-processor.properties/home/centos/phm/pro/stream-processor_bak.properties/home/centos/phm/pro/ups-.drl/home/centos/phm/pro/ups.drl
(2) 打包成zip格式
压缩文件:zip 压缩文件名 源文件压缩目录: zip -r 压缩文件名 源目录
例如:将当前路径下pro文件夹打包成pro.zip文件
[root@bigdata-1 phm]# zip -r pro.zip proadding: pro/ (stored 0%)adding: pro/inspect.drl (deflated 94%)adding: pro/relay.drl (deflated 95%)adding: pro/signal.drl (deflated 92%)adding: pro/trackcircuit.drl (deflated 94%)adding: pro/stream-processor.properties (deflated 75%)adding: pro/stream-processor_bak.properties (deflated 76%)adding: pro/ups-.drl (deflated 95%)adding: pro/ups.drl (deflated 96%)
1.2 解压命令
tar -xzvf 包名【-C <指定解打包后的位置>】unzip 压缩文件名 【-d <文件解压缩后所要存储的目录>】1.3 打包解压命令总结
tar 命令
1)基本语法
tar [选项] XXX.tar.gz 将要打包进去的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
2)选项说明
表1-31
案例实操(1)压缩多个文件[root@hadoop101 opt]# tar -zcvf houma.tar.gz houge.txt bailongma.txt houge.txtbailongma.txt[root@hadoop101 opt]# lshouma.tar.gz houge.txt bailongma.txt (2)压缩目录[root@hadoop101 ~]# tar -zcvf xiyou.tar.gz xiyou/xiyou/xiyou/mingjie/xiyou/dssz/xiyou/dssz/houge.txt(3)解压到当前目录[root@hadoop101 ~]# tar -zxvf houma.tar.gz(4)解压到指定目录[root@hadoop101 ~]# tar -zxvf xiyou.tar.gz -C /opt[root@hadoop101 ~]# ll /opt/
zip命令
1)基本语法
zip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip (功能描述:解压缩文件)
2)选项说明3)经验技巧
zip 压缩命令在window/linux都通用,可以压缩目录且保留源文件。
4)案例实操
(1)压缩 1.txt 和2.txt,压缩后的名称为mypackage.zip [root@hadoop101 opt]# touch bailongma.txt[root@hadoop101 ~]# zip houma.zip houge.txt bailongma.txt adding: houge.txt (stored 0%)adding: bailongma.txt (stored 0%)[root@hadoop101 opt]# lshouge.txtbailongma.txthouma.zip (2)解压 mypackage.zip[root@hadoop101 ~]# unzip houma.zip Archive: houma.zipextracting: houge.txtextracting: bailongma.txt [root@hadoop101 ~]# lshouge.txtbailongma.txthouma.zip (3)解压mypackage.zip到指定目录-d[root@hadoop101 ~]# unzip houma.zip -d /opt[root@hadoop101 ~]# ls /opt/
2 权限设置
chmod -R 777 文件夹名 。给与指定文件夹读写执行权限r => 4 w => 2 x => 13 指定用户执行命令
sudo -u 用户名 操作命令
4 将用户添加到用户组
usermod -a -G 用户组 用户名usermod -a -G hdfs hive :将hive用户添加到hdfs用户组中5 查看磁盘空间大小及使用情况
[root@bigdata-1 phm]# df -h文件系统 容量 已用 可用 已用% 挂载点/dev/vda1 160G 50G 111G 32% /devtmpfs 7.8G0 7.8G 0% /devtmpfs 7.8G 12K 7.8G 1% /dev/shmtmpfs 7.8G 779M 7.0G 10% /runtmpfs 7.8G0 7.8G 0% /sys/fs/cgroup/dev/vdb1 500G 159M 500G 1% /data01tmpfs 1.6G0 1.6G 0% /run/user/1005tmpfs 1.6G0 1.6G 0% /run/user/1004tmpfs 1.6G0 1.6G 0% /run/user/1013tmpfs 1.6G0 1.6G 0% /run/user/1020tmpfs 1.6G0 1.6G 0% /run/user/1008tmpfs 1.6G0 1.6G 0% /run/user/1003tmpfs 1.6G0 1.6G 0% /run/user/1015tmpfs 1.6G0 1.6G 0% /run/user/1019tmpfs 1.6G0 1.6G 0% /run/user/1006tmpfs 1.6G0 1.6G 0% /run/user/1010tmpfs 1.6G0 1.6G 0% /run/user/0tmpfs 1.6G0 1.6G 0% /run/user/997
6 统计文件大小
6.1 统计当前目录下各个子文件的大小及总大小
du -h
[root@bigdata-1 phm]# du -h268K./JINI_GLOBAL_CREATETABLE1.3M./JSUM_DWA_SWITCH/CONRESIS1.3M./JSUM_DWA_SWITCH/DCSWITCHMACH1.3M./JSUM_DWA_SWITCH/ENV1.4M./JSUM_DWA_SWITCH/MASTER1.3M./JSUM_DWA_SWITCH/SHOCK1.3M./JSUM_DWA_SWITCH/TRANSTIME7.8M./JSUM_DWA_SWITCH4.0K./test1.3M./JSUM_DWA_POWER_SUPPLY/25HZPOWER1.3M./JSUM_DWA_POWER_SUPPLY/ACCONTACT1.3M./JSUM_DWA_POWER_SUPPLY/ANTLIGHTNINGSW1.3M./JSUM_DWA_POWER_SUPPLY/BLOCK1.3M./JSUM_DWA_POWER_SUPPLY/CIRCUITBREAK1.3M./JSUM_DWA_POWER_SUPPLY/INPUT1.3M./JSUM_DWA_POWER_SUPPLY/INTERLOCK1.4M./JSUM_DWA_POWER_SUPPLY/LINETRANSF1.3M./JSUM_DWA_POWER_SUPPLY/MICROMONIT1.3M./JSUM_DWA_POWER_SUPPLY/RELAY1.3M./JSUM_DWA_POWER_SUPPLY/SIGNAL1.3M./JSUM_DWA_POWER_SUPPLY/STABVOL1.3M./JSUM_DWA_POWER_SUPPLY/STATIONJOIN1.3M./JSUM_DWA_POWER_SUPPLY/TDCS1.3M./JSUM_DWA_POWER_SUPPLY/TURNREPRES1.3M./JSUM_DWA_POWER_SUPPLY/ZPWRAIL21M./JSUM_DWA_POWER_SUPPLY1.3M./JTTL_ETL_COMMON36K./PREPARE12K./SUB_MAIN_WF/SUB_RELAY_MAIN_WF16K./SUB_MAIN_WF/SUB_POWER_SUPPLY_MAIN_WF12K./SUB_MAIN_WF/SUB_SIGMACH_MAIN_WF4.0K./SUB_MAIN_WF/SUB_SWITCH_MAIN_WF/fork16K./SUB_MAIN_WF/SUB_SWITCH_MAIN_WF12K./SUB_MAIN_WF/SUB_TRACKCIR_MAIN_WF68K./SUB_MAIN_WF36K./TOOLS1.3M./JSUM_DWA_ALARM/ALARM1.3M./JSUM_DWA_ALARM1.3M./JSUM_DWA_RELAY/2Y2WRELAY1.3M./JSUM_DWA_RELAY/SIGCTLCIR1.4M./JSUM_DWA_RELAY/SWTCTLCIR4.0M./JSUM_DWA_RELAY1.3M./JSUM_DWA_SIGMACH/CMLIGHTUNIT1.3M./JSUM_DWA_SIGMACH/ENV1.3M./JSUM_DWA_SIGMACH/LIGHTUNIT1.3M./JSUM_DWA_SIGMACH/SHOCK1.3M./JSUM_DWA_SIGMACH/XBBOX6.4M./JSUM_DWA_SIGMACH1.3M./JSUM_DWA_TRACKCIR/ENV1.4M./JSUM_DWA_TRACKCIR/INDOOR1.4M./JSUM_DWA_TRACKCIR/OUTDOOR1.3M./JSUM_DWA_TRACKCIR/SHOCK5.2M./JSUM_DWA_TRACKCIR1.3M./MAIN_WF/fork1.3M./MAIN_WF1.3M./MYSQL/appv_alarm1.5M./MYSQL/appv_power1.4M./MYSQL/appv_relay1.3M./MYSQL/appv_sigmach1.4M./MYSQL/appv_switch1.4M./MYSQL/appv_trackcir7.9M./MYSQL436K./pro183M.
6.2 统计文件总大小
du -sh[root@bigdata-1 phm]# du -sh183M.
7 查找某个文件在哪个位置
find 路径 -name xxx[root@bigdata-1 phm]# find . -name input.sh./JSUM_DWA_SWITCH/CONRESIS/input.sh./JSUM_DWA_SWITCH/DCSWITCHMACH/input.sh./JSUM_DWA_SWITCH/ENV/input.sh./JSUM_DWA_SWITCH/MASTER/input.sh./JSUM_DWA_SWITCH/SHOCK/input.sh./JSUM_DWA_SWITCH/TRANSTIME/input.sh./JSUM_DWA_POWER_SUPPLY/25HZPOWER/input.sh./JSUM_DWA_POWER_SUPPLY/ACCONTACT/input.sh./JSUM_DWA_POWER_SUPPLY/ANTLIGHTNINGSW/input.sh./JSUM_DWA_POWER_SUPPLY/BLOCK/input.sh./JSUM_DWA_POWER_SUPPLY/CIRCUITBREAK/input.sh./JSUM_DWA_POWER_SUPPLY/INPUT/input.sh
8 查看系统运行的XXX项目的进程号(PID)
ps -ef | grep XXXps -aux| grep XXXps -aux | grep XXX | grep -v grep | awk '{print $2}'[root@bigdata-1 ~]# ps -aux | grep spark | grep -v grep | awk '{print $2}'1297817073
ps:process status 进程状态
1)基本语法
ps -aux| grep xxx (功能描述:查看系统中所有进程)
ps -ef| grep xxx(功能描述:可以查看子父进程之间的关系)
2)选项说明3)功能说明
(1)ps -aux显示信息说明
USER:该进程是由哪个用户产生的
PID:进程的ID号
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ:该进程占用虚拟内存的大小,单位KB;
RSS:该进程占用实际物理内存的大小,单位KB;
TTY:该进程是在哪个终端中运行的。其中tty1-tty7代表本地控制台终端,tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端。
STAT:进程状态。常见的状态有:R:运行、S:睡眠、T:停止状态、s:包含子进程、+:位于后台
START:该进程的启动时间
TIME:该进程占用CPU的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名
(2)ps -ef显示信息说明
UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完整的终端名称
TIME:CPU时间
CMD:启动进程所用的命令和参数
如下:
4)经验技巧
如果想查看进程的CPU占用率和内存占用率,可以使用aux;
如果想查看进程的父进程ID可以使用ef;
9 根据进程查端口
netstat -anp | grep pid[root@bigdata-1 ~]# netstat -nap | grep 12978tcp6 00 :::18081:::*LISTEN12978/javatcp6 00 10.1.3.11:55208 10.1.3.12:8020ESTABLISHED 12978/javaunix 2[ ] STREAMCONNECTED614269 12978/java unix 2[ ] STREAMCONNECTED60 12978/java
常用:
lsof -i | grep pid
[root@bigdata-1 ~]# lsof -i | grep 21628java21628 hbase 497u IPv66718480t0 TCP bigdata-:fmsas (LISTEN)java21628 hbase 535u IPv6 10923619120t0 TCP bigdata-:42952->bigdata-:intu-ec-svcdisc (ESTABLISHED)java21628 hbase 544u IPv6 10692309000t0 TCP bigdata-:34786->bigdata-:eforward (ESTABLISHED)java21628 hbase 546u IPv66671840t0 TCP *:16010 (LISTEN)java21628 hbase 553u IPv6 10692266610t0 TCP bigdata-:41530->bigdata-:eforward (ESTABLISHED)java21628 hbase 554u IPv6 10692321690t0 TCP bigdata-:41556->bigdata-:eforward (ESTABLISHED)java21628 hbase 558u IPv66632990t0 TCP bigdata-:fmsas->bigdata-:59645 (ESTABLISHED)java21628 hbase 559u IPv66633000t0 TCP bigdata-:fmsas->bigdata-:52580 (ESTABLISHED)java21628 hbase 560u IPv66715100t0 TCP bigdata-:fmsas->bigdata-:60826 (ESTABLISHED)java21628 hbase 561u IPv66715110t0 TCP bigdata-:fmsas->bigdata-:59801 (ESTABLISHED)java21628 hbase 562u IPv6 10692267930t0 TCP bigdata-:34860->bigdata-:eforward (ESTABLISHED)java21628 hbase 563u IPv6 10923646950t0 TCP bigdata-:37772->bigdata-:6188 (ESTABLISHED)
10 根据端口查进程id
netstat -nap | grep port[root@bigdata-1 ~]# netstat -nap | grep 8020tcp 00 10.1.3.11:80200.0.0.0:*LISTEN7307/java tcp 00 10.1.3.11:54260 10.1.3.11:8020TIME_WAIT - tcp 00 10.1.3.11:53796 10.1.3.11:8020TIME_WAIT - tcp 00 10.1.3.11:38356 10.1.3.12:8020TIME_WAIT - tcp 00 10.1.3.11:80.1.3.13:58220 ESTABLISHED 7307/java tcp 00 10.1.3.11:37646 10.1.3.12:8020TIME_WAIT - tcp 00 10.1.3.11:80.1.3.13:58416 ESTABLISHED 7307/java tcp 00 10.1.3.11:38016 10.1.3.12:8020TIME_WAIT - tcp 00 10.1.3.11:53732 10.1.3.11:8020TIME_WAIT - tcp 00 10.1.3.11:38318 10.1.3.12:8020ESTABLISHED 7307/java tcp 00 10.1.3.11:48020 10.1.3.11:6379TIME_WAIT - tcp 00 10.1.3.11:37892 10.1.3.12:8020TIME_WAIT - tcp 00 10.1.3.11:42812 10.1.3.11:8020ESTABLISHED 27950/javatcp 00 10.1.3.11:53750 10.1.3.11:8020TIME_WAIT - tcp 00 10.1.3.11:80.1.3.16:42470 ESTABLISHED 7307/java tcp 00 10.1.3.11:53744 10.1.3.11:8020TIME_WAIT - tcp 00 10.1.3.11:80.1.3.11:42812 ESTABLISHED 7307/java tcp 00 10.1.3.11:37840 10.1.3.12:8020TIME_WAIT -
比较常用的:
lsof -i:port
[root@bigdata-1 ~]# lsof -i:8020COMMAND PID USER FD TYPEDEVICE SIZE/OFF NODE NAMEjava7307 hdfs 368u IPv4 10923321540t0 TCP bigdata-:40672->bigdata-:intu-ec-svcdisc (ESTABLISHED)java7307 hdfs 373u IPv45748450t0 TCP bigdata-:intu-ec-svcdisc (LISTEN)java7307 hdfs 406u IPv4 10923322640t0 TCP bigdata-:intu-ec-svcdisc->bigdata-:59754 (ESTABLISHED)java7307 hdfs 407u IPv4 10923321160t0 TCP bigdata-:intu-ec-svcdisc->bigdata-:59600 (ESTABLISHED)java7307 hdfs 417u IPv4 10692310230t0 TCP bigdata-:intu-ec-svcdisc->bigdata-:51882 (ESTABLISHED)java7307 hdfs 429u IPv4 10694215170t0 TCP bigdata-:intu-ec-svcdisc->bigdata-:42812 (ESTABLISHED)java7307 hdfs 430u IPv4 10692310130t0 TCP bigdata-:intu-ec-svcdisc->bigdata-:42956 (ESTABLISHED)java7307 hdfs 458u IPv4 10692310110t0 TCP bigdata-:intu-ec-svcdisc->bigdata-:42470 (ESTABLISHED)java 12978 spark 257u IPv6 10694179930t0 TCP bigdata-:55208->bigdata-:intu-ec-svcdisc (ESTABLISHED)java 17073 hive 308u IPv6 10923262730t0 TCP bigdata-:40322->bigdata-:intu-ec-svcdisc (ESTABLISHED)java 21628 hbase 535u IPv6 10923328990t0 TCP bigdata-:40280->bigdata-:intu-ec-svcdisc (ESTABLISHED)java 27950 hdfs 390u IPv4 10694247180t0 TCP bigdata-:42812->bigdata-:intu-ec-svcdisc (ESTABLISHED)
(1)根据进程pid查端口: lsof -i | grep pid(2)根据端口port查进程: lsof -i:port(3)根据进程pid查端口: netstat -nap | grep pid(4)根据端口port查进程 netstat -nap | grep port区别:stat无权限控制,lsof有权限控制,只能看到本用户2.losf能看到pid和用户,可以找到哪个进程占用了这个端口,显示的信息更全面(推荐使用)
11 实时监控某文件内容
tail -f 文件名12 查看用户是否存在
id 用户[root@bigdata-1 ~]# id hiveuid=1006(hive) gid=1001(hadoop) 组=1001(hadoop),1002(hdfs)
13 将dos格式转换成unix格式
dos2unix 文件名 可以将该文件转换为unxi格式批量将当前文件夹下所有文件类型格式转换成unix格式。有以下两种写法find . -type f -exec dos2unix {} \
find . -type f | xargs -i dos2unix {}
注意:dos2unix不是系统自带的命令需要安装,yum install -y dos2unix 就可以安装
另外也可以将上述批量转换成unix命令封装成系统命令使用,具体如下:
cd /usr/bin
vim dos2unix.sh
#!/bin/bash
find . -type f -exec dos2unix {} \
保存后给予执行权限便可使用。
下次使用时候直接使用dos2unxi.sh在当前目录下便可批量将dos格式转换成unix格式
14 查看文件的行数
wc -l 文件名[root@bigdata-1 phm]# wc -l sparkstream-run-test3.sh14 sparkstream-run-test3.sh
查看某文件某单词出现的次数
[root@bigdata-1 phm]# cat sparkstream-run-test3.sh | grep spark | wc -l3
15 查看系统命令在哪个位置
which 系统命令[root@bigdata-1 phm]# which dos2unix.sh/usr/bin/dos2unix.sh
16 干掉某项目(某类)进程
ps -ef | grep XXX | grep -v grep|cut -c 9-15 | xargs kill -9ps -aux | grep XXX | grep -v grep |awk '{print $2}' | xargs kill
17 VIM编辑器中常用命令
一般模式下:
dd 删除一行G:行定位符。G:移动到页尾。1G移动到行首。数字+G移动到目标行。u:撤销上一步操纵。
编辑模式下:
i:当前光标前o:当前光标的下一行
底行模式:
:切换底行模式:!wq 强制保存并退出:q 退出:set nu 显示行号:set ff 显示格式:set ff=unix 将格式修改为unix格式:/ 搜索要查找的词:%s/old字符/new字符 批量替换
技巧:快速退出VIM的方法
shift + zz(按2下zz):直接保存并退出shfit +zq:shift键加上z
和q
键,不保存直接退出,和指令:q!
效果一样。
18 分屏显示文件内容
less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
1)基本语法
less 要查看的文件
2)操作说明
19 查看系统内存使用情况
free -m20 查看系统健康状况
top 所有信息uptime :查看系统平均负载情况21 将某文件放到某N级目录下 (且排除某些目录不copy)
批量拷贝文件到某二级目录下#将input.sh脚本放到二级文件夹下且忽略/home/centos/phm/SUB_MAIN_WF/*下的所有子目录,先删,后复制find /home/centos/phm/ -path /home/centos/phm/JTTL_ETL_COMMON -prune -o -name "input.sh" -print | xargs rm -rffind /home/centos/phm/ -maxdepth 2 -mindepth 2 -type d | xargs -i find {} -path "/home/centos/phm/SUB_MAIN_WF/*" -prune -o -type d -print | xargs -i cp -r /home/centos/phm/JTTL_ETL_COMMON/"input.sh" {}
这里采用find 的prune参数
-prune用法很严格,若要忽略某个目录一般采用如下固定模式:
find 查找文件的目录 -path 需要排除的目录 -prune -o -name 需要查询的内容
注意事项:理解为固定用法就可以了(-path->-prune->-o>-print)忽略四部曲
1)-prune 必须和 -path, -o 一起使用2)-prune -o 的顺序不 能调换3)-name等必须放在-prune -o后面才能使用4)如果后面有管道符号前面需要加-print参数
例如:
find /home/centos/phm/ -path /home/centos/phm/JTTL_ETL_COMMON -prune -o -name "input.sh" -print | xargs rm -rf
伪代码解释:if -path "/home/centos/phm/JTTL_ETL_COMMON" then-prune(忽略该目录)else-print(打印满足条件后找到的内容)。
当然上述find cp命令我们也可以用find exec参数来实现如下命令所示:
find /home/centos/phm/ -maxdepth 2 -mindepth 2 -type d -exec cp -r /home/centos/phm/JTTL_ETL_COMMON/"input.sh" {} \;
但上述命令存在的隐患是参数过多会有溢出的危险,因而我们还是选用下面一种比较安全
find /home/centos/phm/ -maxdepth 2 -mindepth 2 -type d |xargs -i cp -r /home/centos/phm/JTTL_ETL_COMMON/"input.sh" {}
对于find -exec参数中{}命令和xargs -i命令中{}理解是一致的,对于该参数的使用需要注意一点结尾是\结尾且与前面有个空格,空格特别要注意被忽略,否则命令会出错,一般不建议使用-exec参数,另外需要注意{}的灵活运用,下面例子说明这一点
find /home/centos/phm/ -maxdepth 2 -mindepth 2 -type d -exec rm -rf {}/input.sh \;
表示删除找到二级目录下的input.sh文件,等价于下面这条命令
find /home/centos/phm/ -name "input.sh" -exec rm -rf {} \;
22 同时对多台服务器操作的命令xcall.sh
#!/bin/bash##xcall.sh 编写为了为了同时对多台服务器进行操作,编写完成之后,将其放到 /usr/local/bin 下,给予执行权限# for循环for((i=1 ; i<=6; i++)) ; do# 更改文本颜色tput setaf 2# 输出以下文本echo ==================== bigdata-${i} $@ ===================# 更改文本颜色tput setaf 9# ssh 远程登陆主机 s$i ,执行输入的参数的命令ssh bigdata-${i} $@done
23 集群拷贝(同步)文件命令 xsync.sh
先安装rsync,该命令是一个远程数据同步工具需要以 root 用户身份执行 xcall.sh yum install -y rsync 进行安装xsync.sh 编写是为了同步配置文件,编写完成之后,将其放到/usr/local/bin下#!/bin/bash# 指出当前用户名name=`whoami`# 指定文件所在文件夹名称dir=`dirname $1`# 指定文件的文件名filename=`basename $1`# 进入到dir中cd $dir# 得到当前目录的绝对路径fullpath=`pwd`for((i=1 ; i<=6; i++)) ; dotput setaf 2echo ==================== bigdata-${i} $@ ===================tput setaf 9# 远程同步命令 l 保留软连接 r 递归文件夹rsync -lr $filename "$name"@bigdata-"$i":$fullpathdone
24 读取配置文件中内容
例如:
cat /home/centos/phm/JTTL_ETL_COMMON/oozieurl.txt | grep oozie_url | awk -F'=' '{ print $2 }' | sed s/[[:space:]]//g
读取/home/centos/phm/JTTL_ETL_COMMON/oozieurl.txt文件并过滤出oozie_url行,取以"="分割的第二列。
注意:此处必须使用sed s/[[:space:]]//g 去除 多余的空格符,防止格式带来的错误。
25 创建软连接
ln -s 源文件 目标文件
例如:
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
linux下的软链接类似于windows下的快捷方式
-s 是 symbolic的意思
删除软链接:rm –rf 软链接名称
rm -rf b(请注意不要在后面加”/”,rm -rf 后面加“/”的话,会进行递归删除,非常危险!)
示例:
rm -rf /usr/bin/ngnix
26 批量修改某配置文件
#批量替换 oozie的job.properties配置文件中内容。#需要修改的参数放在某文件下,每次修改该文件即可,然后再批量替换#主要使用find 和 sedc处理nameNode=`cat /home/centos/phm/JTTL_ETL_COMMON/oozie.properties | grep nameNode | awk -F'=' '{ print $2 }' | sed s/[[:space:]]//g`jobTracker=`cat /home/centos/phm/JTTL_ETL_COMMON/oozie.properties | grep jobTracker | awk -F'=' '{ print $2 }' | sed s/[[:space:]]//g`find /home/centos/phm -name job.properties | xargs -i sed -i "s#^nameNode=.*#nameNode=${nameNode}#g" {}find /home/centos/phm -name job.properties | xargs -i sed -i "s#^jobTracker=.*#jobTracker=${jobTracker}#g" {}
27 设置系统时间
场景:当发现某台虚拟机时间跑慢了,有时需要将时间调整到当前准确的时间则需要重新设置系统时间。
基本语法
date -s 字符串时间
案例实操
设置系统当前时间
[root@hadoop101 ~]# date -s "-12-19 20:52:18"
28 &和nohup
&和nohup区别:
&的意思是在后台运行。意思是说, 当你在执行 ./start_upload.sh & 的时候, 即使你用Ctrl + C, 那么XXX.sh照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉Shell后, 那么, XXX.sh进程同样消失。 因为对SIGHUP信号不免疫。
nohup的意思是忽略SIGHUP信号, 所以当运行nohup ./XXX.sh的时候, 关闭Shell,XXX.sh进程还是存在的(对SIGHUP信号免疫)。 但是如果你直接在Shell中用Ctrl + C, 那么,XXX.sh进程也是会消失的(因为对SIGINT信号不免疫)
所以,要让进程真正不受Shell中Ctrl + C和Shell关闭的影响, 就用nohup和&同时用。
nohup hive -e "$sql" >>/tmp/$log_dir.log 2>&1 ;
总结:
&:对Ctrl + C免疫nohup:对关闭shell免疫
29 软件安装命令【RPM包】
(1)查询某个软件是否安装
rpm -qa | grep mysql
(2) 删除软件
rpm -e 包名
卸载MYSQL
rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
(3)安装软件
rpm -ivh
rpm -ivh cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm
(4)RPM命令的--nodeps 和--force参数解释
--nodeps就是安装时不检查依赖关系,比如你这个rpm需要A,但是你没装A,这样你的包就装不上,用了--nodeps你就能装上了。--force就是强制安装,比如你装过这个rpm的版本1,如果你想装这个rpm的版本2,就需要用--force强制安装。
比如安装CDH agent的时候报错
依赖检测失败:libcrypto.so.10()(64bit) 被 cloudera-manager-agent-6.3.1-1466458.el7.x86_64 需要libcrypto.so.10(libcrypto.so.10)(64bit) 被 cloudera-manager-agent-6.3.1-1466458.el7.x86_64 需要libssl.so.10()(64bit) 被 cloudera-manager-agent-6.3.1-1466458.el7.x86_64 需要libssl.so.10(libssl.so.10)(64bit) 被 cloudera-manager-agent-6.3.1-1466458.el7.x86_64需要
此时就需要加--nodeps 和--force参数来解决,命令如下:
rpm -ivh cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm --nodeps --force
30 shell读取配置文件souce方法
配置文件config.properties#以下是配置文件内容,配置文件文件名为config.propertiesusername=jackpassword=33281shell脚本(脚本名为 readConfig.sh)#!/bin/bashsource ./config.propertiesecho ${username}注意:我这里把config.properties和readConfig.sh放置在同一文件夹下。
31 shell根据关键字获取文件某一行的行号
cat -n 文件名|grep '关键字'|awk '{print $1}'
32 获取文件路径
filePath=$(dirname $(readlink -f "$0"))"/table.config"
[root@event]# basename config.properties //获取文件名config.properties[root@event]# readlink -f config.properties //获取文件的绝对路径/home/centos/event/config.properties[root@event]# dirname $(readlink -f "config.properties") //获取文件的父目录/home/centos/event
其他:
获取当前执行脚本路径
filepath=$(cd "$(dirname "$0")"; pwd)
$0: 获取当前脚本的名称$#: 传递给脚本的参数个数$$: shell脚本的进程号
33 获取root用户权限
sudo -i 切到root用户的家目录sudo -s 切到root,但是当前路径仍保持切换前所在的路径sudo su - 目前发现和sudo -i差不多【#】代表 root权限,超级用户
【$】代表普通用户
34 查看文本行号
[root@centos ~]# cat -n anaconda-ks.cfg1 #version=DEVEL2 # System authorization information3 auth --enableshadow --passalgo=sha5124 # Use CDROM installation media5 cdrom6 # Use graphical install7 graphical8 # Run the Setup Agent on first boot9 firstboot --enable10 ignoredisk --only-use=sda11 # Keyboard layouts12 keyboard --vckeymap=us --xlayouts='us'13 # System language14 lang en_US.UTF-8 --addsupport=zh_CN.UTF-8
35 AWK IF条件判断
判断 boot 分区可用容量小于 20MB 时报警,否则显示 OK
[root@test ~]# df | grep "boot" | awk ' {if ($4<20000) print "Alart" ; else print "OK"}'OK[root@test ~]#
根据输入参数判断输出相应文件内容
start,end为输入位置参数。$1为文件行号,$2为文件内容
cat $filePath | sort | cat -n | awk '{ if($1 >='"${start}"' && $1 <= '"${end}"') print $2
35 过滤查找
grep:一般和管道符连用
grep -i :忽略大小写进行查找
查找linux中关于mysq操作的命令
history | grep -i mysql
查看MYSQL是否安装
rpm -qa|grep -i mysql
grep -v:反向查找,不包含XXX
36 显示主机IP、别名及名字
hostname:显示主机名字hostname -a:显示主机别名hostname -i:显示主机IP(内网IP)37 locate命令【快速查找】
locate(locate) 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。整个locate工作其实是由四部分组成的:
/usr/bin/updatedb 主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate 查询文件位置
/etc/updatedb.conf updatedb的配置文件
/var/lib/mlocate/mlocate.db 存放文件信息的文件
安装:
yum install mlocate -yupdatedb
示例1: 搜索etc目录下所有以my开头的文件
[root@cent6 lib]# locate /etc/my/etc/f
示例2:新增的文件无法locate,使用updatedb
[root@cent6 ~]# touch new.txt[root@cent6 ~]# locate new.txt[root@cent6 ~]# updatedb[root@cent6 ~]# locate new.txt/root/new.txt
示例3:updatedb的配置文件/etc/updatedb.conf
[root@cent6 ~]# cat /etc/updatedb.conf PRUNE_BIND_MOUNTS = "yes"PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"PRUNENAMES = ".git .hg .svn"PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否进行限制搜索。
第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。
第二行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索。不同后缀之间用空格隔开。
第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索。updatedb之后使用locate仍然找不到想要文件
可以检查挂载的目录是否被忽略了
38 配置免密登录脚本
免密码登录
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ""#同步密钥for((host=1;host<=4;host++))doecho "---> ssh-copy-id $host"ssh-copy-id $hostdone
39 改变文件或目录所属的属主及属组
属主:所属的用户,文档所有者,这是一个账户,这是一个人
属组:所属的用户组,这是一个组
查看属主和属组:ll
[root@bigdata2 data]# lltotal 0drwxrwxrwx 3 root root 16 Jan 21 17:20 dfsdrwxrwxrwx 4 root root 38 Jan 12 22:28 yarn
修改:chown
例如将上述所有文件及文件夹下修改成yarn用户及hadoop用户组
在该目录下执行如下命令:-R表示递归,*表示所有
chown yarn.hadoop -R *
chown同时修改属主与属组(一般记住这个就可以)
问题:如何通过一个命令实现既可以更改所属的用户,也可以修改所属的
用户组呢?
答:使用 chown 命令
基本语法: 语法:# chown [-R] username:groupname 文档路径
示例代码:将readme.txt文件的拥有者与所属组都更改为root
#ll readme.txt#chown root:root readme.txt将readme.txt文件的属主和属组同时设置为root#ll readme.txt
特别注意:
一般来说,这个指令(chown)只有是由系统管理者(root)所使用,普通用户没有权限可以改变别人的档案拥有者,也没有权限可以将自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。
40 清空文件内容
> access.log
41 获取每一个位置参数进行遍历
获取位置参数的方法:$*和$@,两个都可以获取位置参数
区别:不加双引号("")两者没区别用法一样,都是将每个参数单独对待。加双引号"$*"和"$@"有区别,"$*"会将所有的位置参数看成一个串,"$@"和不加双引号一样,将每个参数单独对待。因此如果需要将所有的参数看成一个串的话,则采用"$*",如果需要遍历每个位置参数就使用$*和$@。
#下面是example.sh脚本的代码#!/bin/bashfor i in "$*";doecho $idonefor i in "$@";doecho $idone
./example.sh 1 2 3##输出如下所示1 2 3 --将所有参数看成一个串##遍历每个参数123
#下面是example.sh脚本的代码#!/bin/bashs1=$*s2=$@echo $s1echo $s2for i in $s1;doecho $idonefor i in $s2;doecho $idone./example.sh 1 2 3##输出如下所示1 2 31 2 3123123
此种形式两者无区别。
42 按字符分割后某列值进行排序
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
1)基本语法
sort(选项)(参数)
参数:指定待排序的文件列表
2)案例实操
(1)数据准备
[dandan@hadoop102 datas]$ touch sort.sh
[dandan@hadoop102 datas]$ vim sort.sh
bb:40:5.4bd:20:4.2xz:50:2.3cls:10:3.5ss:30:1.6
(2)按照“:”分割后的第三列倒序排序。
[dandan@hadoop102 datas]$sort -t : -nrk 3 sort.sh
bb:40:5.4bd:20:4.2cls:10:3.5xz:50:2.3ss:30:1.6
43 shell 变量初始化赋默认值
${var:-defaultValue}
含义:当var没有定义时,此时使用defaultValue, 而var依然为空,没有改变值,有定义或不为空的时候使用定义的值
案例1:可以对位置参数进行判断,并赋默认值
if [ "$1" != "all" -a -n "$1" ] ;thenmap_num=${2:-1}minimum_allocation=${3:-4096}maximum_allocation=${4:-16384}map_memory=${5:-4096}compress_type=${6:-lzop}fi
案例2:对变量赋初始值
name=${name:-"石榴姐"}
${var:=defaultValue}
含义:当var没有定义时,此时使用defaultValue, 同时var也被赋值为defaultValue。相当于var=${var:-defaultValue}。此时可以拿来直接使用,简化不必要的语句判断,起到简化代码,赋默认值的功能。
比如如下语句
if [ -n "$2" ] ;thendo_date=$2elsedo_date=`date +%Y%m%d`fi
可以直接简化为:
default_date=`date +%Y%m%d`do_date=${2:-$default_date}或${2:=$default_date}拿来直接使用即可
44 shell中的多线程(并行处理实现)
如下:
while( [ "${next_year}" -le "${current_year}" ] )do#echo ${next_year}pyear=${next_year}start_day="${next_year}0101"next_year=$(($next_year+1))end_day="${next_year}0101"sql="SELECT * FROM SAPSRD.KONV WHERE dt >= ${start_day} and dt < ${end_day} AND \$CONDITIONS"{import_data_aaa "$sql" "$pyear"}&donewait
#!/bin/bashstart_time=$(date +%s)for ((i=1;i<=1000;i++))do{sleep 5s /该命令是用来测试的命令,此处为实际执行的命令echo "$i"} &donewait /等待1000个后台任务全都执行完成之后,再继续执行执行脚本end_time=$(date +%s) echo "TIME:$(expr $end_time- $start_time)"
用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行,一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了,循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理.
其中:&号表示把命令放入后台运行
wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令。如果wait后面不带任何的进程号或作业号,那么wait会直至当前shell中进程的所有子进程都执行结束后,才继续执行下一步。
sleep是使系统休眠一定的时间之后再去执行下面的任务。
注意:循环中使用多线程的时候,循环体结束后一定要用wait.因为你的脚本都放在后台了,如果没有wait的话,它们在后台没运行完就退出了,此时主进程先退出了,有wait的话,是等到所有子进程都接受才终止脚本,主进程才会终止。
45 shell中大写小转换
说明
^ 把变量中的第一个字符换成大写^^ 把变量中的所有小写字母,全部替换为大写。, 把变量中的第一个字符换成小写,,把变量中的所有大写字母,全部替换为小写
实例
案例1:
parameter = ab${parameter^}##得到结果Ab${parameter^^} ##得到结果AB
案例2:
parameter = AB${parameter,} ##得到结果aB${parameter,,} ##得到结果ab
46添加root用户具备HDFS文件系统访问权限
当开启hadoop权限认证时候,执行任务会报权限问题
报如下错:
说明root用户不具备HDFS访问权限。
每台hadoop集群节点上执行如下命令
groupadd supergroup --增加supergrouo用户组usermod -a -G supergroup root --将root用户添加到supergroup用户组sudo -u hdfs hdfs dfsadmin -refreshUserToGroupsMappings --更新hdfs的用户到用户组映射文件