study-notes(5 Linux)

这篇文章是将自己所学技术按模块划分总结而成的笔记,包含了 JavaSE、JavaWeb(SpringMVC、Spring、MyBatis、SpringBoot、SpringCloud 等)、Linux、Hadoop、MapReduce、Hive、Scala、Spark 等,希望通过这些笔记的总结,不仅能让自己对这些技术的掌握更加深刻,同时也希望能帮助一些其他热爱技术的人,这些笔记后续会继续更新,以后自己学习的其他最新技术,也都会以这样笔记的形式来保留,这些笔记已经共享到 Github,大家可以在那里下载到 Markdown 文件,如果大家在看的时候有什么问题或疑问,可以通过邮箱与我取得联系,或者在下面的评论区留言,同时也可以在 Github 上与我进行互动,希望能与大家一起相互学习,相互进步,共同成长。

本篇文章 Github 地址 : https://github.com/wpwbb510582246/study-notes/blob/master/5 Linux/5 Linux.md

项目 Github 地址 : https://github.com/wpwbb510582246/study-notes

email : weipengweibeibei@163.com

博客地址 : https://blog.csdn.net/wpwbb510582246

5 Linux

5.1 Shell 编程

5.1.1 基本命令

5.1.1.1 chmod
# 为文件 file 添加可执行权限
chmod +x file
5.1.1.2 特殊字符
# $# 表示传递到脚本的参数个数
# $* 以一个单字符显示所有传递到脚本的参数
# $$ 脚本当前运行进程的 ID 号
# $@ 与 $* 相似,不被" "包含时,$*和$@都以$1 $2… $n 的形式组成参数列表。被" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表。
# $? 显示最后命令的退出状态
#!/bin/bash
echo $0
echo $1
echo ${10}
echo 个数是:$#
echo 所有的参数是:$*
echo 这个进程执行了我: $$
echo 所有的参数是:$@
echo 上一条命令的执行状态:$?

执行结果 :

1

10

个数是:10

所有的参数是:1 2 3 4 5 6 7 8 9 10

这个进程执行了我: 3364

所有的参数是:1 2 3 4 5 6 7 8 9 10

上一条命令的执行状态:0

5.1.1.3 运算符
# (()) 和 [] 进行算术运算
((count++))
[count++]
a=$((count++))
b=$[count++]

# = 和 == 的区别,当等号两边是纯数字时,二者的使用方法相同,当等号两边包含正则表达式时,则必须使用 [[]],并且 * 必须写在等号的右边
#!/bin/bash
a=123ab*
b=123abc
if [[$b == $a]]
then echo a 和 b 相等
elif echo a 和 b 不相等
fi
5.1.1.4 流程控制
# if else
#!/bin/bash
echo 请输入月份
read month
if [$month -ge 3 -a $month -le 5]
then echo 春天
if [$month -ge 6 -a $month -le 8]
then echo 夏天
if [$month -ge 9 -a $month -le 11]
then echo 秋天
if [$month -ge 12 -a $month -le 2]
then echo 冬天

# for
#!/bin/bash
echo 方法一
for item in 1 2 3
do
echo $item
done

echo 方法二
for item in 1 2 3;do;echo $item;done

echo 方法三
for ((i=1; i<= 10; i++))
do
echo $i
done

echo 方法四
for item in {2..9};do;echo $item;done

# while
i=1
while(($i <= 10))
do
echo $i
done

# case
echo 请输入你的分数
read score
score=(($score / 10))
case score in
10)
echo 满分
;;
9)
echo 优秀
;;
8)
echo 良好+
;;
7)
echo 良好-
;;
6)
echo 及格
;;
*)
echo 不及格
;;
esac
5.1.1.5 ``
# `` 可以引用其所包含的值并将其赋值给一个变量
num=`cat /usr/local/file/test/times.txt`
5.1.1.6 -e
# -e 可以判断一个文件是否存在
if [ -e /usr/local/file/test/times.txt ]
then
num=`cat /usr/local/file/test/times.txt`
fi
5.1.1.7 替换
# 替换 old 第一次出现所在行的第一个 old
:s/old/new

# 替换 old 第一次出现所在行的所有 old
:/s/old/new/g

# 替换整篇文章中的 old
:%s/old/new/g

5.2 shell 脚本

Shell 脚本编写流程 :

1、#!/bin/bash

2、设置环境变量

3、设置一些主类、目录等常量

4、Shell 主程序,结合流程控制(if … else)去分别执行 Shell 命令

5.2.1 在集群中执行相同命令

#!/bin/bash
num=21
command=$*
tmp=${command% *}
if [ x$tmp = x ]
then
echo 请输入要执行的命令
else
  while((num <= 23))
  do
    echo ------------------------------------- hadoop$num -------------------------------------
    echo
    ssh root@hadoop$num "source /etc/profile;$command"
    ((num++))
    echo
  done
fi

5.2.2 在集群中复制文件

#!/bin/bash
num=22
source=$1
dest=$2
if [ x$source = x ]
  # 源文件为空
