Linux工作中必知必会的命令总结

目录

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 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键加上zq键,不保存直接退出,和指令: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

  1. 先安装 rsync,该命令是一个远程数据同步工具
  2. 需要以 root 用户身份执行 xcall.sh yum install -y rsync 进行安装
  3. 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

Linux工作中必知必会的命令总结_第1张图片

修改: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

Linux工作中必知必会的命令总结_第2张图片

特别注意:

一般来说,这个指令(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的用户到用户组映射文件

你可能感兴趣的:(linux,and,shell,linux,hadoop)