文章目录
- 1.系统变量
- 2.变量赋值
- 3.特殊变量
- 4.运算符
- 5.条件判断
- 6.流程控制
- 7.read
- 8.系统函数
- 9.自定义函数
- 10.常用命令
- 11.cut
- 12.sed
- 13.awk
- 14.sort
- 15.使用Linux命令查询file1中空行所在的行号
- 16.求和
- 17.Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
- 18.用shell写一个脚本,对文本中无序的一列数字排序
- 19.请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称
- 20.用sed修改test.txt的23行test为tset
- 21.查看/test.txt第25行第三列的内容
- 22.删除test.txt的最初三行
- 23.脚本编程:求100内的质数。
- 24.晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令
- 25.编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
- 26.如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
- 27.在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现
- 28.在shell环境如何杀死一个进程?
- 29.在shell环境如何查找一个文件?
- 30.将A 、B、C目录下的文件A1、A2、A3文件,改名为AA1、AA2、AA3.使用shell脚本实现。
- 31.把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell”
- 32.编写shell实现自动删除50个账号功能,账号名为stud1至stud50
- 33.请用Iptables写出只允许10.1.8.179 访问本服务器的22端口。
- 34.有文件file1
- 35.假设有一个脚本scan.sh,里面有1000行代码,并在vim模式下面,请按照如下要求写入对应的指令
- 36.找出系统内大于50k,小于100k的文件,并删除它们。
- 37.linux下面的sed和awk的编写
- 38.crontab [详情点击查看](https://blog.csdn.net/xinyflove/article/details/83178876)
- 39.统计nginx日志中的ip访问次数
- 40.重定向
- 41.2>&1
1.系统变量
- $HOME:当前用户家目录
- $PWD:获取路径
- $SHELL:当前shell
- $USER:当前用户
2.变量赋值
- a=1 等号两边不能有空格
- unset a 取消赋值
- readonly b=2 只读赋值,不能unset,机器重启自动消失
- 变量无法进行运算,默认都是字符串 c=1+1 相当于c=“1+1”
- 空格需要用单引号或者双引号扩起来
- 可以利用export c将局部变量提升为全局变量,然后在shell脚本中引用。
3.特殊变量
- $n:用来接收输入参数,n代表第几个参数
echo "第一个参数:$1"
echo "第二个参数:$2"
命令行输入:sh test1.sh 11 22
第一个参数:11
第二个参数:22
- $#:获取输入参数个数
- ∗ : 当 被 双 引 号 包 着 时 , 获 取 所 有 参 数 , 作 为 一 个 整 体 , 不 包 时 和 *:当被双引号包着时,获取所有参数,作为一个整体,不包时和 ∗:当被双引号包着时,获取所有参数,作为一个整体,不包时和@一样
- $@:获取所有参数,每个参数区分对待,加引号后可用于for循环,是个list
- $?:验证上一条命令是否正确执行,正确执行则返回0,非0为失败或者否
4.运算符
-
“ ( ( 运 算 式 ) ) " 或 " ((运算式))" 或 " ((运算式))"或"[运算式]”
-
expr 运算式 #运算式中运算符前后有空格,多步运算采用多层expr和`
eg: 计算(2+3)*4:
expr `expr 2 + 3` \* 4
- 乘法: “\*”
- let:BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。
如果表达式中包含了空格或其他特殊字符,则必须引起来。
eg:let a=5+4
5.条件判断
- 两个整数之间比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal)也可用来字符串相等比较 (等价于=或==)
-gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
- 按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
- 按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并是一个目录(directory)
- 逻辑关系
&&:与(and)
||:或(or)
- 常识
(1) [ condition ] 条件前后都有空格
(2) 非空即为True
6.流程控制
- if
if [ 条件判断式 ];then
程序
else
程序
fi
# 或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
- case
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
- for
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值1 值2 值3…
do
程序
done
- while:条件为真执行程序,直到条件为假退出
while [ 条件判断式 ]
do
程序
done
- until:条件为假执行程序,直到条件为真退出
until [ 条件判断式 ]
do
程序
done
7.read
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
8.系统函数
- basename:删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename /Users/m/code/test.txt
test.txt
basename /Users/m/code/test.txt .txt
test
- dirname:获取文件绝对路径
dirname /Users/m/code/test.txt
/Users/m/code
9.自定义函数
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
10.常用命令
- which:显示对应的命令所在的路径 eg:which ls
- whereis:显示对应的命令所在的路径和帮助文档路径 eg:whereis ls
- more:分屏显示文件信息,只能向下滑动,不能向上滑动(mac可以) eg:more filename
- less:分屏显示文件信息,可以能向下和向上滑动 eg:less filename
- head:显示头部信息,默认10行,-n参数可以指定行数 eg:head -n 5 filename
- tail:显示尾部信息,默认10行,-n参数可以指定行数,-f 跟踪文件末尾变化 eg:tail -F filename
- tree:树形显示目录结构,不是系统自带,需要安装
- wc:统计行数,单词数,文件大小,-l参数:行数,-w参数:单词数,-c参数:字节数 eg:wc -l filename
- du:查看当前文件夹下占用磁盘空间信息 eg:du -sh *
- df:查看当前磁盘占用状况 eg:df -h
- whoami:获取当前用户名
- ln
硬链接:将多个文件指向底层磁盘块同一个地址,修改一个,其他链接都改变
eg:ln a.txt b.txt #建立b.txt到a.txt的硬链接
加-s参数:软链接,不会增加链接基数,相当于创建了一个快捷方式,
改动软链接也会改动底层磁盘数据
删除硬链接:unlink或者rm
- chmod:chmod [u|g|o|a] [+|-] [r|w|x] filename 等价于 chmod 权限数字 filename
drwxr-xr-x
第一位为文件类型,d为文件夹,-为普通文件,l为符号连接,b为块设备,c为字符设备,p为管道设备,s为本地套接字
后边每三位为一组,分别代表:当前用户对次文件的权限,当前组对次文件的权限,其他用户对次文件的权限
r:可读,w:可写,x:可执行
可有八进制数字代替,然后转化尾10进制
rwx:111 --> 7
r-x:101 --> 5
所以drwxr-xr-x(755)的含义是:当前为文件夹,当前用户对此文件夹有可读可写可执行权限
当前组的用户对此文件夹有可读可执行权限
其他用户对此文件夹有可读可执行权限
- chown:sodo chown 用户[:组] filename
- chgrp:sudo chgrp 组 fliename
- find
查找文件 find dir [option] 内容
-name:按照名字查找
-type:按类型查找,类型上边13的中第一位
-size:按大小查找,eg:find dir -size +1M -size -5M #查找大于1MB并且小于5M的文件,不写加减号为近似等于
-maxdepth:查找最深路径,放参数位最前边
-exec ls -l {} \;:显示查找到的详细信息 eg:find ./ -maxdepth 1 -size +1k -exec ls -l {} \;
exec会直接将全部符合条件数据传递给后边指令,会造成内存溢出,可以采用xargs,xargs会前边的查找结果分成若干个块输出给后边指令
eg:find ./ -maxdepth 1 -size +1k | xargs ls -l
- grep
查找文件内容行 grep [option] 内容 filenane
-n:显示行数
-r:递归子目录
-v:排除内容
-A:显示后边多少行
-B:显示前边多少行
-C:显示前后多少行
-i:忽略大小写
eg:grep -r LinkList algorithm/
- man:帮助命令,查看命令使用方法
- date:查看日期 eg:date +"%Y%m"
time:统计后续指令运行需要的时间,eg:time top - alias:重命名命令,可以写入到~/.bashrc eg:alias ll=‘ls -rlt’
unalias:删除重命名 eg:unalias ll - free:命令显示系统内存的使用情况
-h:适合人类查看
-s 数字:间隔指定秒追踪查看 - printf
用法:printf 格式 参数
eg:printf "姓名:%s\n身高:%dcm\n体重:%dkg\n" "小明" "180" "75"
- rpm
用法:rpm [参数] 包名
参数:
-a:查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-c:只列出组态配置文件,本参数需配合"-l"参数使用;
-d:只列出文本文件,本参数需配合"-l"参数使用;
-e<套件档>或--erase<套件档>:删除指定的套件;
-f<文件>+:查询拥有指定文件的套件;
-h或--hash:套件安装时列出标记;
-i:显示套件的相关信息;
-i<套件档>或--install<套件档>:安装指定的套件档;
-l:显示套件的文件列表;
-p<套件档>+:查询指定的RPM套件档;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R:显示套件的关联性信息;
-s:显示文件状态,本参数需配合"-l"参数使用;
-U<套件档>或--upgrade<套件档>:升级指定的套件档;
-v:显示指令执行过程;
-vv:详细显示指令执行过程,便于排错。
eg:rpm -ql tree
- yum
含义:和rpm区别:rpm是包安装管理工具,并不包括下载
yum将rpm二次封装,并集成下载功能,等同于Ubuntu上得apt-get
用法:yum [options] [subcommand] [package ...]
eg:yum install php53 #安装php5.3
yum update #全部更新
yum list #列出所有可安装的程序包
yum remove php53 #删除php53
- watch
用法:watch(选项)(参数)
参数:
-n # 或--interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。
-d # 或--differences 用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。
-t # 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。
-h, --help # 查看帮助文档
eg:
watch -n 1 -d netstat -ant # 命令:每隔一秒高亮显示网络链接数的变化情况
watch -n 1 -d 'pstree|grep http' # 每隔一秒高亮显示http链接数的变化情况。 后面接的命令若带有管道符,需要加''将命令区域归整。
watch 'netstat -an | grep:21 | \ grep<模拟攻击客户机的IP>| wc -l' # 实时查看模拟攻击客户机建立起来的连接数
watch -d 'ls -l|grep scf' # 监测当前目录中 scf' 的文件的变化
watch -n 10 'cat /proc/loadavg' # 10秒一次输出系统的平均负载
watch uptime
watch -t uptime
watch -d -n 1 netstat -ntlp
watch -d 'ls -l | fgrep goface' # 监测goface的文件
watch -t -differences=cumulative uptime
watch -n 60 from # 监控mail
watch -n 1 "df -i;df" # 监测磁盘inode和block数目变化情况
- nohup
功能:用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
用法:nohup Command [ Arg … ] [ & ]
参数:
Command:要执行的命令。
Arg:一些参数,可以指定输出文件。
&:让命令在后台执行,终端退出后命令仍旧执行。
eg:nohup python /root/test.py & 2>&1
2>&1:将标准错误2重定向到标准输出&1
- export
功能:用于设置或显示环境变量,仅对当前shell有效
用法:export [-fnp][变量名称]=[变量设置值]
参数:
-f 代表[变量名称]中为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
eg:export var="good"
- unset
功能:删除shell变量
用法:unset [-fv][变量或函数名称]
参数:
-f 仅删除函数。
-v 仅删除变量。
eg:unset -v var
- type
功能:显示指定命令的类型,有如下种类
alias 别名
keyword 关键字,Shell保留字
function 函数,Shell函数
builtin 内建命令,Shell内建命令
file 文件,磁盘文件,外部命令
unfound 没有找到
用法:type [参数] 命令
参数:
-a 可以显示所有可能的类型,比如有些命令如pwd是shell内建命令,也可以是外部命令。
-p 只返回外部命令的信息,相当于which命令。
-f 只返回shell函数的信息。
-t 只返回指定类型的信息。
eg:type -a type
- uptime
功能:查看系统负载及运行概况
用法:uptime
eg:uptime >> 17:33:44 up 492 days, 5:08, 9 users, load average: 0.57, 0.82, 1.07
当前时间 [ 系统运行时间 ] [系统平均负载 5分钟 10分钟 15分钟]
平均负载:指在特定时间间隔内运行队列中的平均进程数。
- top
功能:实时显示 process 的动态
用法:top [参数]
参数:
d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式,将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
n : 更新的次数,完成后将会退出 top
b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内
eg:top -c
可以在top时,按大些字母P以占cpu大小排序,按大写字母M以占内存大小排序
- sysstat:系统状态
vmstat:
mpstat:提供单个处理器或多个处理器相关数据
iostat:提供CPU使用率及硬盘吞吐效率的数据
pidstat: 关于运行中的进程/任务、CPU、内存等的统计信息
sar:工具负责收集、报告并存储系统活跃的信息
- ipcs
功能:系统进行进程间通信(IPC)的时候,可用的方式包括信号量、共享内存、消息队列、管道、信号(signal)、套接字
使用IPCS可以查看共享内存、信号量、消息队列的状态
用法:ipcs
参数:
ipcs -m 查看系统共享内存信息
ipcs -q 查看系统消息队列信息
ipcs -s 查看系统信号量信息
ipcs [-a] 系统默认输出信息,显示系统内所有的IPC信息
ipcs -c 查看IPC的创建者和所有者
ipcs -l 查看IPC资源的限制信息
ipcs -p 查看IPC资源的创建者和使用的进程ID
ipcs -t 查看最新调用IPC资源的详细时间
ipcs -u 查看IPC资源状态汇总信息
ipcs -l --human 以人类可以阅读的方式显示size
34.ipcrm
功能:删除ipcs中显示的ipc资源
参数:
ipcrm -M shmkey 移除用shmkey创建的共享内存段
ipcrm -m shmid 移除用shmid标识的共享内存段
ipcrm -S semkey mkey创建的信号量
ipcrm -s semid id标识的信号量
ipcrm -Q msgkey msgkey创建的消息队列
ipcrm -q msgid 移除用msgid标识的消息队列
- lsof
功能:查看进程打开的文件的工具
参数:
-a 指示其它选项之间为与的关系
-c <进程名> 输出指定进程所打开的文件
-d <文件描述符> 列出占用该文件号的进程
+d <目录> 输出目录及目录下被打开的文件和目录(不递归)
+D <目录> 递归输出及目录下被打开的文件和目录
-i <条件> 输出符合条件与网络相关的文件
-n 不解析主机名
-p <进程号> 输出指定 PID 的进程所打开的文件
-P 不解析端口号
-t 只输出 PID
-u 输出指定用户打开的文件
-U 输出打开的 UNIX domain socket 文件
-h 显示帮助信息
-v 显示版本信息
eg:lsof -i:22 #查看22号端口运行的程序信息
- strace
功能:strace常用来跟踪进程执行时的系统调用和所接收的信号。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
参数:
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column 设置返回值的输出位置.默认 为40.
-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的 系统调用
-e trace=ipc 跟踪所有与进程通讯有关的系统调用
-e abbrev=set 设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指 定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出 的数据.例如:
-e write=set 输出写入到指定文件中的数据.
-o filename 将strace的输出写入文件filename
-p pid 跟踪指定的进程pid.
-s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username 以username 的UID和GID执行被跟踪的命令
eg:strace -o output.txt -T -tt -e trace=all -p 28979
跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),
最后将记录结果存在output.txt文件里面。
- chattr
功能:用于改变文件属性
用法:chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]
参数:
-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-v<版本编号> 设置文件或目录版本。
-V 显示指令执行过程。
+<属性> 开启文件或目录的该项属性。
-<属性> 关闭文件或目录的该项属性。
=<属性> 指定文件或目录的该项属性。
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。
eg:chattr +i /etc/resolv.conf #防止resolv.conf文件被更改
使用lsattr查看文件属性
- uniq
功能:用于检查及删除文本文件中重复出现的行列
用法:uniq [参数] filename
参数:
-c或--count 在每列旁边显示该行重复出现的次数。
-d或--repeated 仅显示重复出现的行列。
-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
-u或--unique 仅显示出一次的行列。
-w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
eg:sort testfile1 | uniq -c #输出唯一值的排序
uniq -d testfile # 找出文中重复行
- seq
功能:是一个序列的缩写,主要用来输出序列化的东西
用法:
seq [选项]... 尾数
seq [选项]... 首数 尾数
seq [选项]... 首数 增量 尾数
参数:
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同【自动补位】
eg:
[ user_00@ ~]$ seq -s '#' 5
1#2#3#4#5
[ user_00@ ~]$ seq -s '#' 5 8
5#6#7#8
[ user_00@ ~]$ seq -s '#' 5 2 10
5#7#9
- tac
功能:和cat顺序相反
用法:tac filename
eg:
[ user_00@ ~]$ cat test
1234
abcd
[ user_00@ ~]$ rev test
4321
dcba
[ user_00@ ~]$ tac test
abcd
1234
- comm
功能:对比两个已经排过序的文件
用法:comm [-123] filename1 filename2
参数:
-1 不显示只在第 1 个文件里出现过的列。
-2 不显示只在第 2 个文件里出现过的列。
-3 不显示只在第 1 和第 2 个文件里出现过的列。
eg:comm filename1 filename2 # 输出的第一列只包含在filename1中出现的列,第二列只包含在filename2中出现的列,第三列两个文件都包含的列。
各列是以制表符 \t 作为定界符。
- paste
功能:用于合并文件的列
用法:paste [-s][-d <间隔字符>][文件...]
参数:
-d<间隔字符>或--delimiters=<间隔字符> 用指定的间隔字符取代跳格字符。
-s或--serial 串列进行而非平行处理。
eg:paste testfile testfile1
- iptables
功能:完成封包过滤、封包重定向和网络地址转换(NAT)等功能
用法:iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
参数:
-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
eg:
iptables -A FORWARD -s 192.168.1.11 -j REJECT # 拒绝转发来自192.168.1.10主机的数据
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT # 允许转发来自192.168.0.0/24网段的数据
- kill
功能:可将指定的信息送至程序。默认不加参数的信号为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序
用法:kill [信号|信号名称] 进程号 或 kill [-l <信息编号>]
参数:
-KILL 强制杀死进程
-HUP 让进程挂起,睡眠;
-9 彻底杀死进程
-term 即位默认,正常的退出进程
eg:kill -u hou #杀死所有用户hou的进程
kill -9 1234 #彻底杀死1234进程
46.netstat
查看网络链接状态
47.ps Process Status
查看linux进程状态
11.cut
cut -d " " -f 1 cut.txt
参数 | 功能 |
---|---|
-f | 列号,提取第几列, 3-表示取第三列到最后的所有列 |
-d | 分隔符,按照指定分隔符分割列 |
12.sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容。
处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed [选项参数] ‘command’ filename
选项参数
命令 | 功能 |
---|---|
e | 用于多command时使用 |
n | 输出指定行 |
command命令参数
命令 | 功能 |
---|---|
a | 新增,a的后面可以接字串,在下一行出现 |
d | 删除包含指定字符串的行 |
s | 查找替换 |
q | 打印指定行数后退出 |
p | 打印指定行 |
# sed.txt 文件内容
hou yao
yu li
ming jun
[ user_00@ ~/code]$ sed '2a mei nv' sed.txt
# 在第二行后添加mei nv后输出
hou yao
yu li
mei nv
ming jun
[ user_00@ ~/code]$ sed '/li/d' sed.txt
# 删除有li的行后输出
hou yao
ming jun
[ user_00@ ~/code]$ sed 's/yu/shuai/g' sed.txt
# 将yu换成shuai后输出,g为全局替换,表示替换每行中的所有匹配字符
hou yao
shuai li
ming jun
[ user_00@ ~/code]$ sed '2q' sed.txt
# 打印前两行后停止
hou yao
yu li
[ user_00@ ~/code]$ sed -n '2p' sed.txt
# 只打印第二行
yu li
[ user_00@ ~/houyuming]$ sed 'n;s/./x/' sed.txt
# 间隔一行进行替换,.代表当前行第一个字符,若要隔两行,则为 'n;n;'
hou yao
xu li
xing jun
13.awk
awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename
- 选项参数
选项参数 | 功能 |
---|---|
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
- pattern为正则表达式,action为匹配后的行为
- awk的内置变量
变量 | 功能 |
---|---|
FILENAME | 当前文件名 |
NR | 当前为第几行 |
NF | 当前行的列数 |
- BEGIN-END
awk -F : 'BEGIN{print "start"} {print NR", "NF} END{print "end"}' passwd
awk -F : 'BEGIN{i=0} {i=NR+i} END{print i}' passwd
- 查看80端口请求数
netstat -nat | awk -F ' ' '{print $5}' | awk -F ':' '{if($NF==80){print $NF}}' | wc -l
14.sort
sort(选项)(参数)
- 选项
选项 | 说明 |
---|---|
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
- 参数:制定待排序的文件列表
sort -t : -nr -k 3 passwd passwd1
15.使用Linux命令查询file1中空行所在的行号
awk '/^$/{print NR}' passwd
16.求和
有文件chengji.txt内容如下:
张三 40
李四 50
王五 60
使用Linux命令计算第二列的和并输出
awk -F " " 'BEGIN{s=0} {s=s+$2} END{print s}' chengji.txt
17.Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
#!/bin/bash
if [ -f file.txt ]; then
echo "文件存在!"
else
echo "文件不存在!"
fi
18.用shell写一个脚本,对文本中无序的一列数字排序
sort -t : -nk 1 passwd
19.请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称
grep -r "shen" /home | cut -d ":" -f 1 | cut -d "/" -f 4
20.用sed修改test.txt的23行test为tset
sed '23s/test/tset/g' test.txt
21.查看/test.txt第25行第三列的内容
sed -n '25p' test.txt | awk -F " " '{print $3}'
head -n 25 test.txt | tail -n 1 | cut -d " " -f 3
awk -F " " 'NR==25{print $3}' test.txt
22.删除test.txt的最初三行
sed '1,3d' test.txt
23.脚本编程:求100内的质数。
#!/usr/bin/env bash
echo 2
for i in `seq 3 100`;
do
flag=1
let n=$i-1
for j in `seq 2 $n`;
do
let m=$i%$j
if [ 0 -eq $m ]; then
flag=0
break
fi
done
if [[ $flag -eq 1 ]]; then
echo $i
fi
done
24.晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令
echo 1 23,1-8/2 * * * root /tmp/walldate.sh >> /etc/crontab
25.编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
#!/bin/bash
fileinfo=`find ./ -size +1k`
for i in $fileinfo;
do
cp $i ../$i
done
26.如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.2.1:8080
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
27.在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现
echo "1 6-12/2 * * * root /usr/bin/httpd.sh >> /etc/crontab"
28.在shell环境如何杀死一个进程?
ps -ef | grep 进程信息 得到pid
kill pid 或 kill -KILL pid 或 kill -9 pid
29.在shell环境如何查找一个文件?
find dir -name abc.txt
find dir -size +1M
30.将A 、B、C目录下的文件A1、A2、A3文件,改名为AA1、AA2、AA3.使用shell脚本实现。
#!/bin/bash
file=`ls [ABC]/A[123]`
for i in $file;
do
mv $i ${i%/*}/A${i##*/}
done
31.把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell”
#!/bin/bash
file=`ls *.sh`
for i in $file;
do
mv $i ${i%%.*}.shell
done
32.编写shell实现自动删除50个账号功能,账号名为stud1至stud50
#!/bin/bash
for((i=1;i<=50;i++));do
userdel stud$i
done
33.请用Iptables写出只允许10.1.8.179 访问本服务器的22端口。
/sbin/iptables -A input -p tcp -dport 22 -s 10.1.8.179 -j ACCEPT
/sbin/iptables -A input -p udp -dport 22 -s 10.1.8.179 -j ACCEPT
/sbin/iptables -P input -j DROP
34.有文件file1
- 查询file1里面空行的所在行号
grep -n ^$ file1
- 查询file1以abc结尾的行
grep abc$ file1
- 打印出file1文件第1到第三行
head -n3 file1
sed "3q" file1
sed -n "1,3p" file1
35.假设有一个脚本scan.sh,里面有1000行代码,并在vim模式下面,请按照如下要求写入对应的指令
- 将shutdown字符串全部替换成reboot
:%s/shutdown/reboot/g
- 清空所有字符
:%d
36.找出系统内大于50k,小于100k的文件,并删除它们。
#!/bin/bash
file=`find / -size +50k -size -100k`
for i in $file;
do
rm -rf $i
done
37.linux下面的sed和awk的编写
- 如何显示文本file.txt中第二大列大于56789的行?
awk -F "," '{if($2>56789){print $0}}' file.txt
- 显示file.txt的1,3,5,7,10,15行?
sed -n "1p;3p;5p;7p;10p;15p" file.txt
awk 'NR==1||NR==3||NR==5||…||NR=15{print $0}' file.txt
- 将file.txt的制表符,即tab,全部替换成"|"
sed -i "s#\t#\|#g" file.txt
38.crontab 详情点击查看
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
---|---|---|---|---|---|---|
数字范围 | 0~59 | 0~23 | 1~31 | 1~12 | 0~7 | 需要执行的命令 |
特殊字符 | 代表意义 |
---|---|
*(星号) | 代表任何时刻都接受的意思。举例来说,0 12 * * * command 日、月、周都是*,就代表着不论何月、何日的礼拜几的12:00都执行后续命令的意思。 |
,(逗号) | 代表分隔时段的意思。举例来说,如果要执行的工作是3:00与6:00时,就会是:0 3,6 * * * command时间还是有五列,不过第二列是 3,6 ,代表3与6都适用 |
-(减号) | 代表一段时间范围内,举例来说,8点到12点之间的每小时的20分都进行一项工作:20 8-12 * * * command仔细看到第二列变成8-12.代表 8,9,10,11,12 都适用的意思 |
/n(斜线) | 那个n代表数字,即是每隔n单位间隔的意思,例如每五分钟进行一次,则:/5 * * * * command用与/5来搭配,也可以写成0-59/5,意思相同.*/2 * * * * /path/to/your/app.sh(每半分钟执行一次) |
39.统计nginx日志中的ip访问次数
2021-01-02 12:30:41 info 192.168.1.1
2021-01-02 12:30:42 info 192.168.1.2
2021-01-02 12:30:43 info 192.168.1.1
2021-01-02 12:30:44 error 504
2021-01-02 12:30:45 error 404
2021-01-02 12:30:46 info 192.168.1.1
2021-01-02 12:30:47 info 192.168.1.3
grep info test.txt | awk -F ' ' '{print $4}' | sort | uniq -c
<!--必须加sort,否则重新计数-->
3 192.168.1.1
1 192.168.1.2
1 192.168.1.3
40.重定向
1)输出重定向
>: comnad > file1 执行command1然后将输出的内容存入file1,任何file1内的已经存在的内容将被新内容替代
>>: comnad >> file1 执行command1然后将输出的内容存入file1,任何file1内的已经存在的内容不会被新内容替代
2)输入重定向
<: wc -l < users 统计users中的行数
3)组合使用
command1 < infile > outfile:从infile读取内容,然后执行command1命令,然后输出到outfile中
41.2>&1
/dev/null: 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失.而尝试从它那儿读取内容则什么也读不到.
在Linux系统中0 1 2是一个文件描述符:
0:标准输入(stdin)
1:标准输出(stdout)
2:标准错误输出(stderr)
nohup java -jar app.jar >log 2>&1 &
本来1----->屏幕 (1指向屏幕)
执行>log后, 1----->log (1指向log)
执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
nohup java -jar app.jar 2>&1 >log &
本来1----->屏幕 (1指向屏幕)
执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
执行>log后, 1----->log (1指向log,2还是指向屏幕)