shell编程

本文详细介绍Shell脚本的基础知识,包括系统变量、变量赋值、条件判断等,并提供了大量实用命令示例,如文件处理、网络配置及系统管理等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

1.系统变量
  1. $HOME:当前用户家目录
  2. $PWD:获取路径
  3. $SHELL:当前shell
  4. $USER:当前用户
2.变量赋值
  1. a=1 等号两边不能有空格
  2. unset a 取消赋值
  3. readonly b=2 只读赋值,不能unset,机器重启自动消失
  4. 变量无法进行运算,默认都是字符串 c=1+1 相当于c=“1+1”
  5. 空格需要用单引号或者双引号扩起来
  6. 可以利用export c将局部变量提升为全局变量,然后在shell脚本中引用。
3.特殊变量
  1. $n:用来接收输入参数,n代表第几个参数
echo "第一个参数:$1"
echo "第二个参数:$2"

命令行输入:sh test1.sh 11 22

第一个参数:11
第二个参数:22
  1. $#:获取输入参数个数
  2. ∗ : 当 被 双 引 号 包 着 时 , 获 取 所 有 参 数 , 作 为 一 个 整 体 , 不 包 时 和 *:当被双引号包着时,获取所有参数,作为一个整体,不包时和 @一样
  3. $@:获取所有参数,每个参数区分对待,加引号后可用于for循环,是个list
  4. $?:验证上一条命令是否正确执行,正确执行则返回0,非0为失败或者否
4.运算符
  1. ( ( 运 算 式 ) ) " 或 " ((运算式))" 或 " (())""[运算式]”

  2. expr 运算式 #运算式中运算符前后有空格,多步运算采用多层expr和`

    eg: 计算(2+3)*4:

expr `expr 2 + 3` \* 4
  1. 乘法: “\*”
  2. let:BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。
    如果表达式中包含了空格或其他特殊字符,则必须引起来。
    eg:let a=5+4
5.条件判断
  1. 两个整数之间比较
    -lt 小于(less than)			-le 小于等于(less equal)
    -eq 等于(equal)也可用来字符串相等比较	(等价于=或==)			
    -gt 大于(greater than)
    -ge 大于等于(greater equal)	-ne 不等于(Not equal)
  1. 按照文件权限进行判断
    -r 有读的权限(read)			-w 有写的权限(write)
    -x 有执行的权限(execute)
  1. 按照文件类型进行判断
    -f 文件存在并且是一个常规的文件(file)
    -e 文件存在(existence)		
    -d 文件存在并是一个目录(directory)
  1. 逻辑关系
    &&:与(and)
    ||:或(or)
  1. 常识
    (1) [ condition ] 条件前后都有空格
    (2) 非空即为True
6.流程控制
  1. if
if [ 条件判断式 ];then 
  程序 
else
  程序 
fi 
# 或者 
if [ 条件判断式 ] 
  then 
    程序 
elif [ 条件判断式 ]
  then
    程序
fi
  1. case
case $变量名 in 
  "值1") 
    如果变量的值等于值1,则执行程序1 
    ;; 
  "值2") 
    如果变量的值等于值2,则执行程序2 
    ;; 
  …省略其他分支… 
  *) 
    如果变量的值都不是以上的值,则执行此程序 
    ;; 
esac
  1. for
for (( 初始值;循环控制条件;变量变化 )) 
  do 
    程序 
  done
for 变量 in 值1 值2 值3… 
  do 
    程序 
  done
  1. while:条件为真执行程序,直到条件为假退出
while [ 条件判断式 ] 
  do 
    程序
  done
  1. until:条件为假执行程序,直到条件为真退出
until [ 条件判断式 ] 
    do
        程序
    done
7.read
read(选项)(参数)
	选项:
        -p:指定读取值时的提示符;
        -t:指定读取值时等待的时间(秒)。
    参数
	    变量:指定读取值的变量名
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
8.系统函数
  1. basename:删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename /Users/m/code/test.txt 
test.txt
basename /Users/m/code/test.txt .txt
test
  1. 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.常用命令
  1. which:显示对应的命令所在的路径 eg:which ls
  2. whereis:显示对应的命令所在的路径和帮助文档路径 eg:whereis ls
  3. more:分屏显示文件信息,只能向下滑动,不能向上滑动(mac可以) eg:more filename
  4. less:分屏显示文件信息,可以能向下和向上滑动 eg:less filename
  5. head:显示头部信息,默认10行,-n参数可以指定行数 eg:head -n 5 filename
  6. tail:显示尾部信息,默认10行,-n参数可以指定行数,-f 跟踪文件末尾变化 eg:tail -F filename
  7. tree:树形显示目录结构,不是系统自带,需要安装
  8. wc:统计行数,单词数,文件大小,-l参数:行数,-w参数:单词数,-c参数:字节数 eg:wc -l filename
  9. du:查看当前文件夹下占用磁盘空间信息 eg:du -sh *
  10. df:查看当前磁盘占用状况 eg:df -h
  11. whoami:获取当前用户名
  12. ln
硬链接:将多个文件指向底层磁盘块同一个地址,修改一个,其他链接都改变 
        eg:ln a.txt b.txt #建立b.txt到a.txt的硬链接
加-s参数:软链接,不会增加链接基数,相当于创建了一个快捷方式,
        改动软链接也会改动底层磁盘数据
删除硬链接:unlink或者rm
  1. 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)的含义是:当前为文件夹,当前用户对此文件夹有可读可写可执行权限
                                      当前组的用户对此文件夹有可读可执行权限
                                      其他用户对此文件夹有可读可执行权限
  1. chown:sodo chown 用户[:组] filename
  2. chgrp:sudo chgrp 组 fliename
  3. 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
  1. grep
查找文件内容行 grep [option] 内容 filenane
    -n:显示行数
    -r:递归子目录
    -v:排除内容
    -A:显示后边多少行
    -B:显示前边多少行
    -C:显示前后多少行
    -i:忽略大小写
    eg:grep -r LinkList algorithm/
  1. man:帮助命令,查看命令使用方法
  2. date:查看日期 eg:date +"%Y%m"
    time:统计后续指令运行需要的时间,eg:time top
  3. alias:重命名命令,可以写入到~/.bashrc eg:alias ll=‘ls -rlt’
    unalias:删除重命名 eg:unalias ll
  4. free:命令显示系统内存的使用情况
    -h:适合人类查看
    -s 数字:间隔指定秒追踪查看
  5. printf
用法:printf 格式 参数
eg:printf "姓名:%s\n身高:%dcm\n体重:%dkg\n" "小明" "180" "75"
  1. 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
  1. 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
  1. 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数目变化情况
  1. nohup
功能:用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
用法:nohup Command [ Arg … ] [ & ]
参数:
    Command:要执行的命令。
    Arg:一些参数,可以指定输出文件。
    &:让命令在后台执行,终端退出后命令仍旧执行。
eg:nohup python /root/test.py & 2>&1
    2>&1:将标准错误2重定向到标准输出&1 
  1. export
功能:用于设置或显示环境变量,仅对当前shell有效
用法:export [-fnp][变量名称]=[变量设置值]
参数:
    -f  代表[变量名称]中为函数名称。
    -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
    -p  列出所有的shell赋予程序的环境变量。
eg:export var="good"
  1. unset
功能:删除shell变量
用法:unset [-fv][变量或函数名称]
参数:
    -f  仅删除函数。
    -v  仅删除变量。
eg:unset -v var
  1. type
功能:显示指定命令的类型,有如下种类
    alias 别名
    keyword 关键字,Shell保留字
    function 函数,Shell函数
    builtin 内建命令,Shell内建命令
    file 文件,磁盘文件,外部命令
    unfound 没有找到
用法:type [参数] 命令
参数:
    -a 可以显示所有可能的类型,比如有些命令如pwd是shell内建命令,也可以是外部命令。
    -p 只返回外部命令的信息,相当于which命令。
    -f 只返回shell函数的信息。
    -t 只返回指定类型的信息。
