Linux基础(五)
1.常见的shell命令
1.管道命令
利用linux所提供的管道符"|"将两个命令隔开,管道符左边命令的输出就作为管道符右边命令输入
eg:ls -al|grep Music
2.find命令
在一个目录(子目录)中搜索文件,可以指定一些匹配条件,按文件名,文件类型,用户甚至是时间戳查找文件
命令格式:
find [path] [-option]
-path:find命令所查找的目录路径
-print:将匹配的文件输出到标准输出
-size:匹配文件大小
find ./ -size 0 显示文件大小为0的文件
-name 按照文件名查找文件
find /-name demo 在/目录及其子目录下查找名字为demo文件
-perm 按照文件权限来查找文件
find . -perm 755 [-print]
-uer 按照文件所有这来查找文件
find ~ -user root [-print] 在~home目录中查找文件爱呢属主为root的文件
-group 按照文件所属组来查找文件
find / -group root [-print] 在/目录下查找属于root用户组的文件
-mtime -n +n
按照文件的更改时间来查找文件,-n表示更改时间距现在n天以内,+n表示文件更改时间距现在n天以前
find / -mtime -5 -print 在系统根目录下查找更改时间在5日以内的文件
find / -mtime +3 -print 在/目录下查找更改时间在3日以前的文件
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/grouops中不存在
find / -nogroup -print
-type 查找某一类型的文件
b 块设备文件
d 目录
c 字符设备文件
p 管道文件
l 符号链接文件
f 普通文件
find /etc -type d -print 在/ect下查找所有的目录
find . ! -type d -print 在当前目录下查找目录以外的所有类型的文件
find /etc -type | -print 在/etc目录下查找所有的符号链接文件
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
find . -size +1000c -print 在当前目录下查找文件长度大于1000字节的文件
find -name “20180921.txt” | xargs grep “2639090”
3.sed命令
非交互式文本处理工具
sed [option] [action] [filename]
option:
h或–help 显示帮助
n仅显示script处理后的结果
V或-version 显示版本信息
e 允许输入数据应用多条sed命令进行编辑
f 直接将sed的动作写在一个文件内 -f filename则可以运行 filename内的sed动作
sed 之action
s 字符串替换
i 插入
d 删除
a 追加
c 替换
p 打印指定的输出行
eg: 创建:demo.txt
sed “s/wuxinhadoop/hadoop/g” demo.txt
s 表示替换命令
/wuxinhadoop/表示匹配wuxinhadoop
/hadoop/表示把匹配替换成hadoop
/g 表示一行上的替换所有匹配
如果要写回文件可以使用重定向
sed “s/wuxinhadoop/hadoop/g” demo.txt > demo2.txt
如果想修改源文件内容使用参数 -i
sed -i “s/wuxinhadoop/hadoop/g” demo.txt
只替换三行
sed “3s/wuxinhadoop/hadoop/g” demo.txt
替换第一到第二行的文本
sed “1,2s/wuxinhadoop/hadoop/g” demo.txt
替换每一行的第一个l
sed “s/l/L/1” demo.txt
替换每行第二个l
sed “s/l/L/2” demo.txt
替换第一行的第三个及以后的o
sed “1s/o/O/3g” demo.txt
多个匹配 如果需要一次替换多个模式
第一种方式 sed ‘s/l/L/1;s/o/O/3g’ demo.txt
第二种方式 sed -e ‘s/l/L/1’ -e ‘s/o/O/3g’ demo.txt
a动作和i动作
a动作就是append i动作就是Insert 它们是用来添加行的
使用n i 添加一行,在第一行添加
sed “1 i hi word” demo.txt
使用n a 追加一行,在第一行后面追加
d 动作删除匹配行 sed “/hdfs/d” demo.txt
4.grep命令 全面搜索正则表达式并把行打印出来
grep [options] pattern [file]
-n 同时显示匹配行上下的n行
grep -2 pattern filename同时显示匹配行的上下2行
grep
-b --byte-offset 打印匹配行前面打印改行所在的块号码
-c --count 只打印匹配的行数,不显示匹配的内容
-f File,–file=File 从文件中提取模板,空文件中包含0个模板,所以什么都不匹配
-h --no-filename 当搜索多个文件时,不显匹配文件名前缀
-i --ignore-case 忽略大小写差别
-q --qiuet 取消显示,只返回退出状态,0则表示找到了匹配的行
-n --line-number 在匹配的行前面打印行号
-v --revert-match 反检索,只显示不匹配的行
5.tail命令 把某个档案文件的最后几行显示到终端上,如果该文件有更新,tail会自动刷新,确保看到最新的文件内容
tail [-F] [-c Number| -n Number |-m Number|-b Number|-k Number][File]
-F 该参数用于监视File文件增长
-c Number从Number 字节位置读取指定文件
-n Number 从Number 行位置读取指定文件
-m Number 从Number 字符位置读取指定文件,比如文件中包含中文字,如果指定-c参数可能导致截断,但使用-m则会避免该问题
-b Number 表示的512字节块位置读取指定文件
-k Number 表示1KB块位置读取指定文件
file 指定操作的目标文件名
当涉及到number 如果不指定,默认显示10行,Number前面可使用正负号,表示该偏移从顶部还是尾部开始计算
eg:
tail -F filename
tail -n 20 finame 显示filename最后20行
tail -n +20 filename 不包含前19行,从第20行开始显示
6.sort 默认情况下按照字符排序
-n 按照数值排序
-u 不出现重复的行
-t 指定分段的符号
-k 指定的第几个段
-r 逆向排序
sort -r demo > d1
sort -t “.” -k 4 demo 对文件进行指定分隔符,并对第四个字段排序
7.cut 负责剪切数据用的
cut [-option] filename
-b 字节
-c 字符
-f 要提取第几列
-d 按指定分隔符分隔列
cut -b 2 demo 每一行第二个字节
cut -b 5-7 demo 每一行第五个到第七个字节
cut -b 9- demo 第九个字节之后
cut -b -9 demo 第九个字节之前
cut -d . -f 2 demo 以点为分隔符获取第二个字段
cut -d . -f 1 demo 以点为分隔符获取第一个字段
8.history 显示执行过的命令
history 5 显示执行过的上5条命令
!! 运行上一条命令
!88 /test 运行第88条命令并子啊命令后面加上/test
!ls 运行上一个ls命令
!ls:s/CF/l 运行上一个ls命令,其中把CF替换成l
fc 编辑并运行上一个历史命令
fc 66 编辑并运行第66个历史命令
fc -e /usr/bin/vim 66 使用vim 编辑第66个命令并运行
搜索历史命令
使用ctrl+r搜索 历史中的字符串,重换ctrl+r可以在历史命令列表中不断的向前搜索包含字符串的命令,回车就会执行查找的命令
清空历史命令 history -c
二、shell高级
1.注意事项
1.命令的执行是从上而下,从左而右执行
2.空白行也被忽略掉,tab被视为空格
3.如果读取一个enter符号(CR),就尝试开始执行该命令
4.#后面内容为注释
2.执行脚本三种方式
1.直接执行 ./shell.sh 必须具备可执行权限
2.source 执行 source shell.sh
3.bash执行 bash shell.sh
sh shell.sh
3.数值运算
格式:$((运算内容))
#!/bin/bash
User inputs 2 integer numbers; program will cross these two
read -p "first number: " num1
read -p "second number: " num2
total=$(($num1*$num2))
echo -e "\nThe result of $num1 x $num2 is ==> $total"
exit 0
4.test判断命令
test -e demo.txt
-e 该文件是否存在
-f 该文件是否存在且为文件(file)
-d 该文件名是否存在且为目录(directory)
-b 该文件是否存在且为一个block device装置
-c 该文件是否存在且为一个character device装置
-S 该文件是否存在且为一个 Socket文件
-p 该文件是否存在且为一个 FIFO文件
-L 该文件是否存在且为一个链接文件
判断文件权限
-r 检查该文件是否存在且具有可读权限
-w 检查该文件是否存在且具有可写权限
-x 检查该文件是否存在且具有可执行权限
-s 检查该文件是否存在且为非空文件
-u 检查该文件是否存在且具有SUID的属性
-g 检查该文件是否存在且具有SGID的属性
判断字符串
test -z String 判断字符串是否为空?若string为空字符串则为true
test -n string 判断字符串是否为空?若string为空字符串则为false
test str1=str2 或 == 判断str1是否等于str2 若相等,则返回true
test str1!=str2 判断str1 是否不等于str2若相等,则返回false
两个文件之间比较
-nt 判断file1 是否比file2 新
-ot 判断file1 是否比 file2 旧
-ef 判断两个文件是否为同一个文件
5.判断符号[]基本和test相同
1. !=和等等于用于比较字符串
2.整数比较只能使用-eq,-gt,ge,lt,le这种形式
3.[]中的逻辑与和逻辑或使用-a和-o 表示
4.&&,||,<和>操作符如果出现在[]结构中的话会报错
6.shell script参数
/path/to/scriptname arg1 arg2 arg3 arg4
$0 $1 $2 $3 $4
-$0 代表脚本程序本身
-$1,$2…代表后面的第一个参数 第二个参数 等等
- $ # 代表后接的参数个数,以上边为例,这里显示为4
- $ @ 代表 “$1” “$2” “$3” “$4"每个变量是独立的
- $ * 代表”$1 $2 $3 $4"
功能
0
程
序
文
件
名
0 程序文件名
0程序文件名 # 共有几个参数
若参数的个数小于(lt)2则告知使用者参数数量太少
全部参数内容是什么 $ @
第一个参数 $1
第二个参数 $2
shift 造成参数变量号码偏移
7.条件判断语句
if [条件判断]
then
//命令
fi
if[条件判断]; then 条件成立执行,命令;
fi 将if 反过来写就成为fi 结束if语句
2.双分支结构
if [ 条件1 ]; then 条件一成立执行,指令集1
else 条件1不成立执行指令集2 fi
3.多分支结构
if [ 条件1 ]; then 条件1成立,执行指令1
elif [ 条件2 ]; then 条件2成立 执行指令集2
else 条件都不成立 执行指令集3 fi
4.case结构条件语句
case $变量名称 in “值1”)
程序段1
;;
“值2”)
程序段2
;;
*)
exit 1
;;
esac
eg:
#!/bin/bash
read -p "please input a int ([1,7])": num
case $num in 1)
echo "Mon"
;;
2)
echo "Tue"
;;
3)
echo "Wed"
;;
4)
echo "Thu"
;;
5)
echo "Fir"
;;
[6-7])
echo "weekday"
;;
*)
echo "input [1,7]"
exit 1
esac
exit 0
8.函数
function fname(){
命令
}
9.shell script
sh [-nx] scirpt.sh
-n 不执行script 仅查询语法问题
-v 在执行script前,先将script 的内容输出到屏幕上
-x 将使用到的script内容显示到屏幕上,这是很有用的参数!!
10.循环语句
1.不定循环
while do done,until do done
2.固定循环
for … do done
3.while
while [ condition ] ; do
命令
done
或者
while [ condition ]
do
命令
done
4.until
util [ condition ];do
命令
done
或者
until [ condition ]
do
命令
done
eg:
#!/bin/bash
i=0
until [ $i -gt 5 ]
do
let square=i*i
echo "$i*$i=$square"
let i++
done
5.for循环
for…do…done循环
语法
for 变量名 in 变量取值列表
do
命令
done
提示:在此结构中"in变量取值列表"可省略,省略时相当乣使用for i in “$@”
输出1-5:
1.for循环
for num in 5 4 3 2 1
do
echo $num
done
2.大括号方法
echo {1…5}
3.使用seq -s 分隔符 起始 不长 终点
seq -s " " 5 -1 1
4.课件分发
vim send.sh
#!/bin/bash
for ip in `cat /root/ips.txt`
do
scp/root/epel.rpm root@${ip}:/root
Done
esc:->wq->chmod777 send.sh
文件ips.txt内容:
192.168.80.10
192.168.80.90
11.定时任务
分 小时 日 月 星期 命令
10 0-23 1-31 1-12 0-6 command(取值范围,0表示周日一般一样对应一个任务)
几个特殊符号的含义:
"*"代表取值范围内的数字
"/“代表"每”
"-"代表从某个数字到某个数字
“,” 分开几个离散的数字
eg:
*/1 * * * * root /home/day05/sh/send.sh
如果没有生效,解决办法:首先得确定,脚本写的是否正确,shell脚本是否拥有执行权限。一切正常还不能执行的话,就用以下方法:使root用户的crontab生效 crontab-u root /var/spool/cron/root
重启crontab服务 service crondrestart
crontab -l 查看定时任务
crontab -e 编辑定时任务
命令参数:
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。