当前位置: 首页 > news >正文

15_2 Linux Shell基础

15_2 Linux Shell基础

文章目录

  • 15_2 Linux Shell基础
    • @[toc]
    • 1. shell基本介绍
      • 1.1 什么是shell
      • 1.2 shell使用方式
      • 1.3 脚本的执行方式
      • 1.4 脚本练习
    • 2. 变量的种类
      • 2.1 自定义变量
      • 2.2 环境变量,由系统提前定义好,使用时直接调用
      • 2.3 位置变量与预定变量
      • 2.4 变量应用实例
      • 2.5 变量的扩展知识
        • 2.5.1 引号与反撇号
        • 2.5.2 read指令
        • 2.5.3 定义变量初值(备用)
    • 3. 运算
    • 4. $号的火花
    • 5. 条件测试
      • 5.1 对字符串进行测试
      • 5.2 逻辑组合
      • 5.3 数字
      • 5.4 文件
    • 6. if分支
    • 7. for循环
    • 8. while循环
      • 8.1 循环的控制
    • 9. case 分支
    • 10. 函数
    • 11. 字符串
      • 11.1 字符串的截取
      • 11.2 字符串替换
      • 11.3 字符串的删除,可以删除两边
    • 12. 正则表达式与linux三剑客
      • 12.1 正则表达式
        • 12.1.1 基本正则表达式
        • 12.1.2 扩展正则表达式
      • 12.2 sed流式编辑器
      • 12.3 awk
        • 12.3.1 awk基础
        • 12.3.2 awk的条件
        • 12.3.3 awk处理时机,可以执行额外任务

1. shell基本介绍

1.1 什么是shell

  • 在Linux内核与用户之间的解释器程序;通常指 /bin/bash(默认);负责向内核翻译及传达用户/程序指令;相当于操作系统的“外壳”。

1.2 shell使用方式

  • 交互式(命令行)

    • 人工干预、智能化程度高、逐条解释执行、效率低
  • 非交互式(脚本)

    • 需要提前设计、智能化难度大;批量执行、效率高;方便在后台悄悄运行

1.3 脚本的执行方式

  1. 为脚本添加x权限,使用相对或者绝对路径执行
    • chmod u+x test01.sh
    • ./test01.sh 或者 /opt/test01.sh --> 执行
    • 用户(root)—bash—bash—echo
  2. 使用解释器程序执行脚本,无需x权限
    • bash test01.sh
    • 用户(root)—bash —bash—echo 会开启子进程
  3. 使用source 或者. 执行脚本,无需x权限
    • source test01.sh
    • 用户(root)—bash—echo 不会开启子进程

1.4 脚本练习

1. 编写脚本,搭建yum#!/bin/bash#搭建yum软件仓库mkdir /abcmount /dev/cdrom /abcrm -rf /etc/yum.repos.d/*.repoecho "[abc]name=abcabcbaseurl=file:///abcenabled=1gpgcheck=0" > /etc/yum.repos.d/abc.repo2. 编写脚本,安装网站服务并开启,浏览网站时显示"web-test~~"#!/bin/bash#搭建网站yum -y install httpdecho "web-test~~" > /var/www/html/index.htmlsystemctl restart httpd3. 编写脚本,安装ftp服务并开启且设置为开机自启> 重定向标准输出2> 重定向错误输出&>  重定向所有输出#!/bin/bashyum -y install vsftpd &> /dev/null   //将不需要的信息扔黑洞systemctl restart vsftpdsystemctl enable vsftpd

2. 变量的种类

2.1 自定义变量

  • 可以的:

    • 名称可以用数字、字母、下划线
  • 不可以的:

    • 不能以数字开头,
    • 不能使用特殊符号,
    • 等号两边不能有空格,
  • 格式:变量名称=值

   a=10          //创建变量(对变量赋值),名字是a,值是10a=30          //再次赋值,之前的会被覆盖echo $a       //调用变量时使用$符号unset  a      //取消变量的定义a=            //将变量a赋值为空,效果同上echo ${a}RMB  //变量名容易与后续字符发生混淆时使用大括号隔开

2.2 环境变量,由系统提前定义好,使用时直接调用

    USER      # 当前用户名    UID       # 当前用户的id号    HOME      # 当前用户家目录HOSTNAME  # 主机名  SHELL     # 当前用户的解释器  PWD       # 当前位置PATH      # 存储命令的路径  PS1       # 一级提示符   PS2       # 二级提示符

2.3 位置变量与预定变量

    $1  # 执行脚本时后面第1个位置参数$2  # 执行脚本时后面第2个位置参数$3  # 执行脚本时后面第3个位置参数$*  # 执行脚本时后面所有位置参数$#  # 执行脚本时后面位置参数的个数$$  # 当前程序的进程号(该号码是随机的)$?  # 判断上一条指令是否执行成功,0是成功,非0是失败

2.4 变量应用实例

#!/bin/bash
useradd $1
echo "$2" | passwd --stdin $1
  • env 查看所有环境变量
  • set 查看所有变量

2.5 变量的扩展知识

