1、Linux
1.1、文件结构
1.1.1、目录树
Linux中,所有的文件与目录都是由根目录开始的。根目录是所有目录与文件的源头, 其他目录与文件从根目录的一个一个的分支下来,这种目录配置方式被称为:目录树(directory tree), 目录树的主要特性如下:
1、目录树的启始点为根目录 (/)
2、每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说,可以利用 Network File System (NFS) 服务器挂载某特定目录等。
3、每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
1.1.2、常用目录
目录 | 用途 |
/bin | 存放常用指令,如cp,ls,kill等 |
/sbin | 系统管理员使用的系统管理指令 |
/home | 存放普通用户的主目录,每个用户都有一个自己的目录,以用户名命名 |
/root | 系统管理员用户主目录 |
/boot | 存放Linux启动时核心文件 |
/lib | 库文件存放目录 |
/etc | 系统管理所需配置文件,如mysql的my.cnf |
/usr | 一些应用程序和文件存放目录,类似Windows下的program files |
/tmp | 存放临时文件 |
/opt | 安装包存放目录 |
/usr/local | 安装后程序存放目录 |
/var | 存放经常被修改的文件,如日志文件 |
/proc | 系统内存映射 |
/sys | 系统相关文件 |
1.1.3、绝对路径与相对路径
在使用中,路径(path)有绝对路径(absolute)与相对路径(relative)两种方法。 这两种文件名/路径的写法依据是这样的:
绝对路径:
由根目录(/)开始写起的文件名或目录名称, 例如 /home/test;
相对路径:
相对于目前路径的文件名写法。 例如 ./home/dmtsai 等等。./表示目录从当前位置开始。即:相对路径是以你当前所在路径的相对位置来表示的。
1.1.4、切换目录常用命令
1、cd ../ 返回上一级目录
2、cd - 返回上一次目录
1.2、网络
1.2.1、配置
1、修改 /etc/sysconfig/network-scripts/ifcfg-eth0中对应内容为:
ONBOOT=yes
//指明在系统启动时是否激活网卡,只有在激活状态的网卡才能去连接网络,进行网络通讯。
BOOTPROTO=static
//静态IP
IPADDR=IP地址
NETMASK=255.255.255.0
//指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码
GATEWAY=网关地址
2、配置DNS
修改 /etc/resolv.conf
nameserver 8.8.8.8
//域名解析服务器,在互联网中把域名转换成为网络可以识别的IP地址
nameserver 8.8.4.4
search localdomain nameserver
//解析失败时会在域名后加上search部分然后再解析
3、重启网络服务
service network restart
1.2.2、常用命令
1、ifconfig
查看用户网络配置。它显示当前网络设备配置。
2、hostname
显示主机名
3、ping
将数据包发向用户指定地址。当包被接收,目标机器发送返回数据包。ping 主要有两个作用:用来确认网络连接是畅通的。
和查看连接的速度信息。
4、telnet
通过 telnet 协议连接目标主机,如果 telnet 连接可以在任一端口上完成即代表着两台主机间的连接良好。
telnet hostname port – 使用指定的端口 telnet 主机名。这通常用来测试主机是否在线或者网络是否正常。
5、netstat
命令 | 含义 |
netstat -nap | grep port | 显示使用该端口的应用程序的进程 id |
netstat -a 或者 netstat –all | 显示包括 TCP 和 UDP 的所有连接 |
netstat –tcp 或者 netstat –t | 显示 TCP 连接 |
netstat –udp 或者 netstat –u | 显示 UDP 连接 |
netstat -g | 显示该主机订阅的所有多播网络。 |
1.3、用户权限
1.3.1、概念
Linux操作系统对多用户的管理是非常繁琐的,所以用组的概念来管理用户就变得简单,每个用户可以在一个独立的组,每个组也可以有零个用户或者多个用户。
Linux系统用户是根据用户ID来识别的,默认ID长度为32位,从默认ID编号从0开始,但是为了和老式系统兼容,用户ID限制在60000以下,Linux用户分总共分为三种,分别如下:
1、root用户 (ID 0)
2、系统用户 (ID 1-499)
3、普通用户 (ID 500以上)
Linux系统中的每个文件或者文件夹,都有一个所属用户及所属组,使用id命令可以显示当前用户的信息,Linux操作系统用户的特点如下:
1、每个用户拥有一个UserID,操作系统实际读取的是UID,而非用户名;
2、每个用户属于一个主组,属于一个或多个附属组,一个用户最多有31个附属组;
3、每个组拥有一个GroupID;
4、每个进程以一个用户身份运行,该用户可对进程拥有资源控制权限;
5、每个可登陆用户拥有一个指定的Shell环境。
1.3.2、管理
每一个文件或者目录的权限,都包含一个用户权限、一个组的权限、其他人权限,例如下:
[root@node1 ~]# ls -l monitor_log.sh
-rw-r--r-- 1 root root 91 May 7 20:21 monitor_log.sh
标红第一个root表示该文件所有者是root用户,第二个root代表该文件的所属的组
第一位表示文件类型,-表示文件,d表示目录;后面每三位为一组。
第一组:2-4位表示文件所有者的权限,即用户user权限,简称u
第二组:5-7位表示文件所有者所属组成员的权限,group权限,简称g
第三组:8-10位表示所有者所属组之外的用户的权限,other权限,简称o
则monito_log.sh文件对应的权限为:root用户具有读和写的权限,root组具有读的权限,其他人具有读的权限。为了能更简单快捷的使用和熟悉权限,rwx权限可以用数字来表示,分别表示为r(4)、w(2)、x(1)。Monitor_log.sh权限可以表示为:644
如果我们想改变某个文件的所有者或者所属的组,可以使用命令chown
如:chown –R test:test monitor_log.sh
1.4、文件权限
1.4.1、概念
Linux权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户或用户组可以对特定文件进行哪些相应的操作。
Linux每个进程都是以某个用户身份运行,进程的权限与该用户的权限一样,用户的权限越大,则进程拥有的权限就越大。
Linux中有的文件及文件夹都有至少拥有三种权限,常见的权限如下所示:
权限 | 对文件影响 | 对目录影响 |
R(读取) | 可读取文件内容 | 可列出目录内容 |
W(写入) | 可修改文件内容 | 可在目录中创建删除内容 |
X(执行) | 可作为命令执行 | 可访问目录内容 |
目录必须拥有 x 权限,否则无法查看其内容 |
1.4.2、管理
修改某个用户、组对文件夹的权限,用命令chmod实现例如下:
1、非二进制方法
(1) 授予用户对hdfs目录拥有rwx权限
chmod –R u+rwx hdfs
(2) 授予组对hdfs目录拥有rwx权限
chmod –R g+rwx hdfs
(3) 授予用户、组、其他人对hdfs目录拥有rwx权限
chmod –R u+rwx,g+rwx,o+rwx hdfs
(4) 撤销用户对hdfs目录拥有w权限
chmod –R u-w hdfs
(5) 撤销用户、组、其他人对hdfs目录拥有x权限
chmod –R u-x,g-x,o-x hdfs
(6) 授予用户、组、其他人对hdfs目录只有rx权限
chmod –R u=rx,g=rx,o=rx hdfs
2、二进制方法
Chmod –R 数值 hdfs
值计算方法为r(4)、w(2)、x(1),所有用户可读可写可执行为:777
1.5、服务
1.5.1、概念
服务指在操作系统中,用以支持各种功能的程序。
1.5.2、管理
指令 | 命令 |
systemctl start 服务名 | 开启服务 |
systemctl stop 服务名 | 关闭服务 |
systemctl status 服务名 | 显示服务状态 |
systemctl restart 服务名 | 重启服务 |
systemctl enable 服务名 | 开机启动服务 |
systemctl disable 服务名 | 禁止开机启动 |
systemctl list-units | 查看运行的服务 |
systemctl list-unit-files | 查看服务开机启动状态 |
systemctl list-dependencies 服务名 | 查看服务依赖关系 |
systemctl mask 服务名 | 冻结服务 |
systemctl unmask 服务名 | 解冻服务 |
2、Shell
2.1、概念
2.1.1、Shell
Shell俗称壳,是指“为使用者提供操作界面”的软件(命令解析器)。
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统程序(用户<—>Shell<—>内核) 。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2.1.2、bash
常见的 Shell 有 sh、bash、csh、tcsh、ash 等,其中bash shell 是 Linux 的默认 shell。
即:bash是shell的一种。
2.1.3、Shell脚本
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量、参数、函数、流程控制等等。它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。这意味着shell基本可以涵盖Linux上可以执行的所有命令。
在系统的终端中输入一条命令,可以立马看到一条或者几条系统回复的信息,其实就是shell在帮我们回复,所以shell可以称之为命令解释器。这种从键盘一输入命令,就可以立马得到相应的回复信息,叫作交互的方式 如果我们的命令或者应用程序不在命令行直接执行,而是通过一个程序文件来执行时,这个程序就被称之为shell脚本。
2.2、用途
目前项目中的Shell脚本主要使用在以下几种场景:
1、人力可以解决但耗费巨大的简单事务
2、需要定期定时执行的任务
3、基于java操作复杂但基于Linux内核能简单完成的事务
4、java程序不能解决的需要顺序调用事务
(这种场景主要出现在java调用linux内核的情况下,比如java程序中调用Linux的文本比较命令,需要比较完成后执行下一步操作,此时java编程不能独立完成这个需求)。
2.3、功能
由于shell基于系统核心的大部分功能来执行程序,所以基本可以执行所有Linux命令,包括增删改查数据库。
2.4、基本语法
2.4.1、变量
2.4.1.1、变量定义
语法格式为:变量名=变量值
shell变量定义的严格语法限制:
- 变量名和等号之间不能有空格
- 变量名首个字符必须为英文字母
- 不能包含标点符号但能够使用下划线(_)
- 不能使用空格
- 不能使用 bash 里的关键字
2.4.1.2、变量类型
类型 | 释义 |
局部变量 | 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量 |
环境变量 | 所有的程序,包括shell启动的程序,都能访问环境变量,有些程 序需要环境变量来保证其正常运行。可以用过set命令查看当前环境变量 |
Shell变量 | 由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell 的正常运行 |
2.4.1.3、变量引用
name=“flink"
echo ${name}
echo $name
引用一个定义过的变量,只要在变量名前面加$即可,变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。如:
echo ${home} town
如果不加{},则会打印变量namehome
2.4.1.4、变量重定义
重新赋值即可:
name=“flink"
echo ${name}
name=“scala"
echo ${name}
2.4.1.5、变量约束
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。
name=“flink"
readonly name
name="scala"
2.4.1.6、变量删除
使用unset命令可以删除变量,变量被删除后不能再次使用,同时unset命令不能删除只读变量。
name=“flink"
unset name
echo $name
2.4.2、传参
在执行Shell脚本时,可以向脚本传递参数。脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推…
$0 表示当前脚本名称。
1、修改test.sh为
#!/bin/bash
echo $1
echo $2
echo $3
2、执行携带参数
[root@node1 ~]# ./test.sh here’s a test
here’s
a
test
2.4.3、特殊字符
字符 | 含义 |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
2.4.4、Shell字符串
单引号字符串中不支持引用变量,任何字符都会原样输出,字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号里可以引有变量,支持转义字符。
name='my name is zaomianbao'
name="my name is zaomianbao"
name_again="\"${name}\""
字符串长度:
name=‘test'
echo ${#name} //执行输出为4
echo ${name:1:3} //执行输出est
2.4.5、Shell数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
array_name=(value1 … valuen)
示例:
usernames=(1 2 33 44 adsd1)
echo ${usernames} //1 默认取usernames[0]
echo ${usernames[1]} //2 输出第二位
echo ${usernames[*]} // 1 2 33 44 adsd1 输出所有
echo ${#usernames[*]} //5 输出长度
2.4.6、运算符
2.4.6.1、数字运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
val=`expr $a - $b`
val=`expr $a \* $b` //*需要转义
val=`expr $b / $a`
val=`expr $b % $a`
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
2.4.6.2、关系型运算符
运算符 | 含义 |
-eq | EQUAL等于 |
-ne | NOT EQUAL不等于 |
-gt | GREATER THAN大于 |
-lt | LESS THAN小于 |
-ge | GREATER THAN OR EQUAL 大于等于 |
-le | LESS THAN OR EQUAL 小于等 |
示例:
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
2.4.6.3、布尔运算符
运算符 | 含义 |
&& | 与 |
|| | 或 |
2.4.6.4、字符串运算符
运算符 | 含义 |
-z | 字符串长度是否为0,为0返回 true |
-n | 字符串长度是否为0,不为0返回 true |
str | 字符串是否为空,不为空返回 true |
#!/bin/bash
a="abc"
b="efg"
if [ -n $a ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
2.4.6.5、文件测试运算符
操作符 | 含义 |
-b file | 文件是否是块设备文件,如果是,则返回 true |
-c file | 文件是否是字符设备文件,如果是,则返回 true |
-d file | 是否是目录,如果是,则返回 true |
-f file | 文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
-g file | 文件是否设置了 SGID 位,如果是,则返回 true |
-k file | 文件是否设置了粘着位(Sticky Bit),如果是,则返回 true |
-p file | 文件是否是具名管道,如果是,则返回 true |
-u file | 文件是否设置了 SUID 位,如果是,则返回 true |
-r file | 文件是否可读,如果是,则返回 true |
-w file | 文件是否可写,如果是,则返回 true |
-x file | 文件是否可执行,如果是,则返回 true |
-s file | 文件是否为空(文件大小是否大于0),不为空返回 true |
-e file | 文件(包括目录)是否存在,如果是,则返回 true |
#!/bin/bash
file="/home/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
2.4.7、流程控制
2.4.7.1、if-else
if condition1
then
//
elif condition2
then
//
else
//
fi
2.4.7.2、case
取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
case 值 in
模式1)
//
;;
模式2)
//
;;
*)
//
;;
esac
2.4.7.3、for
for 变量 in 列表
do
//
done
2.4.7.4、while
while command
do
//
done
2.4.7.5、until
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。
until command
do
//
done
2.4.8、自定义函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。
#!/bin/bash
demo (){
echo “test!"
}
echo "-----函数开始执行-----"
demo
echo "-----函数执行完毕-----"
2.3、示例讲解
#!/bin/bash
cd $1
tablename=$2
user=$3
password=$4
host=$5
db_name=$6
sql=$7
Time=$(date "+%Y%m%d")
source=A
num=1
diff -urNa HFiles/$tablename".txt" CFiles/$tablename".txt" >$tablename".result“
#重命名文件
for x in `find -type f |grep -v -E '\.(COMPLETED|sh|txt|json|todo)$'`
do
var=$(printf "%02d" "$num")
name=$Time$source$var
mv $x $name.todo
done
#更改文件内容
for i in `find -type f |grep 'todo$'`
do
awk '{if(($0~/^(+|-)/)&&($0!~/^((\+\+\+)|(---))/)) print $0}' $i >$name.txt
rm -f $i
plus_num=`awk -F '' '{print $1}' $name.txt |grep -o "+"|wc -l`
minus_num=`awk -F '' '{print $1}' $name.txt |grep -o "-"|wc -l`
mv $name.txt Results
#插入数据库
sql=$7"'$1Results"/$name.txt"',$plus_num,$minus_num,'$db_name','$tablename',SYSDATE(),SYSDATE())"
echo $sql
mysql -h"$host" -u"$user" -p"$password" -D"$db_name" -B -e "$sql“
done
欢迎关注交流: