目录
21 将某文件放到某N级目录下 (且排除某些目录不copy)
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 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%)
1.2 解压命令
- tar -xzvf 包名 【-C <指定解打包后的位置>】
- unzip 压缩文件名 【-d <文件解压缩后所要存储的目录>】
1.3 打包解压命令总结
tar 命令
- 1)基本语法
tar [选项] XXX.tar.gz 将要打包进去的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
- 2)选项说明
表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命令
- 1)基本语法
zip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip (功能描述:解压缩文件)
- 2)选项说明
zip选项 | 功能 |
-r | 压缩目录 |
unzip选项 | 功能 |
-d<目录> | 指定解压后文件的存放目录 |
- 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]# 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/
2 权限设置
- chmod -R 777 文件夹名 。给与指定文件夹读写执行权限
- r => 4 w => 2 x => 1
3 指定用户执行命令
-
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.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
6 统计文件大小
6.1 统计当前目录下各个子文件的大小及总大小
-
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 .
6.2 统计文件总大小
- du -sh
[root@bigdata-1 phm]# du -sh
183M .
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 XXX
- ps -aux| grep XXX
- ps -aux | grep XXX | grep -v grep | awk '{print $2}'
[root@bigdata-1 ~]# ps -aux | grep spark | grep -v grep | awk '{print $2}'
12978
17073
ps:process status 进程状态
- 1)基本语法
ps -aux | grep xxx (功能描述:查看系统中所有进程)
ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
- 2)选项说明
选项 | 功能 |
-a | 选择所有进程 |
-u | 显示所有用户的所有进程 |
-x | 显示没有终端的进程 |
- 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 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
常用:
- lsof -i | grep pid
[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)
10 根据端口查进程id
- netstat -nap | grep port
[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 -
比较常用的:
- lsof -i:port
[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)
- (1)根据进程pid查端口: lsof -i | grep pid
- (2)根据端口port查进程: lsof -i:port
- (3)根据进程pid查端口: netstat -nap | grep pid
- (4)根据端口port查进程 netstat -nap | grep port
- 区别:
- 1.netstat无权限控制,lsof有权限控制,只能看到本用户
- 2.losf能看到pid和用户,可以找到哪个进程占用了这个端口,显示的信息更全面(推荐使用)
11 实时监控某文件内容
- tail -f 文件名
12 查看用户是否存在
- id 用户
[root@bigdata-1 ~]# id hive
uid=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.sh
14 sparkstream-run-test3.sh
- 查看某文件某单词出现的次数
[root@bigdata-1 phm]# cat sparkstream-run-test3.sh | grep spark | wc -l
3
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 -9
ps -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)操作说明
操作 | 功能说明 |
空白键 | 向下翻动一页; |
[pagedown] | 向下翻动一页 |
[pageup] | 向上翻动一页; |
/字串 | 向下搜寻『字串』的功能;n:向下查找;N:向上查找; |
?字串 | 向上搜寻『字串』的功能;n:向上查找;N:向下查找; |
q | 离开 less 这个程序; |
19 查看系统内存使用情况
- free -m
20 查看系统健康状况
- 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 -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)忽略四部曲
- 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++)) ; do
tput setaf 2
echo ==================== bigdata-${i} $@ ===================
tput setaf 9
# 远程同步命令 l 保留软连接 r 递归文件夹
rsync -lr $filename "$name"@bigdata-"$i":$fullpath
done
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 "2020-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.properties
username=jack
password=33281
shell脚本(脚本名为 readConfig.sh)
#!/bin/bash
source ./config.properties
echo ${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.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
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 -y
- updatedb
示例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仍然找不到想要文件
可以检查挂载的目录是否被忽略了
38 配置免密登录脚本
免密码登录
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
39 改变文件或目录所属的属主及属组
属主:所属的用户,文档所有者,这是一个账户,这是一个人
属组:所属的用户组,这是一个组
查看属主和属组: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)才有这样的权限。
40 清空文件内容
> access.log
41 获取每一个位置参数进行遍历
获取位置参数的方法: $*和$@,两个都可以获取位置参数
区别:不加双引号("")两者没区别用法一样,都是将每个参数单独对待。加双引号"$*"和"$@"有区别,"$*"会将所有的位置参数看成一个串,"$@"和不加双引号一样,将每个参数单独对待。因此如果需要将所有的参数看成一个串的话,则采用"$*",如果需要遍历每个位置参数就使用 $*和$@。
#下面是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
此种形式两者无区别。
42 按字符分割后某列值进行排序
sort
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
43 shell 变量初始化赋默认值
${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}拿来直接使用即可
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"
}&
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的话,是等到所有子进程都接受才终止脚本,主进程才会终止。
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的用户到用户组映射文件