2.5.1 引号与反撇号
  • 如有变量:a=10
  • a=date仅仅是将四个字母赋值给a;a=date是将date的执行结果赋值给a
作用实例实例效果
双引号""界定范围echo “$a”正常调用变量
单引号’’界定范围,屏蔽特殊符号的功能echo ‘$a’无法调用变量,$被屏蔽
反撇号``获取命令的执行结果,还可以使用$( )实现相同效果a=date将date执行结果赋值给a(a=$(date) //效果同上)
2.5.2 read指令
  • read 用来提示用户输出
    #!/bin/bashread -p "请输入用户名"  u   # -p是可以定义提示信息,u相当于自定义变量名称,可以存储用户看到提示信息后输入的字符useradd $uread -p "请输入密码"  necho "$n" | passwd --stdin $u# stty  -echo 屏蔽回显
# stty  echo  恢复回显## 再次改良脚本:#!/bin/bashread  -p  "请输入用户名"  uuseradd  $ustty  -echoread  -p  "请输入密码"  nstty  echoecho  "$n" | passwd  --stdin  $u
2.5.3 定义变量初值(备用)
  • 语法:${变量名:-初值}
#!/bin/bash
read -p "请输入用户名:"  u
[ -z $u ] && echo "必须输入用户名!"  && exit
useradd $u
read -p "请输入密码(默认123456):"  n
echo ${n:-123456} | passwd --stdin $u

3. 运算

  1. expr命令
expr  1  +  1     //加法,运算符号两边要有空格
expr  21     //减法
expr  2  '*'  2  //乘法
expr  2  \*  2   // \是转义符号,可以屏蔽身后一个特殊符号的功能
expr  4  /  2   //除法
expr  5  %  2   //取余数
a=10
b=20
expr $a + $b
expr $a + 100
expr $a + $a
  1. $[ ]与$(( )) 可以实现相同效果
echo $[2*2]
echo $[2-2]
echo $[2/2]
echo $[2%2]
a=10
b=20
expr $a + $b
echo $[a+b]
  1. let命令
    • 不输出结果,专用于变量的创建或者变量的自增减
变量的自增减:
常规写法       主流写法
let a=a+1       let a++     变量a加1
let a=a-1	      let a--      变量a减1
let a=a+10      let a+=10   变量a加10
let a=a-10      let a-=10    变量a减10
let a=a*2       let a*=2     变量a乘以2
let a=a/2       let a/=2    变量a除以2
let a=a%3      let a%=3    变量a除以3取余数
  1. bc,可以进行小数计算

4. $号的火花

## 1
a=10
echo $a # 调用变量时使用$符号
echo ${a}RMB  # 变量名容易与后续字符发生混淆时使用大括号隔开## 2
$1  # 执行脚本时后面第1个位置参数
$2  # 执行脚本时后面第2个位置参数
$3  # 执行脚本时后面第3个位置参数
$*  # 执行脚本时后面所有位置参数
$#  # 执行脚本时后面位置参数的个数
$$  # 当前程序的进程号(该号码是随机的)
$?  # 判断上一条指令是否执行成功,0是成功,非0是失败## 3
a=$(date) # 获取命令的执行结果,将结果赋值给变量a## 4
# $[  ]、$((  )) 可以用来运算

5. 条件测试

  • 作用:可以赋予脚本智能判断的能力
  • 语法格式:
    • (1) test 表达式
    • (2) [ 表达式 ]

5.1 对字符串进行测试

  • == 两边是否相等,相等时条件测试算成功
  • != 两边是否不等,不相等时条件测试算成功
== 两边是否相等,相等时条件测试算成功
!= 两边是否不等,不相等时条件测试算成功
test a == a  //方式一:test ,使用常量判断,再用echo $?测试结果
test a == b  
[ a == a ]   //方式二:中括号,使用常量判断,再用echo $?测试结果
[ a == b ]   
a=abc
b=xyz
[ $a == $b ]  //使用变量判断两个变量的值是否相等
[ $a != $b ]   //使用变量判断两个变量的值是否不相等
[ "$c" == $b ]  //如果变量为空,有可能报错,加双引号可以避免[ -z $a ]    //判断变量是否为空,为空时条件测试算成功
[ ! -z $a ]  //判断变量是否非空,非空时条件测试算成功

5.2 逻辑组合

  1. 条件与指令
  • 条件 && 指令 — 条件成功才执行指令
  • 条件 || 指令 — 条件失败才执行指令
[  root  ==  $USER  ] || exit   //判断当前用户名是否为root
如果判断失败,则执行exit
[  $USER  !=  root  ] && exit  //判断当前用户名是否不为root
如果判断成功,则执行exit
  1. 多个逻辑符号组合
  • A && B A、B任务都成功算成功
  • A || B A、B 任务有一个成功算成功
touch a b c
ls a  &&  ls b  &&  ls c     //结果是都显示
ls a  ||  ls b  ||  ls c      //结果是显示a 
ls a  &&  ls b  ||  ls c     //结果是显示a和b
ls a  ||  ls b  &&  ls c     //结果是显示a和c[ root != $USER ]  &&  echo "非管理员不能执行该脚本"  && exit  //之前
的语句可以改进成这个方式

5.3 数字

-eq  是否相等        equal
-ne  是否不等        not equal
-gt  是否大于        greater then
-ge  是否大于等于    greater or equal
-lt  是否小于        less then
-le  是否小于等于    less or equal 
  • 编写脚本,每2分钟检查服务器的用户数量,如果发生变化则发邮件通知管理员
#!/bin/bash
x=$(cat /etc/passwd | wc -l)   //将目前用户数量赋值给变量x
[ $x -gt 29 ] && echo "用户数量发生变化,服务器可能被入  
侵" | mail -s test root       //如果目前用户数量大于29,就
发邮件给管理员,29是之前查看的用户数量注意,以下命令不是脚本内容,要在命令行中敲,不写在脚本中
chmod  u+x  test01.sh   //然后给脚本加x权限
crontab  -e     //编写计划任务
*/2 * * * *  /opt/test01.sh    //定义每2分钟执行脚本

5.4 文件

-e  判断文件是否存在,不关心类型
-f  判断文件是否存在,必须是普通文件
-d  判断文件是否存在,必须是目录
-r  判断当前用户对文件是否有读权限,对root无效
-w  判断当前用户对文件是否有写权限,对root无效
-x  判断当前用户对文件是否有x权限
[ -e abc ]   //判断当前目录下的abc是否存在,用echo $?查结果
[ -f /opt/abc ]   //判断opt下有没有abc这个普通文件
[ -d /opt/abc ]  //判断opt下有没有abc这个目录mkdir  xyz
[ -d /opt/xyz ]   //判断opt下有没有xyz这个目录
[ -r /opt/abc ]   //判断当前用户对abc是否有读权限
[ -w /opt/abc ]   //判断当前用户对abc是否有写权限
[ -x /opt/abc ]   //判断当前用户对abc是否有x权限

6. if分支

分号";"的作用:不管前面成不成功,都会执行后面的命令

  1. 单分支
if 条件测试;then    //满足条件的话就执行下面指令
执行指令
fi
  1. 双分支
if 条件测试;then    //满足条件的话就执行下面指令
执行指令A   //指令可以是一条,也可以是多条
else     //否则,不满足条件的话就执行下面指令
执行指令B
fi
  1. 多分支
if 条件测试;then    //满足条件的话就执行下面A指令
执行指令A   //指令可以是一条,也可以是多条
elif 条件测试;then    //满足条件的话就执行下面B指令
执行指令B
elif 条件测试;then    //满足条件的话就执行下面C指令
执行指令C
else     //否则,不满足条件的话就执行下面指令
执行指令
fi

7. for循环

for 变量名称 in 值1  值2  值3 ...  //此处变量名可以自定义,通常习惯用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空格,这里是有3个值,所以就循环执行指令3次
do
任务
done1. for i in a b c    //循环3次2. for i in {1..100}    //循环100次,此处不支持变量,也就是不能写成{1..$a}的格式3. for i in $(seq $a)    //这样可以支持变量定义循环次数,seq命令可以产生数字序列号4. for i in $(cat  /opt/name.txt)    //循环批量创建name.txt里面所有用户,文档中每行是一个名字,该文档要提前创建,与脚本在同一目录下即可5. for ((i=1;i<=5;i++))

8. while循环

  • while:可以根据条件决定循环次数,也可以实现无限循环
while 条件测试   //根据条件的结果决定是否要执行任务,条件测试成功的话就执行,如果失败立刻结束循环
do
任务
done1. while  :           //冒号代表永远正确,无限循环
2. while [ 1 -ep 1 ]  //无限循环

8.1 循环的控制

exit  可以终止循环,但脚本也终止
break  可以终止循环,继续循环后的任务
continue  可以终止当前循环,继续下一次循环

9. case 分支

1. 语法格式
case 调用的变量名 in
模式1)
指令;;
模式2)
指令;;
*)
指令
esac2. 实例
#!/bin/bash
case $1 in
t)      //如果$1是t就执行touch任务touch $2;;
m)    //如果$1是m就执行mkdir任务mkdir $2;;
r)     //如果$1是r就执行rm任务rm -rf $2;;
*)echo "请输入t或者m或者r"
esac

