Shell脚本常用命令简介

1、格式化日期yyyy-mm-dd hh:mm:ss显示

  1.1、date "+%Y-%m-%d %H:%M:%S"

  1.2、date "+%F %T"

  1.3、查看文件的时候格式化文件last time为YYYY-MM-DD格式:ls -l --time-style="+%Y-%m-%d"

2、手动设置和同步CentOS时间

  2.1、设置主服务器(host1)时间

    date -s 月/日/年

    date -s 时:分:

    clock -w

  2.2、设置从服务器(host2、host3)同步主服务器时间

    在host2中执行:date --set="$(ssh root@host1 date)"

    在host3中执行:date --set="$(ssh root@host1 date)"

       2.3、修改系统时区为东八区

              ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    date -R

3、查看端口占用

  netstat -apn  | grep 9095

 

4、查看系统版本

  1  cat /etc/redhat-release

  2  cat /proc/version

  3  uname -r

  4  uname -a

 

5、将内容写入到新文件

      echo "hello">a.txt

6、将内容追加到文件末尾(默认换行)

      echo "shell">>a.txt

 

7、linux权限描述

  444 r--r--r--
  600 rw-------
  644 rw-r--r--
  666 rw-rw-rw-
  700 rwx------
  744 rwxr--r--
  755 rwxr-xr-x
  777 rwxrwxrwx

  从左至右,1-3位数字代表文件所有者的权限,4-6位数字代表同组用户的权限,7-9数字代表其他用户的权限。
  而具体的权限是由数字来表示的:
    读取的权限等于4,用r表示;
    写入的权限等于2,用w表示;
    执行的权限等于1,用x表示;
  通过4、2、1的组合,得到以下几种权限:0(没有权限);4(读取权限);5(4+1 | 读取+执行);6(4+2 | 读取+写入);7(4+2+1 | 读取+写入+执行)
  以755为例:
    1-3位7等于4+2+1,rwx,所有者具有读取、写入、执行权限;
    4-6位5等于4+1+0,r-x,同组用户具有读取、执行权限但没有写入权限;
    7-9位5,同上,也是r-x,其他用户具有读取、执行权限但没有写入权限。

 为文件授权

  chmod 777 a.txt(最高权限)

  chmod u+x a.txt(可执行权限)

  chmod 755 a.txt()

赋予指定的用户可以使用root权限(使用root登录):

  vi /etc/sudoers    ##如果root没有权限修改该文件则授权写和执行权限:chmod u+w /etc/sudoers和chmod u+x /etc/sudoers

  在## Allow root to run any commands anywhere这行内容下添加 user ALL=(ALL) ALL

 

8、允许普通用户关机

  在普通用户登录下执行:sudo chmod u+s /sbin/shutdown    ##需要该普通用户拥有执行root命令的权限

 

9、允许普通用户修改系统时间

  在普通用户登录下执行:sudo chmod u+s /bin/date    ##需要该普通用户拥有执行root命令的权限

 

