大数据面试01之Linux&Shell

1.1 Linux常用高级命令

序号命令命令解释
1top查看内存
2df -h查看磁盘存储情况
3iotop查看磁盘IO读写(yum install iotop安装)
4iotop -o直接查看比较高的磁盘读写程序
5netstat -tunlp | grep 端口号查看端口占用情况
6uptime查看报告系统运行时长及平均负载
7ps -aux查看进程

1.2 Shell常用工具及写过的脚本

1)awk、sed、cut、sort

2)用Shell写过哪些脚本

​ (1)集群启动,分发脚本

​ (2)数仓与mysql的导入导出

​ (3)数仓层级内部的导入

1.3 Shell中提交了一个脚本,进程号已经不知道了,但是需要kill掉这个进程,怎么操作?

ssh $i "ps -ef | grep file-flume-kafka | grep -v grep |awk '{print \$2}' | xargs kill"

1.4 Shell中单引号和双引号区别

1)在/home/atguigu/bin创建一个test.sh文件

[atguigu@hadoop102 bin]$ vim test.sh 

在文件中添加如下内容

#!/bin/bash
do_date=$1

echo '$do_date'
echo "$do_date"
echo "'$do_date'"
echo '"$do_date"'
echo `date

2)查看执行结果

[atguigu@hadoop102 bin]$ test.sh 2019-02-10

$do_date
2019-02-10
'2019-02-10'
"$do_date"
2019年 05月 02日 星期四 21:02:08 CST

3)总结:

  1. 单引号不取变量值
  2. 双引号取变量值
  3. 反引号`,执行引号中命令
  4. 双引号内部嵌套单引号,取出变量值
  5. 单引号内部嵌套双引号,不取出变量值

1.5 常见面试题

1.现有file1文件,内容如下
张三 40
李四 50
王五 60

	问题(1):使用Linux命令查询file1中空行所在的行号
	awk '/^$/{print NR}' file1                注释:^匹配开头 $匹配结尾 中间为空,即为空行
	问题(2):使用Linux命令计算第二列的和并输出
	cat file1 | awk -F " " '{sum+=$2} END{print sum}'

2.Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理
#!/bin/bash
if [ -e $1 ]
then 
	echo "$1存在!"
else
	echo "$1不存在!"
fi

3.用Linux命令(Shell脚本),对文本中无序的第一列数字排序,排序完成后并求和然后输出
vim test.txt
9
3
2
5
10

sort -n test2.txt | awk '{sum+=$0} END{print sum}'

4.请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容包含有字符"shen"的文件名称
grep -r "shen" /home 
# grep -r "shen" /home | cut -d ":" -f 1

5.判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下
#!/bin/bash
reap -p "Input file name:" file_name
if [ -c $file_name ]
then 
	cp $file_name /dev
else 
	echo "This file is not charfile!"
if

6.添加一个新组为class1,然后添加这个组的30个用户,用户名的形式为stdxx,其中xx从01到30 ?
#!/bin/bash
groupadd class1
for ((i=1;i<31;i++))
do
	if[ i -lt 10]
	then
		useradd -g class1 std0$i
	else
		useradd -g class1 std$i
	fi
done

7.编写shell程序,实现自动删除50个账号的功能,账号名为stud1至stud50
#!/bin/bash
for ((i=1;i<=50;i++))
do
	userdel -r stud$i
done

8.写一个sed命令,修改 /tmp/input.txt的文件内容
要求:删除所有空行
一行中,如果包含有 "11111" 则在"11111"前面插入 "AAA",在"11111"后面插入 "BBB",比如将0000111112222
的一行改为0000AAA11111BBB2222
input.txt 的内容如下
000011111222

000011111222222
11111000000222


111111111111122222222222
2211111111
112222222
1122
sed -e '/^$/d' -e 's#\(11111\)#AAA\1BBB#g' /tmp/input.txt

9.Linux中单引号(''),双引号(""),反引号(``)详解
区别:
单引号:所见即所得,里面的内容会原封不动的显示出来

双引号:会解析里面的变量和特殊符号
双引号括起来的字符中,“$”、反斜杠(\)和反引号(``)是拥有特殊含义的:
$ 代表引用变量的值;
\ 反斜杠是转义字符;
`` 反引号代表引用命令。

反引号:反引号里面的内容会被优先执行 里面传入的是命令
反引号用于命令替换,即先执行反引号中的语句,再把结果加入到原命令中

例子展示:
[root@alice ~]# echo '$UID'
$UID
[root@alice ~]# echo "$UID"
0
[root@alice ~]# echo `date`
Wed May 15 09:28:43 CST 2019

[zhushouqing@hadoop177 ~]$ echo "date: `date`"
date: 2023年 01月 09日 星期一 19:57:56 CST

echo "Here 'this is a string' is a string"
>>> Here 'this is a string' is a string
echo "Here \"this is a string\" is a string"
>>> Here "this is a string" is a string

双引号单引号嵌套 : 看谁在最外面
[zhushouqing@hadoop177 ~]$ export a=10
[zhushouqing@hadoop177 ~]$ echo '"$a"'
"$a"
[zhushouqing@hadoop177 ~]$ echo "'$a'"
'10'

常用的脚本展示:
	1.启停脚本需掌握
	基本逻辑就是
	#!/bin/bash
	if [ $# -lt 1 ]
	then
		echo "No Args,Please Input!"
		exit;
	if
	case $1 in
	"start")
		for host in hadoop177 hadoop178 hadoop179
		do
			ssh $host "绝对路径"
		done
	;;
	"stop")
		for host in hadoop177 hadoop178 hadoop179
		do
			
		done
	;;
	*)
		echo "Input Args Error..."
	;;
	esac
	
脚本展示:
1.jpsall -->查看集群的jps进程

#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
        echo =============== $host ===============
        ssh $host jps
done

2.myhaoop.sh -->hadoop的启停脚本
#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="
        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="
        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

3.xsync -->分发脚本(知道就行,不需会手写)

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
  echo ====================  $host  ====================
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4. 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

4.zk.sh --> zookeeper 启停脚本
#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi

case $1 in
"start")
        for i in hadoop102 hadoop103 hadoop104
    do
        echo "=====================  $i  ======================="
        ssh $i "source /etc/profile && /opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
    done
;;
"stop")
        for i in hadoop102 hadoop103 hadoop104
    do
        echo "=====================  $i  ======================="
        ssh $i "source /etc/profile && /opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
    done
;;
"status")
        for i in hadoop102 hadoop103 hadoop104
    do
        echo "=====================  $i  ======================="
        ssh $i "source /etc/profile && /opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
    done
;;
*)
    echo "Input Args Error..."
;;
esac

5.kf.sh --> kafka启停脚本
#!/bin/bash

case $1 in
"start"){
    for i in hadoop102 hadoop103 hadoop104
    do
        echo " --------启动 $i Kafka-------"
        ssh $i "/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties "
    done
};;
"stop"){
    for i in hadoop102 hadoop103 hadoop104
    do
        echo " --------停止 $i Kafka-------"
        ssh $i "/opt/module/kafka/bin/kafka-server-stop.sh"
    done
};;
esac

期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)
[atguigu@hadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin:/opt/module/jdk1.8.0_212/bin

可以将脚本放在 /home/atguigu/bin 目录下 这样脚本在任何路径都可以使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

藏在云层

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值