10. 函数

  • 作用:利用一个名称存储公共的语句块,实现精简脚本方便后期调用的目的
  • 语法格式:
函数名(){
指令
}
  • 实例:
1. 函数的声明与调用
a(){     //创建函数
echo abc
echo xyz
}
a   //调用函数
a   //可以反复调用函数2.脚本中的实例
#!/bin/bash
a(){   //创建函数,名字叫a
echo -e "\033[$1m$2\033[0m"    //输出带颜色的字符
}
a 31 ABCD    //调用函数时,后面跟第一个位置变量定义颜色
第二个位置变量定义内容
a 32 xyzZ
a 33 EGSD
a 34 ERTY
a 35 BJYQ

11. 字符串

11.1 字符串的截取

  • 语法:${变量名称:截取位置:截取长度}
  • 编写脚本,可以生成8位随机字符用作密码
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
for i in {1..8}
do
n=$[RANDOM%62]  //得到0~61随机数存在变量n中
a=${x:n:1}   //截取到1个随机字符,存在变量a中
c=$a$c   //不断往c中追加,此时c相当于一个袋子
done
echo $c   //最后喊出,得到8位长度随机字符串

11.2 字符串替换

  • 语法格式:${变量名/旧/新}
a=1234
echo ${a/2/6}    //将1个字符2换成6
a=112233  
echo ${a/2/6}    //将1个字符2换成6
echo ${a//2/6}   //将所有字符2换成6
a=1122233
echo ${a/22/66}   //换2个
echo ${a/11/}    //将11替换成空,相当于删除

11.3 字符串的删除,可以删除两边

  • 掐头:${变量名#要删除的内容}
  • 去尾:${变量名%要删除的内容}
a=abcdef   //创建变量,作为素材
echo ${a#abc}    //掐头,删除到abc
echo ${a%def}    //去尾,删除到def
echo ${a#abcde}    //掐头,删除到abcdea=abcdefghijk   //创建变量,作为素材
echo ${a#abcdefghi}   //掐头,删除到i
echo ${a#*i}        //效果同上,精简写法
echo ${a%defghijk}  //去尾,删除到d
echo ${a%d*}      //效果同上,精简写法a=abcdabcd   //定义变量为素材
echo ${a#*c}   //从左往右删除到第1个c
echo ${a##*c}  //从左往右删除到最后1个c
echo ${a%b*}  //从右往左删除到第1个b
echo ${a%%b*}  //从右往左删除到最后1个b

12. 正则表达式与linux三剑客

12.1 正则表达式

12.1.1 基本正则表达式
正则符号描述
^匹配行首
$匹配行尾
[]集合,匹配集合中的任意单个字符
[^]对集合取反
.匹配任意单个字符
*匹配前一个字符任意次数(不能单独使用)
{n,m}匹配前一个字符n到m次
{n}匹配前一个字符n次
{n,}匹配前一个字符n次以上
{}保留
\w匹配数字、字母、下划线
\s匹配空格、tab键
\d匹配数字,和[0-9]等效
* head -5 /etc/passwd > user    //准备素材grep ^root user    //找以root开头的行
grep bash$ user     //找以bash结尾的行
grep ^$ user   //找空行
grep -v ^$ user  //显示除了空行的内容
grep "[root]" user    //找r、o、t任意一个字符 
grep "[rot]" user    //效果同上
grep "[^rot]" user   //显示r或o或t以外的内容
grep "[0123456789]" user   //找所有数字
grep "[0-9]" user    //效果同上
grep "[^0-9]" user   //显示数字以外内容
grep "[a-z]" user    //找所有小写字母
grep "[A-Z]" user    //找所有大写字母
grep "[a-Z]" user    //找所有字母
grep "[^0-9a-Z]" user   //找所有符号grep "." user   //找任意单个字符,文档中每个字符都可
以理解为任意字符
grep "r..t" user  //找rt之间有2个任意字符的行
grep "r.t" user  //找rt之间有1个任意字符的行,没有匹
配内容,就无输出
grep "*" user   //错误用法,*号是匹配前一个字符任意
次,不能单独使用
grep "ro*t" user   //找rt,中间的o有没有都行,有几次都行
grep ".*" user  //找任意,包括空行 .与*的组合在正则中相当于通配符的效果grep "ro\{1,2\}t" user  //找rt,中间的o可以有1~2个
grep "ro\{2,6\}t" user  //找rt,中间的o可以有2~6个
grep "ro\{1,\}t" user  //找rt,中间的o可以有1个以及1个以上
grep "ro\{3\}t" user   //找rt,中间的o必须只有有3个
12.1.2 扩展正则表达式
正则符号描述
+最少匹配一次
最多匹配一次
{n,m}匹配n到m次
()组合为整体,保留
|或者
\b单词边界
* 以上命令均可以加-E选项并且去掉所有\,改成扩展正则的用法,比如
grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user    
* 或者egrep "ro{1,}t" user   grep "ro\{1,\}t" user   //使用基本正则找o出现1次以及1次以上
egrep "ro{1,}t" user   //使用扩展正则,效果同上,比较精简
egrep "ro+t" user   //使用扩展正则,效果同上,最精简
grep "roo\{0,1\}t" user   //使用基本正则找第二个o出现0~1次
egrep "roo{0,1}t" user   //使用扩展正则,效果同上,比较精简
egrep "roo?t" user   //使用扩展正则,效果同上,最精简egrep "(0:){2}" user  //找连续的2个0:  小括号的作用是将字符组合为一个整体
egrep "root|bin" user  //找有root或者bin的行egrep  "the\b" abc.txt   //在abc.txt文件中找the,右边不允许出
现数字、字母、下划线
egrep  "\bthe\b" abc.txt   //两边都不允许出现数字、字母、下划线
egrep  "\<the\>" abc.txt   //效果同上

12.2 sed流式编辑器

  • 作用:可以对文档进行非交互式增删改查逐行处理
  • 用法:
1,前置指令 | sed  选项  条件  指令
2,sed  选项  条件  指令  被处理文档
* 选项:  * -n  屏蔽默认输出   * -r 支持扩展正则  * -i  修改源文件
* 指令:* p  输出   * d  删除   * s 替换
* 条件* 行号* /字符串/一、输出
sed -n  'p'  user    //输出所有行
sed -n  '1p'  user   //输出第1行
sed -n  '2p'  user   //输出第2行
sed -n  '3p'  user    //输出第3行
sed -n  '2,4p'  user   //输出2~4行
sed -n  '2p;4p'  user   //输出第2行与第4行
sed -n '3,+1p' user   //输出第3行以及后面1行
sed -n '/^root/p' user   //输出以root开头的行  
sed -n '/root/p' user   //输出包含root的行
sed -nr '/^root|^bin/p' user   //输出以root开头的行或bin开头的行,|是扩展正则,需要r选项
sed -n '1!p' user   //输出除了第1行的内容,!是取反
sed -n '$p'  user  //输出最后一行
sed -n '='  user   //输出行号,如果是$=就是最后一行的行号**以上操作,如果去掉-n,在将p指令改成d指令就是删除二、删除
删除第3~5行   sed  '3,5d'  abc.txt
删除所有包含xml的行   sed  '/xml/d'   abc.txt
删除不包含xml的行   sed  '/xml/!d'   abc.txt
删除以install开头的行    sed  '/^install/d'   abc.txt
删除文件的最后一行  sed '$d' abc.txt
删除所有空行  sed  '/^$/d'  abc.txt三、替换
sed 's/2017/6666/' shu.txt   //把所有行的第1个2017替换成6666
sed 's/2017/6666/2' shu.txt  //把所有行的第2个2017替换成6666
sed '1s/2017/6666/' shu.txt  //把第1行的第1个2017替换成6666
sed '3s/2017/6666/3' shu.txt  //把第3行的第3个2017替换成6666
sed 's/2017/6666/g' shu.txt   //所有行的所有个2017都替换
sed '/2024/s/2017/6666/g' shu.txt   //找含有2024的行,将里面的
所有2017替换成6666如果想把 /bin/bash 替换成 /sbin/sh 怎么操作?
sed -i '1s/bin/sbin/' user   //传统方法可以一个一个换,先换一个
sed -i '1s/bash/sh/' user   //再换一个如果想一起一步替换:
sed 's//bin/bash//sbin/sh/' user     //直接替换,报错
sed 's/\/bin\/bash/\/sbin\/sh/' user   //使用转义符号可以成功,但
不方便
sed 's!/bin/bash!/sbin/sh!' user   //最佳方案,更改s的替换符
sed 's(/bin/bash(/sbin/sh(' user   //替换符号可以用所有数字键上的四、a行下追加   i行上添加   c替换整行
sed 'a 666' user    //所有行的下面追加666
sed '1a 666' user   //第1行的下面追加666
sed '/^bin/a 666' user   //在以bin开头的行的下面追加666
sed 'i 666' user  //所有行的上面添加666
sed '5i 666' user   //第5行的上面添加666
sed '$i 666' user  //最后1行的上面添加666
sed 'c 666' user   //所有行都替换成666
sed '1c 666' user  //替换第1行为666

12.3 awk

12.3.1 awk基础
  • 作用:可以实现精确搜索并输出 ,逐行处理
  • 用法:
1. 前置指令 | awk 选项  条件  指令
2. awk 选项  条件  指令  被处理文档
* 选项:-F 定义分隔符
* 指令:print
* 条件:/字符串/
* 内置变量:* $1第一列  * $2第二列  * $3第三列 * $0 所有列   * NR行号   * NF 列号awk '{print}' abc.txt    //输出所有
awk '/to/{print}' abc.txt    //输出有to的那行
awk '{print $2}' abc.txt    //输出所有行的第2列
awk '/to/{print $1}' abc.txt    //输出有to的那行的第1列
awk '{print $0}' abc.txt    //输出所有行所有列
awk '{print $0,$1}' abc.txt  //输出所有行所有列,第1列
awk '{print NR}' abc.txt   //输出所有行的行号
awk '{print NR,$0}' abc.txt   //输出所有行的行号,所有列
awk '{print NR,NF}' abc.txt   //输出所有行的行号,列号(有几列)awk '/^bin/{print NR}'  user    //找以bin开头的行,显示该行的行号
awk '/^bin/{print NR,$0}'  user   //找以bin开头的行,显示该行的行号,所有列
awk '{print NF}'   user   //输出所有行的列号(每行有几列)
awk -F: '{print $1}'  user   //文档中如果没有空格,可以用F修改分隔符
awk -F: '{print $1,$6}'  user    //使用冒号作为列的分隔符,显示第1、6列
awk -F: '{print $1" 的家目录是 "$6}'  user    //还可以输出常量,加双引号即可
awk -F: '{print $1" 的解释器是 "$7}'  user
12.3.2 awk的条件
1,/字符串/   还可以使用正则    ~ 包含   !~不包含
awk -F: '$6~/root/{print}'  user  //输出第6列包含root的行
awk -F: '$6~/bin/{print}'  user   //输出第6列包含bin的行
awk -F: '$6!~/bin/{print}'  user  //输出第6列不包含bin的行
2,使用数字或者字符串
==  !=  >  >=  <  <=
awk -F: '$3<3{print}' user   //输出第3列小于3的行
awk -F: '$3<=3{print}' user   //输出第3列小于等于3的行
awk -F: 'NR==2{print}' user   //输出第2行
awk -F: 'NR>2{print}' user    //输出行号大于2的行
3,逻辑组合  &&并且   ||或者
awk -F: 'NR==2||NR==4{print}' user   //找行号是2或者4的行
awk -F: 'NR==2||NR==40{print}' user   //如果只有一个条件满足就显示一个
awk -F: '$7~/bash/&&$3<=500{print}' user   //找第7列包含bash并且第3列小于等于500的行
awk 'NR==2&&NR==4{print}' user   //找行号既是2又是4的行,不存在,无输出
awk -F: '$7~/bash/&&NR<=3{print}' user  //找第7列包含bash并且行号是1~3的
awk -F: '$7~/bash/||NR<=3{print}' user  //找第7列包含bash或者行号是1~3的awk -F: '$1~/root/' user    //找第1列包含root的行
如果有用户叫root6,也会搜到,比较宽松的搜索方式,如果
任务就是{print}的话可以省略不写
awk -F: '$1=="root"' user  //找第1列完全等于root的行
多一个字符少一个字符都不行,比较严格的搜索方式4,运算
awk 'NR%2==0{print NR,$0}' user   //在条件中使用运算
,找到将行号除以2余数等于0的行,然后输出该行的行号和所有列,相当于输出偶数行
12.3.3 awk处理时机,可以执行额外任务
BEGIN任务  执行1次,读取文档之前执行
逐行任务   执行n次,读取文档时执行 
END任务   执行1次,读取文档之后执行awk 'BEGIN{print "User\tUID\tHome"}'   //第1步输出表头信息
awk -F: '{print $1"\t"$3"\t"$6}' user    //第2步输出内容
awk 'END{print "总计"NR"行" }' user    //第3步输出结尾

相关文章:

15_2 Linux Shell基础

15_2 Linux Shell基础 文章目录 15_2 Linux Shell基础[toc]1. shell基本介绍1.1 什么是shell1.2 shell使用方式1.3 脚本的执行方式1.4 脚本练习 2. 变量的种类2.1 自定义变量2.2 环境变量&#xff0c;由系统提前定义好&#xff0c;使用时直接调用2.3 位置变量与预定变量2.4 变量…...

Catia装配体零件复制

先选中要复制的零件 然后选中复制到的父节点才可以。 否则 另外一种方法是多实例化...

实用小工具-python esmre库实现word查找

python esmre库实现word查找 前言&#xff1a; 在文本中匹配特定的字符串&#xff0c;一般可以用普通的字符串匹配算法&#xff0c;KMP算法&#xff1b; python中提供了一个库&#xff0c;esmre, 通过预先将字符串存到esm对象中&#xff0c;利用这些字符串从候选的字符串中进行…...

SSM框架整合,内嵌Tomcat。基于注解的方式集成

介绍&#xff1a; SSM相信大家都不陌生&#xff0c;在spring boot出现之前&#xff0c;SSM一直是Java在web开发中的老大哥。现在虽说有了spring boot能自动整合第三方框架了&#xff0c;但是现在市面上任然有很多老项目是基于SSM技术的。因此&#xff0c;能熟练掌握SSM进行开发…...

系统架构设计师【论文-2016年 试题4】: 论微服务架构及其应用(包括写作要点和经典范文)

论微服务架构及其应用&#xff08;2016年 试题4&#xff09; 近年来&#xff0c;随着互联网行业的迅猛发展&#xff0c;公司或组织业务的不断扩张&#xff0c;需求的快速变化以及用户量的不断增加&#xff0c;传统的单块(Monolithic)软件架构面临着越来越多的挑战&#xff0c;…...

面试题:String 、StringBuffer 、StringBuilder的区别

String、StringBuffer、和StringBuilder都是用于处理字符串的操作类&#xff0c;但它们之间存在一些关键性的差异&#xff1a; 1.不可变性与可变性&#xff1a; String&#xff1a;字符串常量&#xff0c;是不可变的。一旦创建&#xff0c;其内容就不能被改变。对字符串的任何…...

TLS指纹跟踪网络安全实践(C/C++代码实现)

TLS指纹识别是网络安全领域的重要技术&#xff0c;它涉及通过分析TLS握手过程中的信息来识别和验证通信实体的技术手段。TLS&#xff08;传输层安全&#xff09;协议是用于保护网络数据传输的一种加密协议&#xff0c;而TLS指纹则是该协议在实际应用中产生的独特标识&#xff0…...

小白学RAG:大模型 RAG 技术实践总结

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…...

Doris Connector 结合 Flink CDC 实现 MySQL 分库分表

1. 概述 在实际业务系统中为了解决单表数据量大带来的各种问题&#xff0c;我们通常采用分库分表的方式对库表进行拆分&#xff0c;以达到提高系统的吞吐量。 但是这样给后面数据分析带来了麻烦&#xff0c;这个时候我们通常试将业务数据库的分库分表同步到数据仓库时&#x…...

ModbusTCP、TCP/IP都走网线,一样吗?

在现代通信技术中&#xff0c;Modbus/TCP和TCP/IP协议是两种广泛应用于工业自动化和网络通信领域的协议。尽管它们都运行在网线上&#xff0c;但它们在设计、结构和应用场景上有着明显的区别。 Modbus/TCP协议是什么 Modbus/TCP是一种基于TCP/IP的应用层协议&#xff0c;它是Mo…...

网络学习(13)|Spring Boot中获取HTTP请求头(Header)内容的详细解析

文章目录 方法一&#xff1a;使用HttpServletRequest实现原理代码示例优点缺点适用场景 方法二&#xff1a;使用RequestContextHolder实现原理代码示例优点缺点适用场景 方法三&#xff1a;使用RequestHeader注解实现原理代码示例优点缺点适用场景 总结 在Spring Boot应用中&am…...

【漏洞复现】宏景eHR pos_dept_post SQL注入漏洞

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR pos_dept_post 接囗处存在SQL注入漏洞,未经过身份认证的远程攻击者利用此漏洞执行任意SQL指令&#xff0c;…...

82. 删除排序链表中的重复元素 and II

链接直达&#xff1a; 保留重复元素 不保留重复元素 题目&#xff1a; 1: 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。示例 1&#xff1a;输入&#xff1a;head [1,1,2] 输出&#xff1a;[1…...

C++ 判断目标文件是否被占用(独占)(附源码)

在IM软件中发起文件发送时,如果要发送的是某word文件,并且该word文件被office打开,则会提示文件正在被占用无法发送,如下所示: 那文件被占用到底是如何判断出来的呢?其实很简单,调用系统API函数CreateFile,打开该文件(OPEN_EXISTING),传入FILE_SHARE_READ共享读标记…...

计划任务 之 一次性的计划任务

计划任务 作用:定时自动完成特定的工作 计划任务的分类&#xff1a; &#xff08;1&#xff09;一次性的计划任务 例如下周三对系统的重要文件备份一次 &#xff08;2&#xff09;周期性重复计划任务 例如每天晚上12&#xff1a;00备份一次 一次性的任务计划&#xff1a…...

非比较排序之计数排序

目录 一、什么是计数排序 二、思路 三、代码实现 一、什么是计数排序 计数排序是一种非比较型的排序算法&#xff0c;它通过统计待排序数据中每个元素出现的次数&#xff0c;然后根据这个次数来进行排序。计数排序的具体步骤如下&#xff1a; 首先找出待排序数据中的最大值…...

Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

第7章 用户输入和 while 循环

第7章 用户输入和 while 循环 7.1 函数 input()的工作原理7.1.1 编写清晰的程序7.1.2 使用 int()来获取数值输入7.1.3 求模运算符 7.2 while 循环简介7.2.1 使用 while 循环7.2.2 让用户选择何时退出7.2.3 使用标志7.2.4 使用 break 退出循环7.2.5 在循环中使用 continue7.2.6 …...

xshell远程无法链接上VM的centos7

1、现象如下&#xff0c; 2.1解决办法&#xff1a;查证后发现这个默认的设置为vmnet0 2.2解决办法&#xff1a;重启win10的虚拟机网卡&#xff08;先禁用再启用&#xff09; 3.参考文章&#xff1a;Xshell连接不上虚拟机centos7_centos7的nat模式可以ping通网络,但是用xshell连…...

拥抱AI-图片学习中的卷积神经算法详解

一、定义 卷积神经算法&#xff08;Convolutional Neural Networks, CNN&#xff09;是深度学习领域中的一种重要算法&#xff0c;特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释&#xff1a; 1. 基本概念 定义&#xff1a;卷积神经网络是一类包含卷积计算且具…...

超详解——深入详解Python基础语法——基础篇

目录 1 .语句和变量 变量赋值示例&#xff1a; 打印变量的值&#xff1a; 2. 语句折行 反斜杠折行示例&#xff1a; 使用括号自动折行&#xff1a; 3. 缩进规范 缩进示例&#xff1a; 4. 多重赋值&#xff08;链式赋值&#xff09; 多重赋值的应用&#xff1a; 5 .多…...

系统架构设计师【论文-2017年 试题2】: 论软件架构风格(包括写作要点和经典范文)

题目&#xff1a;论软件架构风格 &#xff08;2017年 试题2&#xff09; 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格 定义一个系统家族&#xff0c;即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和 连接件类型&#xff…...

Spring Boot 事务传播机制详解

Spring Boot 事务传播机制详解 1. 事务传播机制概述 Spring Boot 中的事务传播机制用于处理多个事务方法之间相互调用时的事务行为&#xff0c;保证数据的完整性和一致性。当务传播机制定义了在调用一个事务方法时&#xff0c;当前事务该如何传播或传递。Spring Boot 中的事务…...

【机器学习】生成对抗网络 (Generative Adversarial Networks | GAN)

生成对抗网络 (Generative Adversarial Networks | GAN) 介绍 生成对抗网络 (Generative Adversarial Networks&#xff0c;简称GAN) 是一种强大的深度学习模型&#xff0c;用于生成具有逼真感的图像、音频和文本等内容。GAN 的核心理念是通过训练两个神经网络&#xff0c;生…...

[ADS信号完整性分析]深入理解IBIS AMI模型设计:从基础到实践

在高速数字设计领域&#xff0c;信号完整性&#xff08;SI&#xff09;分析对于确保系统性能至关重要。IBIS AMI&#xff08;Algorithmic Model Interface&#xff09;模型作为一种强大的工具&#xff0c;能够帮助设计师在系统层面上评估和优化SERDES&#xff08;串行器/解串器…...

Plotly : 超好用的Python可视化工具

文章目录 安装&#xff1a;开始你的 Plotly 之旅基本折线图&#xff1a;简单却强大的起点带颜色的散点图&#xff1a;数据的多彩世界三维曲面图&#xff1a;探索数据的深度气泡图&#xff1a;让世界看到你的数据小提琴图&#xff1a;数据分布的优雅展现旭日图&#xff1a;分层数…...

Linux电话本的编写-shell脚本编写

该电话本可以实现以下功能 1.添加用户 2.查询用户 3.删除用户 4.展示用户 5.退出 代码展示&#xff1a; #!/bin/bash PHONEBOOKphonebook.txt function add_contact() { echo "Adding new contact..." read -p "Enter name: " name …...

蓝牙开发 基础知识

零、基础知识 0.1、Android 应用可通过 Bluetooth API 执行以下操作 扫描其他蓝牙设备查询本地蓝牙适配器的配对蓝牙设备建立 RFCOMM 通道通过服务发现连接到其他设备与其他设备进行双向数据传输管理多个连接 0.2、蓝牙进行通信的四大必需任务 设置蓝牙查找局部区域内的配对…...

QNX 7.0.0开发总结

1 QNX编译 1.1 基本概念 QNX可以直接使用Linux Makefile编译库和二进制&#xff0c;在Makefile文件中指定CCaarch64-unknown-nto-qnx7.0.0-g&#xff0c;或者CCx86_64-pc-nto-qnx7.0.0-g&#xff0c;保存退出后&#xff0c;运行source /qnx_sdk_path/qnxsdp-env.sh&#xff0c;…...

Golang使用讯飞星火AI接口

一、API申请 https://www.bilibili.com/video/BV1Yw411m7Rs/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 注册申请&#xff0c;需要在此页面获取appid、apisecret、apikey https://www.xfyun.cn/ https://console.xfyun.cn/ser…...

产品网站推广/别做网络推广员

前言&#xff1a;对用户的需求挖掘&#xff0c;其实算是技巧运用心理博弈。以下是对需求挖掘的小小总结&#xff0c;以后再慢慢补充。 一、需求挖掘&#xff1a; 1、概念&#xff1a;从用户需求出发&#xff0c;挖掘用户内心真正的目标&#xff0c;并转换为产品需求的过程。 …...

北京南昌企业网站制作/怎么做盲盒

2019独角兽企业重金招聘Python工程师标准>>> 3:30 起床三件事 4:30 跳绳锻炼 7:00 回家做早饭 7:30 擦地搞卫生 8:10 吃饭 8:30 出门买水果 9:30 到家洗干净自己 10:00 坐在电脑前写blog 10:20 完成本周Memcache客户端改造后的压力测试 13:00 总结Memcache客户端改造…...

公司里面有人员增减要去哪个网站做登记/手机怎么创建网站

linux使用串口说明发布时间:2008-11-18 21:05:49来源:红联作者:emex我是做系统集成的工程师&#xff0c;所以在日常的工作中会经常要用notebook调试ROUTER 或者SWITCH&#xff0c;然而当操作系统换成了linux后就傻眼了&#xff0c;在网上也参考了一些资料&#xff0c;结合自己的…...

九龙坡区建设二校的网站/神马seo教程

资料下载 coding无法使用浏览器打开&#xff0c;必须用git工具下载&#xff1a; git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git视频观看 百问网驱动大全 I2C接口触摸屏驱动分析 参考资料&#xff1a; Linux 5.x内核 Documentation\de…...

杭州电子网站建设方案/百度浏览器打开

基本数据类型python的基本数据类型如下:1. int > 整数. 主要用来进行数学运算2. str > 字符串, 可以保存少量数据并进行相应的操作3. bool>判断真假, True, False4. list> 存储大量数据.用[ ]表示5. tuple> 元组, 不可以发生改变 用( )表示6. dict> 字典, 保…...

网站流量做那些好/seo外包顾问

Windows XP是一款经典的操作系统&#xff0c;同时也是一款很老的操作系统&#xff0c;不过尽管如此&#xff0c;还是有一批用户在使用XP系统&#xff0c;所以发行一些软件的时候还是要测试在XP系统中能否运行&#xff0c;这时候我们就可以借助VirtualBox虚拟机安装一个XP系统来…...