eg:type -a type
  1. 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分钟]
              平均负载:指在特定时间间隔内运行队列中的平均进程数。
  1. 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以占内存大小排序
  1. sysstat:系统状态
    vmstat:
    mpstat:提供单个处理器或多个处理器相关数据
    iostat:提供CPU使用率及硬盘吞吐效率的数据
    pidstat: 关于运行中的进程/任务、CPU、内存等的统计信息
    sar:工具负责收集、报告并存储系统活跃的信息
  1. 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标识的消息队列
  1. 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号端口运行的程序信息
  1. 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文件里面。
  1. chattr
功能:用于改变文件属性
用法:chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]
参数:
    -R 递归处理,将指定目录下的所有文件及子目录一并处理。
  -v<版本编号> 设置文件或目录版本。
  -V 显示指令执行过程。
  +<属性> 开启文件或目录的该项属性。
  -<属性> 关闭文件或目录的该项属性。
  =<属性> 指定文件或目录的该项属性。
  
    a:让文件或目录仅供附加用途。
    b:不更新文件或目录的最后存取时间。
    c:将文件或目录压缩后存放。
    d:将文件或目录排除在倾倒操作之外。
    i:不得任意更动文件或目录。
    s:保密性删除文件或目录。
    S:即时更新文件或目录。
    u:预防意外删除。
eg:chattr +i /etc/resolv.conf #防止resolv.conf文件被更改
    使用lsattr查看文件属性
  1. 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  # 找出文中重复行
  1. 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
  1. tac
功能:和cat顺序相反
用法:tac filename
eg:
    [ user_00@ ~]$ cat test
    1234
    abcd
    [ user_00@ ~]$ rev test
    4321
    dcba
    [ user_00@ ~]$ tac test
    abcd
    1234
  1. comm
功能:对比两个已经排过序的文件
用法:comm [-123] filename1 filename2
参数:
    -1 不显示只在第 1 个文件里出现过的列。
    -2 不显示只在第 2 个文件里出现过的列。
    -3 不显示只在第 1 和第 2 个文件里出现过的列。
eg:comm filename1 filename2   # 输出的第一列只包含在filename1中出现的列,第二列只包含在filename2中出现的列,第三列两个文件都包含的列。
                                各列是以制表符 \t 作为定界符。
  1. paste
功能:用于合并文件的列
用法:paste [-s][-d <间隔字符>][文件...]
参数:
    -d<间隔字符>或--delimiters=<间隔字符>  用指定的间隔字符取代跳格字符。
    -s或--serial  串列进行而非平行处理。
eg:paste testfile testfile1
  1. 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网段的数据
  1. 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
  1. 选项参数
选项参数功能
-F指定输入文件折分隔符
-v赋值一个用户定义变量
  1. pattern为正则表达式,action为匹配后的行为
  2. awk的内置变量
变量功能
FILENAME当前文件名
NR当前为第几行
NF当前行的列数
  1. 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
  1. 查看80端口请求数
netstat -nat | awk -F ' ' '{print $5}' | awk -F ':' '{if($NF==80){print $NF}}' | wc -l
14.sort
sort(选项)(参数)
  1. 选项
选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔字符
-k指定需要排序的列
  1. 参数:制定待排序的文件列表
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
  1. 查询file1里面空行的所在行号
grep -n ^$ file1
  1. 查询file1以abc结尾的行
grep abc$ file1
  1. 打印出file1文件第1到第三行
head -n3 file1
sed "3q" file1
sed -n "1,3p" file1
35.假设有一个脚本scan.sh,里面有1000行代码,并在vim模式下面,请按照如下要求写入对应的指令
  1. 将shutdown字符串全部替换成reboot
:%s/shutdown/reboot/g
  1. 清空所有字符
:%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的编写
  1. 如何显示文本file.txt中第二大列大于56789的行?
awk -F "," '{if($2>56789){print $0}}' file.txt
  1. 显示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
  1. 将file.txt的制表符,即tab,全部替换成"|"
sed -i "s#\t#\|#g" file.txt
38.crontab 详情点击查看
代表意义分钟小时日期月份命令
数字范围0~590~231~311~120~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还是指向屏幕)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值