常用指令
wc指令
- -c参数 只显示bytes数
- -l --lines 显示行数
- -w --words 显示字数
- --version 显示版本信息
- 统计文件行数
[root@localhost ~]# cat test.file
hhh
hhh2
hhh3
[root@localhost ~]# wc -l test.file | awk '{print $1}' #wc统计行号,awk过滤第一列
3
- 统计字数
[root@localhost ~]# cat test.file
hhhh
hhh2
hhh3
[root@localhost ~]# wc -w test.file # h 2 3 共三个
3 test.file
awk 命令
-
统计文件行数
-
使用 awk ‘{print NR}’
awk ‘{print NR}’ 命令可以打印每一行的行号
tail -n 1 拿到倒数第一行的数据[root@localhost ~]# cat test.file hhhh data1 data2 哈 hhh2 hhh3 [root@localhost ~]# awk '{print NR}' test.file |tail -n 1 4
-
使用awk自带的方法
[root@localhost ~]# cat test.file hhhh data1 data2 哈 hhh2 hhh3 [root@localhost ~]# awk 'END{print NR}' test.file 4
-
使用grep 命令
- -c 只打印匹配行的行号
[root@localhost ~]# cat test.file hhhh data1 data2 哈 hhh2 hhh3 [root@localhost ~]# grep -c "" test.file 4
-
-
打印空行行号
[root@localhost ~]# cat test.file hhhh data1 data2 哈 hhh2 hhh3 [root@localhost ~]# cat 统计行号.sh #! /bin/bash num=0 while read line do ((num++)) [ "$line" == "" ] && echo $num done <test.file exit 0 [root@localhost ~]# bash 统计行号.sh 2
if 语句
基本语法
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
常用参数
常用的:
[ -a FILE ] 如果 FILE 存在则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
不常用的:
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。
-
判断目录$direction是否存在,若不存在,则新建
if [ ! -d "$direction" ];then mkdir "$direction" fi
-
判断普通文件$file是否存在,若不存在,则新建一个
if [ ! -f "$file" ];then touch "$file" fi
-
判断 $file 是否存在且具有可执行权限
if [ ! -x "$file" ];then chomd +x "$file" fi
-
判断变量$file 是否有值 (-n 即 not null 时为空)
if [ ! -n "$file" ];then echo " $file is empty" fi
-
判断data1,data2是否相等
if [ "$data1" == "$data2" ];then echo "$data1 eq $data2" else echo "not eq" fi
-
数值的比较
if [ "$num" -gt "150" ];then echo "$num is biger than 150" fi
-
除root 用户
if [ "${whoami}" != 'root'];then echo "你没有权限" fi [ "${whoami}" != 'root' ]&&(echo "You have no permission")
for语句
[Linux For循环常用脚本案例及使用事项 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/612302964#:~:text=1 for 循环语法: for variable in values%3B do,命令输出必须使用 %24 (command) 或反引号来括起来 6 在执行循环体时,必须使用 done 关键字来结束循环体)
- 使用for语句遍历一个目录所有文件
#!/bin/bash
for file in /path/to/directory/*
do
echo $file
done
mysql 数据库备份
#!/bin/bash
user=root
pass=root
backfile=/root/mysql/bachup
[! -d $backfile ] && mkdir -p $backfile
cmd="mysql -u${user} -p${pass}"
dump="mysqldump -u$user -p$pass"
dblist=`$cmd -e "show database;" 2>/dev/null | sed 1d |egrep -v '_schema|mysql'`
echo "需要备份的数据库列表:"
echo #dblist
echo "开始备份"
for db_name in $dblist
do
printf '正在备份数据库:%s ' ${db_name}
$dump ${db_name} >/dev/null | gzip > ${backfile}/${db_name}_${date+%m%d}.sql.gz
printf ",备份完成\n"
done
echo "全部备份完成!"
mysql 分库分表备份
echo $dblist
echo "开始备份"
for db_name in $dblist
do
printf '正在备份数据库:%s\n' ${db_name}
tables=`$cmd -e"use ${db_name};show tables;" 2>/dev/null|sed 1d`
for j in $tables
do
printf '正在备份数据库 %s 表 %s ' ${db_name} ${j}
$dump -B --database $db_name --tables $j 2>/dev/null > ${backfile}/${db_name}-${j}-`data +%m%d`.sql
printf ',备份完成'
done
printf '数据库 %s 备份完成\n '${db_name}
done
echo "全部备份完成!"
shell 归档文件
每天凌晨两点准时更新
#! /bin/bash
# 判断输入参数个数是否为1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)
#获取当前日期
DATE = $(date +%y%m%d)
#定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
#开始归档目录文件
echo "开始归档"
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo "归档成功"
else
echo "归档出现问题"
fi
exit
#查看系统当中的定时任务
crontab -l
# 添加定时任务
crontab -e
awk 统计一行文本当中长度小于8的字符串
#!/bin/bash
awk -F " " '{for(i=1;i<=NF;i++){
if(length($i)<8) {
print $i
}
}
}' nowcoder.txt
exit 0
xargs 命令
xargs 用作替换工具,读取输入数据重新格式化后输出。
多行输入单行输出
[root@localhost myshell]# cat test.txt
a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
[root@localhost myshell]# cat test.txt|xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
- -n 选项多行输出
(-n num 后面加次数,表示命令在执行的时候一次用的元素个数,默认是用所有的)
[root@localhost myshell]# cat test.txt |xargs -n 3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
[root@localhost myshell]#
- -d 选项可以自定义一个定界符
(delim 即分隔符,默认的xargs的分隔符是回车,这里是修改xargs的分隔符)
[root@localhost myshell]# echo "aXbXcX" | xargs -d"X"
a b c
[root@localhost myshell]#
source 和 . 和 sh 和 ./ 的区别
参考博客 https://www.cnblogs.com/FengZeng666/p/15323028.html
在linux上执行shell脚本,一般有以下几种方法
source myshell.sh
. myshell.sh
bash myshell.sh
./myshell.sh
source 和 .
source 和 . 是等效的 都是在当前shell当中执行一个shell脚本,即不会产生子shell
使用type souce 和 type . 可以看出它们都是内建命令
使用help souce 和help . 也可以看到两个命令的模式一模一样,使用这两个命令是等价的
[root@localhost ~]# type source
source is a shell builtin
[root@localhost ~]# type .
. is a shell builtin
[root@localhost ~]# help source
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
[root@localhost ~]# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
bash filename
sh filename 是另起一个shell进程来执行脚本,在子shell脚本当中执行里面的语句,该子shell继承父shell的环境背景(但不会继承普通变量,也就是没有被export的变量)
./filename
./不仅可以用来执行shell脚步,是可以用来用来执行一切可执行文件的方法,./和 . 并不相同,使用./ 执行的文件必须是可执行文件,文件必须有X权限
./ 也是另起一个shell进程来执行脚本