then
echo 请输入源文件
else
  # 源文件不为空,判断源文件是否为绝对路径
  isRoot=`echo $source | grep "/"`
  if [ x$isRoot = x -o x$source = x ]
    # 源文件不是绝对路径,将源文件加上当前目录
  then
    source=`pwd`/$source
  else
    # 源文件是绝对路径,直接使用源文件
    source=$1
  fi
  if [ x$dest != x ]
  # 目标文件不为空,直接使用目标文件
  then
    dest=$dest
  else
  # 目标文件为空,使用源文件,即将源文件复制到目的主机相同的路径
  dest=${source%/*}
  fi
  while(($num <= 23))
  do
    echo ------------------------------------- hadoop$num -------------------------------------
    echo
    scp -r $source root@hadoop$num:$dest
    ((num++))
    echo
  done
fi

5.2.3 工作流调度

5.2.3.1 把 Flume 的输出数据,移动到 MapReduce 的输入目录
export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/export/server/hadoop-2.7.4
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH


log_flume_dir=/weblog/flume-collection
log_pre_input=/data/weblog/preprocess/input

preday=`date -d '-1 day' +%Y-%m-%d`
syear=`date +%Y`
smonth=`date +%m`
sday=`date +%d`


files=`hadoop fs -ls $log_flume_dir | grep $preday | wc -l`
if [ $files  -gt 0 ]; then
    hadoop fs -mv ${log_flume_dir}/$preday ${log_pre_input}
fi

问题:
    a、flume收集到的数据的目录应该会有好多个(以天为单位),这些目录用来存放flume收集到的数据
    b、mr程序读取目录中的数据,会不会处理目录的子目录的数据(测试了:不会,而且有子目录会报错,意味着,必须把当天收集到的数据,放在同一个目录中)
5.2.3.2 调用 MapReduce

预处理 MapReduce :

export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/export/server/hadoop-2.7.4
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

log_pre_input=/data/weblog/preprocess/input
log_pre_output=/data/weblog/preprocess/output

preday=`date -d '-1 day' +%Y-%m-%d`
syear=`date +%Y`
smonth=`date +%m`
sday=`date +%d`

files=`hadoop fs -ls ${log_pre_input} | grep $preday | wc -l`
if [ $files -gt 0 ]; then
    hadoop fs -mkdir -p $log_pre_output
    hadoop jar pre.jar $log_pre_input/$preday $log_pre_output/$preday
fi

pageviews 预处理 :

export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/export/server/hadoop-2.7.4
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

log_pageviews_input=/data/weblog/preprocess/output
log_pageviews_output=/data/weblog/preprocess/pageviews

preday=`date -d '-1 day' +%Y-%m-%d`
syear=`date +%Y`
smonth=`date +%m`
sday=`date +%d`

files=`hadoop fs -ls ${log_pageviews_input} | grep $preday | wc -l`
if [ $files -gt 0 ]; then
    hadoop fs -mkdir -p $log_pageviews_output
    hadoop jar pageviews.jar $log_pageviews_input/$preday $log_pageviews_output/$preday
fi

visit 预处理 :

export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/export/server/hadoop-2.7.4
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

log_visit_input=/data/weblog/preprocess/pageviews
log_visit_output=/data/weblog/preprocess/visit

preday=`date -d '-1 day' +%Y-%m-%d`
syear=`date +%Y`
smonth=`date +%m`
sday=`date +%d`

files=`hadoop fs -ls ${log_visit_input} | grep $preday | wc -l`
if [ $files -gt 0 ]; then
    hadoop fs -mkdir -p $log_visit_output
    hadoop jar visit.jar $log_visit_input/$preday $log_visit_output/$preday
fi
5.2.3.3 导入 Hive
export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/export/server/hadoop-2.7.4
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
export HIVE_HOME=/export/server/hive

preday=`date -d '-1 day' +%Y-%m-%d`
syear=`date +%Y`
smonth=`date +%m`
sday=`date +%d`

log_pre_output=/data/weblog/preprocess/output/$preday
log_pageviews_output=/data/weblog/preprocess/pageviews/$preday
log_visit_output=/data/weblog/preprocess/visit/$preday

load_pre_sql="load data inpath '$log_pre_output' into table ods_weblog_origin partition(datestr='$preday')"
load_pageviews_sql="load data inpath '$log_pageviews_output' into table ods_weblog_pageviews partition(datestr='$preday')"
load_visit_sql="load data inpath '$log_visit_output' into table ods_weblog_visit partition(datestr='$preday')"


$HIVE_HOME/bin/hive -e "${load_pre_sql};${load_pageviews_sql};${load_visit_sql};"

5.2.4 远程运行其它机器上的脚本

其中 host 是远程机器的主机名,command 是要在远程机器上运行的脚本(包括完整路径)
ssh root@host command

5.2.5 读取文件内容

其中 file 为文件名
cat file while read line
do
echo $line
done

5.2.6 Java 程序打包成 jar 包在 Linux 上运行的方法

本地运行

//    其中 java -jar 运行的是已指定主类的 jar 包,java -cp 运行的是未指定主类的 jar 包,jar1、jar2 是 Java 程序打包成的 jar 包以及引用的依赖包,main-class 是 Java 程序打包成 jar 包的主类的全类名(包括包名和类名),args 是要传递的参数
java -cp jar1:jar2 main-class args

yarn 上运行

//    其中 jar1 是 Java 程序打包成的 jar 包,main-class 是 Java 程序打包成 jar 包的主类的全类名(包括包名和类名),args 是要传递的参数,jar2、jar3 是 Java 程序打包成的 jar 包引用的依赖包
yarn jar jar1 main-class args -libjars jar2:jar3

5.3 Linux 命令

5.3.1 > 和 >> 的区别

# > 表示覆盖原文件的内容,>> 表示向原文件中追加内容
echo 用户日志信息 > /usr/local/file/test/access.log
echo 用户日志信息 >> /usr/local/file/test/access.log

5.3.2 rpm

# 查询所安装的软件
rpm -qa | grep java

# 卸载所安装的软件
rpm -e 软件名

# 安装软件
rpm -ivh 软件名

5.3.3 截取字符串

# 以 / 为分隔符去除 / 及右边所有字符,保留左边所有字符
${var%/*}

# 以 / 为分隔符去除 / 及左边所有字符,保留右边所有字符
${var##*/}

5.3.4 判断一个字符串中是否含有指定字符

# 判断一个字符串中是否含有 /
isRoot=`echo $source | grep /`

5.3.5 读取一个文本中指定行的数据

# 读取一个文本中第二行的数据
sed -n -2p file

5.3.6 tail

tail -f filename 说明:监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。
tail -n 20 filename 说明:显示filename最后20行。
tail -r -n 10 filename 说明:逆序显示filename最后10行

5.3.7 awk

awk 的基本选项:
-F 指定分隔符,-F后面加指定的分隔符
-f 指定脚本,-f后面加脚本文件,从该脚本中读取awk命令,代替输入

输出a,b,c,$1 $2 $3 分别对应输出的a,b,c
echo a b c | awk'{print $1,$2,$3}'

指定分隔符是" : ",  输出passwd文本的第一列,即系统的用户名
awk -F ":" '{print $1}' /etc/passwd

用-f 选项调用一个awk脚本来对sample.txt做操作,awk脚本是test.sh
awk -f test.sh sample.txt

5.3.8 java

在 linux 上运行打包成 jar 的 java 程序,其中 mainClassReference 是主类的引用名,包括包名和类名,agrs 是主方法中通过 args 接收的参数
java -cp jarName.jar mainClassReference args

5.3.9 dirname

获取文件的路径,其中 file 为文件名
dirname file

5.3.10 截取字符串

1. # 截取,删除左边字符,保留右边字符
${str#*reg}

2. % 截取,删除右边字符,保留左边字符
${str%reg*}

5.3.11 tar

//    压缩文件
tar -zcvf 打包压缩后的文件名 要打包的文件

//    解压文件
tar -zxvf 压缩文件 -C 指定解压的位置

5.3.12 网卡操作

//    查看网卡信息
ip addr

//    关闭网卡
ifdown 网卡名

//    启动网卡
ifup 网卡名

5.3.13 mount

# 把 iso9660 类型的移动设备 /dev/cdrom 以只读的方式挂载到 /mnt/cdrom 目录,注意,/mnt/cdrom 目录需要提前创建好
mount -t iso9660  -o ro  /dev/cdrom   /mnt/cdrom

# 卸载设备
umount /dev/cdrom

5.3.14 crontab

# 安装 crontab
yum -y install crontabs

# 启动服务
service crond start

# 停止服务
service crond stop

# 重启服务
service crond restart

# 用指定的文件替代目前的 crontab, -u user 表示用来设定某个用户的 crontab 服务
crontab file [-u user]

# 列出用户目前的 crontab 服务
crontab -l [-u user]

# 编辑用户目前的 crontab 服务
crontab -e [-u user]

# 分时日月周、命令
# 分 : 1 - 59, 每分钟用 * 或 */1 表示
# 时 : 0 - 23
# 日 : 1 - 31
# 月 : 1 - 12
# 周 : 0 - 6, 0 表示星期日
*   *    *   *   *   command

# 每月 1、10、22 日的 4 : 45 重启 apache
45 4 1,10,22 * * service httpd restart

# 每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 apache
0,30 18-23 * * * service httpd restart

# 晚上 11 : 00 到早上 7 : 00 每隔 1 小时重启 apache
0 23-7/1 * * * service httpd restart

5.4 Linux 中文本编辑快捷键

5.4.1 shift + g

# 到达文本末尾
shift + g

5.4.2 o

# 跳到下一行
在命令行模式输入 o

5.4.3 date

# Y : 年份 m : 月份 d : 一个月的第几天 H : 小时 M : 分钟 S : 秒
# 2018-10-18 23:46:17
date "+%Y-%m-%d %H:%M:%S"

# 在当前日期加 1 天
date -d'+1 day' "+%Y-%m-%d %H:%M:%S"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GraysonWP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值