study-notes(5 Linux)

本文深入讲解Linux核心命令与Shell编程技巧,涵盖权限管理、特殊字符、运算符、流程控制及远程脚本执行,同时分享了实用的文本编辑快捷键与自动化任务调度方法。

这篇文章是将自己所学技术按模块划分总结而成的笔记,包含了 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.youkuaiyun.com/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"
### 光流法C++源代码解析与应用 #### 光流法原理 光流法是一种在计算机视觉领域中用于追踪视频序列中运动物体的方法。它基于亮度不变性假设,即场景中的点在时间上保持相同的灰度值,从而通过分析连续帧之间的像素变化来估计运动方向和速度。在数学上,光流场可以表示为像素位置和时间的一阶导数,即Ex、Ey(空间梯度)和Et(时间梯度),它们共同构成光流方程的基础。 #### C++实现细节 在给定的C++源代码片段中,`calculate`函数负责计算光流场。该函数接收一个图像缓冲区`buf`作为输入,并初始化了几个关键变量:`Ex`、`Ey`和`Et`分别代表沿x轴、y轴和时间轴的像素强度变化;`gray1`和`gray2`用于存储当前帧和前一帧的平均灰度值;`u`则表示计算出的光流矢量大小。 #### 图像处理流程 1. **初始化和预处理**:`memset`函数被用来清零`opticalflow`数组,它将保存计算出的光流数据。同时,`output`数组被填充为白色,这通常用于可视化结果。 2. **灰度计算**:对每一像素点进行处理,计算其灰度值。这里采用的是RGB通道平均值的计算方法,将每个像素的R、G、B值相加后除以3,得到一个近似灰度值。此步骤确保了计算过程的鲁棒性和效率。 3. **光流向量计算**:通过比较当前帧和前一帧的灰度值,计算出每个像素点的Ex、Ey和Et值。这里值得注意的是,光流向量的大小`u`是通过`Et`除以`sqrt(Ex^2 + Ey^2)`得到的,再乘以10进行量化处理,以减少计算复杂度。 4. **结果存储与阈值处理**:计算出的光流值被存储在`opticalflow`数组中。如果`u`的绝对值超过10,则认为该点存在显著运动,因此在`output`数组中将对应位置标记为黑色,形成运动区域的可视化效果。 5. **状态更新**:通过`memcpy`函数将当前帧复制到`prevframe`中,为下一次迭代做准备。 #### 扩展应用:Lukas-Kanade算法 除了上述基础的光流计算外,代码还提到了Lukas-Kanade算法的应用。这是一种更高级的光流计算方法,能够提供更精确的运动估计。在`ImgOpticalFlow`函数中,通过调用`cvCalcOpticalFlowLK`函数实现了这一算法,该函数接受前一帧和当前帧的灰度图,以及窗口大小等参数,返回像素级别的光流场信息。 在实际应用中,光流法常用于目标跟踪、运动检测、视频压缩等领域。通过深入理解和优化光流算法,可以进一步提升视频分析的准确性和实时性能。 光流法及其C++实现是计算机视觉领域的一个重要组成部分,通过对连续帧间像素变化的精细分析,能够有效捕捉和理解动态场景中的运动信息
微信小程序作为腾讯推出的一种轻型应用形式,因其便捷性与高效性,已广泛应用于日常生活中。以下为该平台的主要特性及配套资源说明: 特性方面: 操作便捷,即开即用:用户通过微信内搜索或扫描二维码即可直接使用,无需额外下载安装,减少了对手机存储空间的占用,也简化了使用流程。 多端兼容,统一开发:该平台支持在多种操作系统与设备上运行,开发者无需针对不同平台进行重复适配,可在一个统一的环境中完成开发工作。 功能丰富,接口完善:平台提供了多样化的API接口,便于开发者实现如支付功能、用户身份验证及消息通知等多样化需求。 社交整合,传播高效:小程序深度嵌入微信生态,能有效利用社交关系链,促进用户之间的互动与传播。 开发成本低,周期短:相比传统应用程序,小程序的开发投入更少,开发周期更短,有助于企业快速实现产品上线。 资源内容: “微信小程序-项目源码-原生开发框架-含效果截图示例”这一资料包,提供了完整的项目源码,并基于原生开发方式构建,确保了代码的稳定性与可维护性。内容涵盖项目结构、页面设计、功能模块等关键部分,配有详细说明与注释,便于使用者迅速理解并掌握开发方法。此外,还附有多个实际运行效果的截图,帮助用户直观了解功能实现情况,评估其在实际应用中的表现与价值。该资源适用于前端开发人员、技术爱好者及希望拓展业务的机构,具有较高的参考与使用价值。欢迎查阅,助力小程序开发实践。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GraysonWP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值