目录
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)打包成.tar.gz格式
选项:
打包到当前路径下,源文件位置在 /home/centos/phm/pro/下, 案例如下:
[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格式
例如:将当前路径下pro文件夹打包成pro.zip文件
[root@bigdata-1 phm]# zip -r pro.zip pro
adding: 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%)
tar 命令
tar [选项] XXX.tar.gz 将要打包进去的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
表1-31
选项 |
功能 |
-z |
打包同时压缩 |
-c |
产生.tar打包文件 |
-v |
显示详细信息 |
-f |
指定压缩后的文件名 |
-x |
解包.tar文件 |
案例实操
(1)压缩多个文件
[root@hadoop101 opt]# tar -zcvf houma.tar.gz houge.txt bailongma.txt
houge.txt
bailongma.txt
[root@hadoop101 opt]# ls
houma.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命令
zip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip (功能描述:解压缩文件)
zip选项 |
功能 |
-r |
压缩目录 |
unzip选项 |
功能 |
-d<目录> |
指定解压后文件的存放目录 |
zip 压缩命令在window/linux都通用,可以压缩目录且保留源文件。
(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]# ls
houge.txt bailongma.txt houma.zip
(2)解压 mypackage.zip
[root@hadoop101 ~]# unzip houma.zip
Archive: houma.zip
extracting: houge.txt
extracting: bailongma.txt
[root@hadoop101 ~]# ls
houge.txt bailongma.txt houma.zip
(3)解压mypackage.zip到指定目录-d
[root@hadoop101 ~]# unzip houma.zip -d /opt
[root@hadoop101 ~]# ls /opt/
sudo -u 用户名 操作命令
[root@bigdata-1 phm]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/vda1 160G 50G 111G 32% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 12K 7.8G 1% /dev/shm
tmpfs 7.8G 779M 7.0G 10% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vdb1 500G 159M 500G 1% /data01
tmpfs 1.6G 0 1.6G 0% /run/user/1005
tmpfs 1.6G 0 1.6G 0% /run/user/1004
tmpfs 1.6G 0 1.6G 0% /run/user/1013
tmpfs 1.6G 0 1.6G 0% /run/user/1020
tmpfs 1.6G 0 1.6G 0% /run/user/1008
tmpfs 1.6G 0 1.6G 0% /run/user/1003
tmpfs 1.6G 0 1.6G 0% /run/user/1015
tmpfs 1.6G 0 1.6G 0% /run/user/1019
tmpfs 1.6G 0 1.6G 0% /run/user/1006
tmpfs 1.6G 0 1.6G 0% /run/user/1010
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/997
du -h
[root@bigdata-1 phm]# du -h
268K ./JINI_GLOBAL_CREATETABLE
1.3M ./JSUM_DWA_SWITCH/CONRESIS
1.3M ./JSUM_DWA_SWITCH/DCSWITCHMACH
1.3M ./JSUM_DWA_SWITCH/ENV
1.4M ./JSUM_DWA_SWITCH/MASTER
1.3M ./JSUM_DWA_SWITCH/SHOCK
1.3M ./JSUM_DWA_SWITCH/TRANSTIME
7.8M ./JSUM_DWA_SWITCH
4.0K ./test
1.3M ./JSUM_DWA_POWER_SUPPLY/25HZPOWER
1.3M ./JSUM_DWA_POWER_SUPPLY/ACCONTACT
1.3M ./JSUM_DWA_POWER_SUPPLY/ANTLIGHTNINGSW
1.3M ./JSUM_DWA_POWER_SUPPLY/BLOCK
1.3M ./JSUM_DWA_POWER_SUPPLY/CIRCUITBREAK
1.3M ./JSUM_DWA_POWER_SUPPLY/INPUT
1.3M ./JSUM_DWA_POWER_SUPPLY/INTERLOCK
1.4M ./JSUM_DWA_POWER_SUPPLY/LINETRANSF
1.3M ./JSUM_DWA_POWER_SUPPLY/MICROMONIT
1.3M ./JSUM_DWA_POWER_SUPPLY/RELAY
1.3M ./JSUM_DWA_POWER_SUPPLY/SIGNAL
1.3M ./JSUM_DWA_POWER_SUPPLY/STABVOL
1.3M ./JSUM_DWA_POWER_SUPPLY/STATIONJOIN
1.3M ./JSUM_DWA_POWER_SUPPLY/TDCS
1.3M ./JSUM_DWA_POWER_SUPPLY/TURNREPRES
1.3M ./JSUM_DWA_POWER_SUPPLY/ZPWRAIL
21M ./JSUM_DWA_POWER_SUPPLY
1.3M ./JTTL_ETL_COMMON
36K ./PREPARE
12K ./SUB_MAIN_WF/SUB_RELAY_MAIN_WF
16K ./SUB_MAIN_WF/SUB_POWER_SUPPLY_MAIN_WF
12K ./SUB_MAIN_WF/SUB_SIGMACH_MAIN_WF
4.0K ./SUB_MAIN_WF/SUB_SWITCH_MAIN_WF/fork
16K ./SUB_MAIN_WF/SUB_SWITCH_MAIN_WF
12K ./SUB_MAIN_WF/SUB_TRACKCIR_MAIN_WF
68K ./SUB_MAIN_WF
36K ./TOOLS
1.3M ./JSUM_DWA_ALARM/ALARM
1.3M ./JSUM_DWA_ALARM
1.3M ./JSUM_DWA_RELAY/2Y2WRELAY
1.3M ./JSUM_DWA_RELAY/SIGCTLCIR
1.4M ./JSUM_DWA_RELAY/SWTCTLCIR
4.0M ./JSUM_DWA_RELAY
1.3M ./JSUM_DWA_SIGMACH/CMLIGHTUNIT
1.3M ./JSUM_DWA_SIGMACH/ENV
1.3M ./JSUM_DWA_SIGMACH/LIGHTUNIT
1.3M ./JSUM_DWA_SIGMACH/SHOCK
1.3M ./JSUM_DWA_SIGMACH/XBBOX
6.4M ./JSUM_DWA_SIGMACH
1.3M ./JSUM_DWA_TRACKCIR/ENV
1.4M ./JSUM_DWA_TRACKCIR/INDOOR
1.4M ./JSUM_DWA_TRACKCIR/OUTDOOR
1.3M ./JSUM_DWA_TRACKCIR/SHOCK
5.2M ./JSUM_DWA_TRACKCIR
1.3M ./MAIN_WF/fork
1.3M ./MAIN_WF
1.3M ./MYSQL/appv_alarm
1.5M ./MYSQL/appv_power
1.4M ./MYSQL/appv_relay
1.3M ./MYSQL/appv_sigmach
1.4M ./MYSQL/appv_switch
1.4M ./MYSQL/appv_trackcir
7.9M ./MYSQL
436K ./pro
183M .
[root@bigdata-1 phm]# du -sh
183M .
[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
[root@bigdata-1 ~]# ps -aux | grep spark | grep -v grep | awk '{print $2}'
12978
17073
ps:process status 进程状态
ps -aux | grep xxx (功能描述:查看系统中所有进程)
ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
选项 |
功能 |
-a |
选择所有进程 |
-u |
显示所有用户的所有进程 |
-x |
显示没有终端的进程 |
(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:启动进程所用的命令和参数
如下:
如果想查看进程的CPU占用率和内存占用率,可以使用aux;
如果想查看进程的父进程ID可以使用ef;
[root@bigdata-1 ~]# netstat -nap | grep 12978
tcp6 0 0 :::18081 :::* LISTEN 12978/java
tcp6 0 0 10.1.3.11:55208 10.1.3.12:8020 ESTABLISHED 12978/java
unix 2 [ ] STREAM CONNECTED 614269 12978/java
unix 2 [ ] STREAM CONNECTED 620070 12978/java
常用:
[root@bigdata-1 ~]# lsof -i | grep 21628
java 21628 hbase 497u IPv6 671848 0t0 TCP bigdata-1.jx.com:fmsas (LISTEN)
java 21628 hbase 535u IPv6 1092361912 0t0 TCP bigdata-1.jx.com:42952->bigdata-2.jx.com:intu-ec-svcdisc (ESTABLISHED)
java 21628 hbase 544u IPv6 1069230900 0t0 TCP bigdata-1.jx.com:34786->bigdata-3.jx.com:eforward (ESTABLISHED)
java 21628 hbase 546u IPv6 667184 0t0 TCP *:16010 (LISTEN)
java 21628 hbase 553u IPv6 1069226661 0t0 TCP bigdata-1.jx.com:41530->bigdata-6.jx.com:eforward (ESTABLISHED)
java 21628 hbase 554u IPv6 1069232169 0t0 TCP bigdata-1.jx.com:41556->bigdata-6.jx.com:eforward (ESTABLISHED)
java 21628 hbase 558u IPv6 663299 0t0 TCP bigdata-1.jx.com:fmsas->bigdata-4.jx.com:59645 (ESTABLISHED)
java 21628 hbase 559u IPv6 663300 0t0 TCP bigdata-1.jx.com:fmsas->bigdata-6.jx.com:52580 (ESTABLISHED)
java 21628 hbase 560u IPv6 671510 0t0 TCP bigdata-1.jx.com:fmsas->bigdata-3.jx.com:60826 (ESTABLISHED)
java 21628 hbase 561u IPv6 671511 0t0 TCP bigdata-1.jx.com:fmsas->bigdata-5.jx.com:59801 (ESTABLISHED)
java 21628 hbase 562u IPv6 1069226793 0t0 TCP bigdata-1.jx.com:34860->bigdata-3.jx.com:eforward (ESTABLISHED)
java 21628 hbase 563u IPv6 1092364695 0t0 TCP bigdata-1.jx.com:37772->bigdata-4.jx.com:6188 (ESTABLISHED)
[root@bigdata-1 ~]# netstat -nap | grep 8020
tcp 0 0 10.1.3.11:8020 0.0.0.0:* LISTEN 7307/java
tcp 0 0 10.1.3.11:54260 10.1.3.11:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:53796 10.1.3.11:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:38356 10.1.3.12:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:8020 10.1.3.13:58220 ESTABLISHED 7307/java
tcp 0 0 10.1.3.11:37646 10.1.3.12:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:8020 10.1.3.13:58416 ESTABLISHED 7307/java
tcp 0 0 10.1.3.11:38016 10.1.3.12:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:53732 10.1.3.11:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:38318 10.1.3.12:8020 ESTABLISHED 7307/java
tcp 0 0 10.1.3.11:48020 10.1.3.11:6379 TIME_WAIT -
tcp 0 0 10.1.3.11:37892 10.1.3.12:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:42812 10.1.3.11:8020 ESTABLISHED 27950/java
tcp 0 0 10.1.3.11:53750 10.1.3.11:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:8020 10.1.3.16:42470 ESTABLISHED 7307/java
tcp 0 0 10.1.3.11:53744 10.1.3.11:8020 TIME_WAIT -
tcp 0 0 10.1.3.11:8020 10.1.3.11:42812 ESTABLISHED 7307/java
tcp 0 0 10.1.3.11:37840 10.1.3.12:8020 TIME_WAIT -
比较常用的:
[root@bigdata-1 ~]# lsof -i:8020
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7307 hdfs 368u IPv4 1092332154 0t0 TCP bigdata-1.jx.com:40672->bigdata-2.jx.com:intu-ec-svcdisc (ESTABLISHED)
java 7307 hdfs 373u IPv4 574845 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc (LISTEN)
java 7307 hdfs 406u IPv4 1092332264 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc->bigdata-3.jx.com:59754 (ESTABLISHED)
java 7307 hdfs 407u IPv4 1092332116 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc->bigdata-3.jx.com:59600 (ESTABLISHED)
java 7307 hdfs 417u IPv4 1069231023 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc->bigdata-5.jx.com:51882 (ESTABLISHED)
java 7307 hdfs 429u IPv4 1069421517 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc->bigdata-1.jx.com:42812 (ESTABLISHED)
java 7307 hdfs 430u IPv4 1069231013 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc->bigdata-4.jx.com:42956 (ESTABLISHED)
java 7307 hdfs 458u IPv4 1069231011 0t0 TCP bigdata-1.jx.com:intu-ec-svcdisc->bigdata-6.jx.com:42470 (ESTABLISHED)
java 12978 spark 257u IPv6 1069417993 0t0 TCP bigdata-1.jx.com:55208->bigdata-2.jx.com:intu-ec-svcdisc (ESTABLISHED)
java 17073 hive 308u IPv6 1092326273 0t0 TCP bigdata-1.jx.com:40322->bigdata-2.jx.com:intu-ec-svcdisc (ESTABLISHED)
java 21628 hbase 535u IPv6 1092332899 0t0 TCP bigdata-1.jx.com:40280->bigdata-2.jx.com:intu-ec-svcdisc (ESTABLISHED)
java 27950 hdfs 390u IPv4 1069424718 0t0 TCP bigdata-1.jx.com:42812->bigdata-1.jx.com:intu-ec-svcdisc (ESTABLISHED)
[root@bigdata-1 ~]# id hive
uid=1006(hive) gid=1001(hadoop) 组=1001(hadoop),1002(hdfs)
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格式
[root@bigdata-1 phm]# wc -l sparkstream-run-test3.sh
14 sparkstream-run-test3.sh
[root@bigdata-1 phm]# cat sparkstream-run-test3.sh | grep spark | wc -l
3
[root@bigdata-1 phm]# which dos2unix.sh
/usr/bin/dos2unix.sh
ps -aux | grep XXX | grep -v grep |awk '{print $2}' | xargs kill
一般模式下:
编辑模式下:
底行模式:
技巧:快速退出VIM的方法
z
和q
键,不保存直接退出,和指令:q!
效果一样。less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
less 要查看的文件
操作 |
功能说明 |
空白键 |
向下翻动一页; |
[pagedown] |
向下翻动一页 |
[pageup] |
向上翻动一页; |
/字串 |
向下搜寻『字串』的功能;n:向下查找;N:向上查找; |
?字串 |
向上搜寻『字串』的功能;n:向上查找;N:向下查找; |
q |
离开 less 这个程序; |
#将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 -rf
find /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)忽略四部曲
例如:
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 {} \;
#!/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
#!/bin/bash
# 指出当前用户名
name=`whoami`
# 指定文件所在文件夹名称
dir=`dirname $1`
# 指定文件的文件名
filename=`basename $1`
# 进入到dir中
cd $dir
# 得到当前目录的绝对路径
fullpath=`pwd`
for((i=1 ; i<=6; i++)) ; do
tput setaf 2
echo ==================== bigdata-${i} $@ ===================
tput setaf 9
# 远程同步命令 l 保留软连接 r 递归文件夹
rsync -lr $filename "$name"@bigdata-"$i":$fullpath
done
例如:
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 去除 多余的空格符,防止格式带来的错误。
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
#批量替换 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" {}
场景:当发现某台虚拟机时间跑慢了,有时需要将时间调整到当前准确的时间则需要重新设置系统时间。
基本语法
案例实操
[root@hadoop101 ~]# date -s "2020-12-19 20:52:18"
&和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 ;
总结:
(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参数解释
比如安装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
配置文件config.properties
#以下是配置文件内容,配置文件文件名为config.properties
username=jack
password=33281
shell脚本(脚本名为 readConfig.sh)
#!/bin/bash
source ./config.properties
echo ${username}
注意:我这里把config.properties和readConfig.sh放置在同一文件夹下。
cat -n 文件名|grep '关键字'|awk '{print $1}'
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)
【#】代表 root权限,超级用户
【$】代表普通用户
[root@centos ~]# cat -n anaconda-ks.cfg
1 #version=DEVEL
2 # System authorization information
3 auth --enableshadow --passalgo=sha512
4 # Use CDROM installation media
5 cdrom
6 # Use graphical install
7 graphical
8 # Run the Setup Agent on first boot
9 firstboot --enable
10 ignoredisk --only-use=sda
11 # Keyboard layouts
12 keyboard --vckeymap=us --xlayouts='us'
13 # System language
14 lang en_US.UTF-8 --addsupport=zh_CN.UTF-8
判断 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
grep:一般和管道符连用
grep -i :忽略大小写进行查找
查找linux中关于mysq操作的命令
history | grep -i mysql
查看MYSQL是否安装
rpm -qa|grep -i mysql
grep -v:反向查找,不包含XXX
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 存放文件信息的文件
安装:
示例1: 搜索etc目录下所有以my开头的文件
[root@cent6 lib]# locate /etc/my /etc/my.cnf
示例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仍然找不到想要文件
可以检查挂载的目录是否被忽略了
免密码登录
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ""
#同步密钥
for((host=1;host<=4;host++))
do
echo "---> ssh-copy-id $host"
ssh-copy-id $host
done
属主:所属的用户,文档所有者,这是一个账户,这是一个人
属组:所属的用户组,这是一个组
查看属主和属组:ll
[root@bigdata2 data]# ll
total 0
drwxrwxrwx 3 root root 16 Jan 21 17:20 dfs
drwxrwxrwx 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)才有这样的权限。
> access.log
获取位置参数的方法: $*和$@,两个都可以获取位置参数
区别:不加双引号("")两者没区别用法一样,都是将每个参数单独对待。加双引号"$*"和"$@"有区别,"$*"会将所有的位置参数看成一个串,"$@"和不加双引号一样,将每个参数单独对待。因此如果需要将所有的参数看成一个串的话,则采用"$*",如果需要遍历每个位置参数就使用 $*和$@。
#下面是example.sh脚本的代码
#!/bin/bash
for i in "$*";do
echo $i
done
for i in "$@";do
echo $i
done
./example.sh 1 2 3
##输出如下所示
1 2 3 --将所有参数看成一个串
##遍历每个参数
1
2
3
#下面是example.sh脚本的代码
#!/bin/bash
s1=$*
s2=$@
echo $s1
echo $s2
for i in $s1;do
echo $i
done
for i in $s2;do
echo $i
done
./example.sh 1 2 3
##输出如下所示
1 2 3
1 2 3
1
2
3
1
2
3
此种形式两者无区别。
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
1)基本语法
sort(选项)(参数)
选项 |
说明 |
-n |
依照数值的大小排序 |
-r |
以相反的顺序来排序 |
-t |
设置排序时所用的分隔字符 |
-k |
指定需要排序的列 |
参数:指定待排序的文件列表
2)案例实操
(1)数据准备
[dandan@hadoop102 datas]$ touch sort.sh
[dandan@hadoop102 datas]$ vim sort.sh
bb:40:5.4 bd:20:4.2 xz:50:2.3 cls:10:3.5 ss:30:1.6
(2)按照“:”分割后的第三列倒序排序。
[dandan@hadoop102 datas]$ sort -t : -nrk 3 sort.sh
bb:40:5.4 bd:20:4.2 cls:10:3.5 xz:50:2.3 ss:30:1.6
${var:-defaultValue}
含义:当var没有定义时,此时使用defaultValue, 而var依然为空,没有改变值,有定义或不为空的时候使用定义的值
案例1:可以对位置参数进行判断,并赋默认值
if [ "$1" != "all" -a -n "$1" ] ;then
map_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" ] ;then
do_date=$2
else
do_date=`date +%Y%m%d`
fi
可以直接简化为:
default_date=`date +%Y%m%d`
do_date=${2:-$default_date}
或
${2:=$default_date}拿来直接使用即可
如下:
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"
}&
done
wait
#!/bin/bash
start_time=$(date +%s)
for ((i=1;i<=1000;i++))
do
{
sleep 5s /该命令是用来测试的命令,此处为实际执行的命令
echo "$i"
} &
done
wait /等待1000个后台任务全都执行完成之后,再继续执行执行脚本
end_time=$(date +%s)
echo "TIME:$(expr $end_time- $start_time)"
用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行,一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了,循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理.
其中:&号表示把命令放入后台运行
wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令。如果wait后面不带任何的进程号或作业号,那么wait会直至当前shell中进程的所有子进程都执行结束后,才继续执行下一步。
sleep是使系统休眠一定的时间之后再去执行下面的任务。
注意:循环中使用多线程的时候,循环体结束后一定要用wait.因为你的脚本都放在后台了,如果没有wait的话,它们在后台没运行完就退出了,此时主进程先退出了,有wait的话,是等到所有子进程都接受才终止脚本,主进程才会终止。
说明
实例
案例1:
parameter = ab
${parameter^} ##得到结果Ab
${parameter^^} ##得到结果AB
案例2:
parameter = AB
${parameter,} ##得到结果aB
${parameter,,} ##得到结果ab
当开启hadoop权限认证时候,执行任务会报权限问题
报如下错:
说明root用户不具备HDFS访问权限。
每台hadoop集群节点上执行如下命令
groupadd supergroup --增加supergrouo用户组
usermod -a -G supergroup root --将root用户添加到supergroup用户组
sudo -u hdfs hdfs dfsadmin -refreshUserToGroupsMappings --更新hdfs的用户到用户组映射文件