10、如果root用户执行权限操作出现:chmod: changing permissions of `/etc/hosts': Operation not permitted,使用如下方法解决:

  原因:

    因需要对/etc/hosts文件添加ip和主机名的映射关系,发现root用户无权限操作,报的错误如题。

  解释:

    在Linux下,root用户的权限最大(Linux下UID数值越小的用户,权限越大,如果最小值为0则为root用户)。chmod的底层实现是chattr命令,此命的功能更强大,甚至可以锁定文件,即使root用户也操作不了此文件。chattr是用来更改文件属性,lsattr可用来查看文件的属性。

  解决:

    执行命令:ll /etc/hosts(查看文件权限)

      

    执行命令:lsattr /etc/hosts(查看文件属性,发现有i和a两个属性)

      

    执行命令:chattr -ia /etc/hosts(去掉i和a两个属性,此时就可以修改该文件的内容)

      

    执行命令:chmod u+x /etc/hosts或vim /etc/hosts(做出相应的授权操作或修改文件内容)

      

 

     执行命令:chattr +ia /etc/hosts(恢复i和a两个属性,此时,root用户就无法对/etc/hosts文件执行任何权限操作了)

      

 

11、ls命令

  # 查看文件大小:-h表示显示文件大小;-Sl为逆序排序;-Slr为升序排序

  ls -hSlr /var/log/

 

12、使用su命令切换用户提示不可用:This account is currently not available.

  1、查看hdfs用户的shell是否为nologin

    cat /etc/passwd|grep hdfs

  2、若是/bin/sbin/nologin则修改为/bin/bash

    vim /etc/passwd

      修改

        hdfs:x:39998:39998:Hadoop HDFS:/var/lib/hadoop-hdfs:/usr/sbin/nologin

      为

        hdfs:x:39998:39998:Hadoop HDFS:/var/lib/hadoop-hdfs:/bin/bash

  3、再次su命令切换用户就可以了

 

 

 

 

 

for循环

  //循环打印1到3

  for (( i=1;i<4;i++ )); do echo $i; done

  //循环打印1到3(使用`seq`范围符号)

  for i in `seq 1 3`; do echo $i; done

 

 

带参数if~else if else的shell关机或重启脚本

  #!/bin/sh
  flag=$1
  if [[ $flag = "s" ]]; then
      echo "##################################     Shutdown lefu Claster             ####################################"
      for i in lf7 lf6 lf5 lf3 lf1; do echo $i; ssh $i "source /etc/profile;shutdown -h now"; done
  elif [[ $flag = "r" ]]; then
      echo "##################################     Reboot lefu Claster               ####################################"
      for i in lf7 lf6 lf5 lf3 lf1; do echo $i; ssh $i "source /etc/profile;shutdown -r now"; done
  else
      echo -e "\nUsage : s(shutdown)  or  r(reboot)\n"
  fi

 

为当前用户创建定时任务

  crontab -e  编辑该用户的计时器设置。

  crontab-l  列出该用户的计时器设置。

  crontab-r  删除该用户的计时器设置。

  *  *  *  *  *  command
  分  时  日  月  周  命令
  第1列表示分钟1~59 每分钟用*或者 */1表示
  第2列表示小时1~23(0表示0点)
  第3列表示日期1~31
  第4列表示月份1~12
  第5列标识号星期0~6(0表示星期天)
  第6列要运行的命令

  查看定时任务服务是否已经启动:service crond status    ##如果已经运行则输出:crond (pid  2538) is running...

  查看定时任务服务是否开机启动:chkconfig --list | grep crond    ##如果是开机启动则输出:crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off

  为当前用户添加定时任务:   

    crontab -e
    30 23 * * * echo `date`>>/home/lefuBigDataDev/lefu/testdata/words    ##每天的23:30:01秒将系统时间写入到一个文件中
    10 17 * * * echo `date`>>/home/lefuBigDataDev/lefu/testdata/test1    ##每天的17:10:01秒将系统时间写入到一个文件中

    shift+zz

  查看当前用户的定时任务:

    crontab -l

 

集群时间同步(适用于无法连接外网的集群)

  假设有node1,node3,node5,node6,node7五台机器,除node1外其他四台机器都从node1获取时间如下

  在node1机器上创建syncClusterTime脚本

    #!/bin/sh
    current=`date +%H:%M:%S`
    for i in node3 node5 node6 node7; do echo $i; ssh $i "source /etc/profile;date -s $current"; done

  该脚本创建完则添加到定时任务(每天早晨5:10分同步时间):

    crontab -e

    10 5 * * * syncClusterTime    ##每天早晨的5:10:01秒同步集群时间

    shift+zz

  以上步骤完成即可

 

设置CentOS防火墙允许外部用户访问特定端口

  允许外网机器访问hadoop集群服务器的hdfs web页面,如下

    vi /etc/sysconfig/iptables    ##编辑防火墙配置文件

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT    ##对外部开放50070端口

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 1000:30000 -j ACCEPT     ##对外部开放1000~30000范围的端口

    shift+zz    ##保存退出

    service iptables restart    ##刷新使防火墙配置生效

    shutdown -r now    ##重启服务器

  这时候在外部电脑上用浏览器打开http://IP:50070端口即可访问

解压和压缩gzip文件

  解压:tar -zxvf lefuyun001.tar.gz -C lefuyun

  压缩:tar -czf lefuyun001.tar.gz lefuyun/ 

解压和压缩gzip文件

  解压:unzip bills.zip -d .   

    

 开机不启动图形界面:

  vi /etc/inittab

    id:3:initdefault:

关闭selinux
    1、永久关闭:修改/etc/selinux/config文件中的SELINUX=disabled,重启服务器生效
    2、临时关闭:setenforce 0

 

查看端口占用

  # 查看

  netstat -lnp | grep 9000

  # 查看端口对应的进程信息

  netstat -tunlp | grep 8080

  # 查看端口对应的进程

  lsof -i:8080

查看硬盘容量:fdisk -l

查看硬盘剩余容量:df -h 

查看指定目录下(/为根目录)的文件或文件夹占用空间大小:du -h --max-depth=1 /

查看/var路径下占用空间最大的文件夹:[root@host /var] du -sh *

查看CPU核数:cat /proc/cpuinfo,从0开始

查看剩余内存:free -g(-g指GB,-m指MB)

安装wget:yum install wget

Shell脚本执行多条命令:

  1.每个命令之间用;隔开

    说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。

  2.每个命令之间用&&隔开
    说明:如果前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。

  3.每个命令之间用||隔开
    说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。

 

# 从多个log文件中搜索特定字符串

  语法:

    find 目录 -type f -name "*.txt" | xargs grep "要匹配的字符串"

  例子:
    find /root/hbase-logs/region-logs -type f -name "*.log" | xargs grep "Region-In-Transition"
 
# grep精确匹配
  grep –w "abc"
  或者
  grep "\<abc\>"

 

# 查找jar包中的class文件

find . -name "*.jar"| awk '{print "jar -tf "$1}'| sh -x | grep -i "/JdbcHelper.class" 

 

VI编辑器:

    显示行号: :set number 

  进入特定行: :number 

  翻页:

    向下翻页(下一页):Ctrl + f

    向上翻页(上一页):Ctrl + b

  上一个或下一个

    跳到下一个:小写n
    上一个:大写N

 

 

 

 

 

 

 

附上一个完整的集群启停脚本

#!/bin/sh

cmd=$1

if [[ $cmd = "start" ]]; then
        echo "==== start zookeeper ===="
        for i in `seq 1 3`; do echo bigdata-cdh0$i; ssh bigdata-cdh0$i "source /etc/profile; /export/servers/zookeeper/bin/zkServer.sh start"; done
        echo "==== start kafka     ===="
        for i in `seq 1 3`; do echo bigdata-cdh0$i; ssh bigdata-cdh0$i "source /etc/profile; /export/servers/kafka/bin/kafka-server-start.sh -daemon /export/servers/kafka/config/server.properties"; done
        echo "==== start hadoop    ===="
        for i in `seq 1 2`;
                do echo bigdata-cdh0$i;
                if [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hadoop/sbin/start-dfs.sh";
                elif [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hadoop/sbin/start-yarn.sh";
                fi
        done
        echo "==== start hbase     ===="
        for i in `seq 1 3`;
                do echo bigdata-cdh0$i;
                if [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hbase/bin/start-hbase.sh";
                fi
        done
        echo "==== start hive      ===="
        for i in `seq 1 2`;
                do echo bigdata-cdh0$i;
                if [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hive/bin/hive --service metastore >/dev/null 2>&1 &";
                elif [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hive/bin/hive --service hiveserver2 >/dev/null 2>&1 &";
                fi
        done
        echo "==== start druid     ===="
        for i in `seq 3 -1 1`;
                do echo bigdata-cdh0$i;
                if [[ $i = 3 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/druid/bin/broker.sh start";
                elif [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/druid/bin/historical.sh start; /export/servers/druid/middleManager.sh start";
                elif [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/druid/bin/coordinator.sh start; /export/servers/druid/overlord.sh start";
                fi
        done
elif [[ $cmd = "stop" ]]; then
        echo "==== stop druid     ===="
        for i in `seq 1 3`;
                do echo bigdata-cdh0$i;
                if [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/druid/bin/overlord.sh stop; /export/servers/druid/coordinator.sh stop";
                elif [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/druid/bin/historical.sh stop; /export/servers/druid/middleManager.sh stop";
                elif [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/druid/bin/broker.sh stop";
                fi
        done
        echo "==== stop hive      ===="
        for i in `seq 2 -1 1`;
                do echo bigdata-cdh0$i;
                if [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; ps -ef | grep RunJar | grep -v grep | awk  '{print $2}' | xargs  kill -9";
                elif [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; ps -ef | grep RunJar | grep -v grep | awk  '{print $2}' | xargs  kill -9";
                fi
        done
        echo "==== stop hbase     ===="
        for i in `seq 1 3`;
                do echo bigdata-cdh0$i;
                if [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hbase/bin/stop-hbase.sh";
                elif [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hbase/bin/hbase-daemon.sh stop hmaster";
                fi
        done
        echo "==== stop hadoop    ===="
        for i in `seq 1 2`;
                do echo bigdata-cdh0$i;
                if [[ $i = 1 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hadoop/sbin/stop-dfs.sh";
                elif [[ $i = 2 ]]; then
                        ssh bigdata-cdh0$i "source /etc/profile; /export/servers/hadoop/sbin/stop-yarn.sh";
                fi
        done
        echo "==== stop  kafka     ===="
        for i in `seq 1 3`; do echo bigdata-cdh0$i; ssh bigdata-cdh0$i "source /etc/profile; /export/servers/kafka/bin/kafka-server-stop.sh"; done
        echo "==== stop  zookeeper ===="
        for i in `seq 1 3`; do echo bigdata-cdh0$i; ssh bigdata-cdh0$i "source /etc/profile; /export/servers/zookeeper/bin/zkServer.sh stop"; done
else
        echo -e "\nUsage : start or stop\n"
fi

for i in `seq 1 3`; do echo bigdata-cdh0$i "节点当前正在运行的守护进程"; ssh bigdata-cdh0$i `which jps`; done

 

 

posted @ 2015-05-11 15:14  孟尧  阅读(813)  评论(0编辑  收藏  举报