首页 > 系统相关 >shell语言

shell语言

时间:2023-03-14 21:14:52浏览次数:33  
标签:输出 shell 语言 echo abc awk print root

标准格式

  1. 声明解释器
  2. 注释脚本功能、变量的含义等
  3. 无交互的可执行代码

执行脚本的方式

  1. 添加x执行权限:绝对路径或相对路径运行
  2. 使用bash命令:新开启一个子进程运行
  3. 使用source命令:使用当前解释器运行

变量

自定义变量

变量名称=变量的值(=两边没有空格)

变量名可使用英文大小写,数字,下划线组成不能使用特殊符号,不能以数字开头

环境变量

env 显示所有环境变量,与查找连用

set 显示所有变量,与查找连用

环境变量 含义

USER 当前登录的用户名

HOSTNAME 当前系统主机名

HOME 用户的家目录

PWD 当前所在路径

UID 用户的uid

SHELL 当前登录的解释器

PS1 一级提示符 [\u@\h \W]$

PS2 二级提示符

RANDOM 随机生成0~32767之间的整数数字

位置变量和预定义变量

$1 #执行脚本后的第一个参数

$0 #显示脚本或程序的名称

$# #统计所有位置参数的个数

$* #显示所有参数

$$ #显示进程PID号

$? #返回上一条命令的状态值 0为正常 其它异常

变量扩展

双引号 "" ,界定字符串范围

touch a b #创建2个文件

touch “a b” #创建一个文件

单引号 ' ' ,界定字符串范围,可屏蔽特殊符号

a=10 #定义一个变量

echo "$a" #输出10 echo '$a' #输出$a

反撇号 ``,得到命令的执行结果

a=`date`

echo $a #输出为date的执行结果

read命令

从键盘获取变量的值,-p:给出提示信息创建用户名及密码的脚本,不显示密码

#!/bin/bash

read -p "请输入用户名" a useradd $a

stty -echo

read -p "请输入密码" p stty echo

#屏蔽回显

#恢复回显

echo $p | passwd --stdin $a

全局变量

普通定义的变量是局部变量

发布全局变量可以在任何解释器中使用格式:export 变量名

shell运算方法

1.

expr #运算符号两边需要空格 支持变量

expr $a + 1

expr

1

- $a

expr

2

\* 2 #乘法,需用转义符号\屏蔽*的特殊含义

expr

2

/ 2

expr

5

% 2 #求模,取余数

2.

echo $[a+1] #支持变量

echo $[a/b]

3.

let #运算结果不显示,通常针对变量使用,创建变量,可以修改变

量的值

a=10

b=20

let c=a+b #创建变量c,值是10+20 echo $c #变量c=30

let c=20-a #修改现有变量c的值echo $c #变量c=10

一般写法 主流写法

let c=c+1 let c++

let c=c-1 let c--

let c=c+2 let c+=2

let c=c 2 let c =2

  1. bc计算器,可进行小数运算

echo "1+1" | bc #非交互式使用bc

echo "1.1+1" | bc

echo "10/3" | bc

echo "scale=3;10/3" | bc #scale=数字,表示输出小数点后几位数

条件测试

使脚本具备智能判断的工具

方法1:test 表达式方法2:[表达式]

字符串

操作符 含义

-z 字符串的值为空

-n 字符串的值不为空(相当于!-z)

== 两个字符串相同

!= 两个字符串不同

整数值

操作符 含义

-eq 等于(Equal)

-ne 不等于(Not Equal)

-gt 大于(Greater Than)

-lt 小于(Lesser Than)

-ge 大于或等于(Greater or Equal)

-le 小于或等于(Lesser or Equal)

文件状态

操作符 含义

-e 判断对象是否存在(Exist),若存在则为真

-d 判断对象是否为目录(Directory),是则为真

-f 判断对象是否为一般文件(File),是则为真

-r 判断对象是否有可读(Read)权限,有则为真

-w 判断对象是否有可写(Write)权限,有则为真

-x 判断对象是否有可执行(eXcute)权限,有则为真

组合多个条件

操作符 含义

&& 并且 ,符号前面的任务执行成功后才执行后面的任务

|| 或者 ,符号前面的任务执行失败后才执行后面的任务

if判断

  1. 单分支

if 条件测试;then

执行指令

fi

#条件测试每个字符串之间都要有空格

  1. 双分支

if 条件测试;then

执行指令1

else

执行指令2

fi

#条件测试每个字符串之间都要有空格

  1. 多分支

if 条件测试;then #条件测试每个字符串之间都要有空格

执行指令1 elif 条件测试;then

执行指令2

......

else

执行指令n #第n个指令

fi

for循环

可以定义多次反复执行某任务的工具,有次数的循环

for 变量名称 in 值1 值2 值3 ....

do

执行任务

done

编写pingIP地址通与不通的脚本

#!/bin/bash x=0

y=0

for i in {1..15} do

ping -c 3 -i 0.2 -W 1 172.25.0.$i &> /dev/null # -c

测试次数 -i 间隔时间 -W 测试失败后反馈时间

if [ $? -eq 0 ];then

echo "172.25.0.$i通了"

let x++

else

echo "172.25.0.$i不通" let y++

fi

done

echo "$x台通了,$y台不通"

while循环

无次数限制

while 条件测试

do

执行指令

done

while : #表示无限循环

case分支

功能类似if,不如if强大,比if精简

case 变量 in

模式1)

命令序列1 ;;

模式2)

命令序列2 ;;

.. ..

*)

默认命令序列

esac

使用case分支编写控制nginx的脚本:

#!/bin/bash case $1 in

on)

/usr/local/nginx/sbin/nginx ;; #开启nginx服务off)

/usr/local/nginx/sbin/nginx -s stop ;; #关闭服务

st)

netstat -ntulp | grep -q nginx #查看服务是否开启

[ $? -eq 0 ] && echo "服务开启" || echo "服务未开启" ;;

re)

/usr/local/nginx/sbin/nginx -s stop

/usr/local/nginx/sbin/nginx ;;

*)

echo "on | off | st | re" esac

注:netstat -ntulp | grep :80 查询80端口被什么服务占用

echo -e "\033[31m字符串\033[0m" 改变字体颜色

控制循环命令

命令 含义

Exit 终止循环的同时也终止了脚本

break 终止循环,继续执行循环后的任务

continue 终止当前循环,进行下一次循环

从键盘循环取整数(0结束)并求和,输出最终结果

#!/bin/bash x=0

while :

do

read -p "请输入数字(0是结束)" n [ $n -eq 0 ] && break

let x+=n

done

echo "一共是$x"

找出1~20以内6的倍数,并输出她的平方值

#!/bin/bash

for i in {1..20} do

x=$[i%6]

[ $x -eq 0 ] || continue echo $[i*i]

done

字符串处理

字符的截取:

${变量名:起始位置:长度}

a=abcdef

#定义变量,起始位置从0开始

echo ${a:1:2} #截取变量a的值,从第2位开始截取,一共截取2位

获取8位随机密码

#!/bin/bash

a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123 456789 #定义变量

for i in {1..8} #执行语句循环8次

do

x=$[RANDOM%62] #定义x变量从0-61

p=${a:x:1} #截取a的值,从第x位开始,截取1位pa=$pa$p #循环一次追加赋值一次

done

echo $pa #输出8位随机密码

  1. 字符的替换

${变量名称/old/new}

a=aabbcc

#定义一个变量

echo ${a/a/b} #替换1个a为b

echo ${a//a/b} #替换所有a为b echo ${a/aa/bb} #替换aa为bb

echo ${a/aa/} #将aa替换为空,相当于删除

  1. 字串的删除

${变量名称#删除的内容} 掐头

a=`head -1 /etc/passwd` #创建变量

echo ${a#root} #从左往右删除到第一个root echo ${a##*root} #从左往右删除到最后一个root

${变量名称%删除的内容} 去尾

a=`head -1 /etc/passwd` #创建变量

echo ${a%root*} #从右往左删除到第一个root以及root右边所有echo ${a%%root*} #从右往左删除到最后一个root

批量修改文件扩展名的脚本

#!/bin/bash

for i in `ls *.txt` do

x=${i%.*} mv $i $x.doc

done

#优化后#!/bin/bash

for i in `ls *.$1` do

x=${i%.*} mv $i $x.$2

done

  1. 设置变量的初值(备用值)

${变量名称:-初值}

编写脚本,用户配置密码时如果没有定义则使用123456

#!/bin/bash

read -p "请输入用户名" n useradd $n

read -p "请输入密码" p

echo ${p:-123456}| passwd --stdin $n

函数

将公共的语句块存储在一个函数名中,达到精简脚本,增加可读性的目的

#格式1:

function 函数名 {

命令序列

.. ..

}

#格式2:

函数名 () {

命令序列

.. ..

}

正则表达式

基本正则

正则符号 描述信息

正则符号 描述信息

^ 匹配行首

$ 匹配行尾

[] 集合,匹配集合中的任意单个字符

[^] 对集合取反

. 匹配任意单个字符

匹配前一个字符的任意次数,不可单独使用

\{n,m\} 匹配前一个字符n到m次

\{n\} 匹配前一个字符n次

\{n,\} 匹配前一个字符n次及n次以上

\(\) 保留

扩展正则

正则符号 描述信息

+ 最少匹配一次

? 最多匹配一次

{n,m} 匹配前一个字符n到m次

() 保留

| 或者

\b 单词边界,可用\>代替

Grep过滤工具

选项 描述

-i 忽略字母大小写

-e 支持扩展正则,可简写egrep

-v 取反

-c 统计匹配的行数

-q 静默、无任何输出,一般用于检测

-n 显示出匹配结果所在的行号

--color 标红显示匹配字串

sed 流式编辑器

能够实现对文本非交互式的增删改查,逐行处理

  1. 使用方法:
    1. 前置命令 | sed 选项 '条件+编辑指令'

sed 选项 '条件+编辑指令' 文档

选项 描述

-n 屏蔽默认输出

-r 支持扩展正则,若与其他选项一起使用,应作为首选项

-i 直接修改文件内容

操作指令

操作符

用途

示例

p

打印行

2p 输出第2行

d

删除行

2d 删除第2行

s

字符串替换

s/old/new/ 将每行的第一个old替换为new

i

行前插入文本

2iYY 在第二行之前添加文本YY

a

行后插入文本

2aYY 在第二行之后添加文本YY

c

替换当前行

2cYY 将第2行的内容修改为YY

  1. 输出、打印文本

sed

sed

-n

-n

'p' user

'1p' a.txt

#输出所有文档的内容, 没有默认的输出

#输出文档的第一行

sed

-n

'1,3p' a.txt

#输出1~3行

sed

-n

'2p;5p' a.txt

#输出第2行和第5行

sed

-n

'2,+1p' a.txt

#输出第2行以及后面的1行

sed

-n

'1~2p' a.txt

#输出第1行之后每间隔一行再输出

sed

-n

'2~2p' a.txt

#输出第2行之后每间隔一行再输出

sed

-n

'/^bin/p' a.txt

#输出以bin开头的行

sed

-n

'=' a.txt

#查看行号

sed

-n

'$=' a.txt

#查看最后一行行号

sed

-n

'$p' user

#查看最后一行

删除文本

不加-i选项只做输出,不修改文件

sed '1d' a.txt

#删除第一行

sed '1,3d' a.txt #删除1~3行

sed '3,+2d' a.txt #删除第3行以及后面2行

sed '1d;5d' a.txt #删除第一行和第5行

替换文本

sed 's/old/new/'

sed 's/2017/XXXX/' test

#替换,替换符/可更换

#替换所有行的第一个2017为XXXX

sed 's/2017/XXXX/2' test #替换所有行的第2个

sed '1s/2017/XXXX/' test #替换第1行的第一个2017

sed 's/2017/XXXX/g' test #替换所有行的所有2017

  1. 删除文本中每行的第2个字符与最后一个字符

sed 's/.//2;s/.$//' nssw #中间用分号隔开

  1. 将第一个字符和最后一个字符替换

sed -r 's/(a)(b)(c)/\1\2\3/' abc #保留之后按原顺序粘贴

sed -r 's/(a)(b)(c)/\3\2\1/' abc #更换顺序

sed -r 's/(.)(.)(.)/\3\2\1/' abc #使用正则符号增加匹配范围sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc #(.)任意字符,(.*)所有字符,不管长短

  1. 编写脚本,一键部署可以匿名上传的ftp服务

#!/bin/bash

yum -y install vsftpd #安装vsftpd

sed -i 's/#anon_u/anon_u/' /etc/vsftpd/vsftpd.conf #修改配置文件

systemctl restart vsftpd

systemctl enable vsftpd

chmod 777 /var/ftp/pub #为共享文件夹添加权限

awk 精确搜索

使用方法

1, awk 选项 (条件)指令 被处理的文件

2, 前置指令 | awk 选项 (条件)指令

  1. 选项与指令

选项

指令

-F

print

#指定分隔符,可省略(默认空格或tab位)

内置变量

变量 用途

FS 保存或设置字段分隔符,例如:FS=":",与-F一样

$n 指定分隔的第n个字段,$1表示第一列

$0 当前读入的整行文本内容

NR 行数

NF 列数

awk '{print}' test awk '{print $1}' test

awk '{print $1 $2}' test awk '{print $0}' test awk '{print $1,$0}' test

awk -F/ '{print $3}' user

#输出所有行

#输出所有行的第1列

#输出所有行的第1列第2列t #输出所有列

#输出第一列后 再输出所有列

#使用/做分隔符,输出第3列

awk -F[:/] '{print $9}' user #使用:或/做分隔符,输出第9列

awk -F: '{print $1"的解释器是"$7}' user #变量+常量组合输出,常量用""引起来

df -h | awk '/vda1/{print "当前主机根分区可用空间是 "$4}' ifconfig eth0 |awk '/RX p/{print "当前主机eth0的接收流量是"$5"字节"}'

ifconfig eth0 |awk '/TX p/{print "当前主机eth0的发送流量是"$5"字节"}'

如何输出 "主机内存剩余空间是XXX"

free -h |awk '/^Mem/{print "主机内存剩余空间是"$4}'

主机内存剩余空间是93M

/var/log/secure

#安全日志路径

awk '/Failed/{print $11}' /var/log/secure #在安全日志中查

找访问本机密码输入失败的主机ip

awk的处理时机

  1. BEGIN{任务}
  2. {任务}
  3. END{任务}

#开始时执行1次

#逐行任务,执行N次

#结束时执行1次

example:

awk 'BEGIN{x=10;print x}' user #定义变量,然后输出变量,执行1次awk '{x=10;print x}' user #执行多次

awk 'END{x=10;print x}' user #执行1次

awk 'BEGIN{print NR}' user

显示0

awk 'END{print NR}' user

显示最后一行的行号

#显示行号,由于在逐行任务之前,

#显示行号,由于在逐行任务之后,

awk 'BEGIN{x=0}{x++}END{print x}' user #先定义变量,然后每一

行将这个变量+1,最后输出变量的值

\t #相当于tab,具有一定的排版功能,制表符,是常量awk -F: 'BEGIN{print "User\tUID\tHOME"}{print

$1"\t"$3"\t"$6}END{print "总计"NR"行"}' user

  1. awk的条件
  2. 使用正则:/正则/ ~ 包含 !~ 不包含

awk '/^root/{print}' user

awk '/^root|^bin/{print}' user awk -F: '$1~/root/{print}' user

#基本正则匹配

#扩展正则匹配

#找第1列包含root的行

awk -F: '$1!~/root/{print}' user #找第1列不包含root的行

awk -F: '$1!~/root/' user #任务仅仅是{print}时,可以省略不写

  1. 使用数字或字符串

== != > < >= <=

awk 'NR==2{print}' user awk 'NR==2' user

awk 'NR<4' user

awk 'NR<=3' user

#输出第2行

#简写,效果同上#找1~3行

#效果同上

awk -F: '$1=="root"{print}' user #找第1列必须等于root的

awk -F: '$1~/root/{print}' user #找第1列包含root的awk -F: '$1!="root"{print}' user #找第1列不等于root的awk -F: '$3==0{print}' user #找uid等于0的

awk -F: '$3==0{print $1}' user #找uid等于0的,再输出第一

  1. 逻辑测试条件

&& 前后条件都匹配 || 前后条件匹配之一

awk -F: '$3>=1000&&$3<2000' /etc/passwd 1000并且小于2000的

awk -F: '$3<10||$3>1000' /etc/passwd

或者大于1000的

awk -F: '$3<10&&$3>1000' /etc/passwd

没有

awk 'NR>=2&&NR<=4' user

#找uid是大于等于

#找uid是小于10

#逻辑错误,什么都#找2~4行

  1. 运算符

+

++

-

--

*

+=

/

-=

%

*=

/=

awk 'NR%2==1{print}}' a.txt #输出奇数行文本

awk 'BEGIN{i=0}{i+=NF}END{print i}' a.txt #统计文本的总字段个数

seq 200 | awk 'BEGIN{i=0}($0%3==0)&&($0%13==0)

{i++}END{print}' #计算能同时被3和13整除的整数个数

awk中的if判断

awk -F: '{if($3<10){x++}}END{print x}' user #使用单分支,

如果第3列小于10,就把x+1,最后输出x的值

awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd #

使用单分支

awk -F: '{if($3>=1000){x++}else{y++}}END{print x,y}'

/etc/passwd #使用双分支, 如果第3列大于等于10,把x+1,否则y+1, 最后输出x和y的值

awk -F: '{if($1~/root/){x++}else{y++}}END{print x,y}'

/etc/passwd #如果第1列包含root,把x+1,否则y+1,最后输出这些值

  1. awk数组

数组可以理解为能存储多个值的特殊变量使用方法 : 数组名[下标]=值

注:下标与值定义都比较自由

awk 'BEGIN{a[1]=100;a[2]=200;print a[1]}' #定义两个数组,并

输出其中一个

awk 'BEGIN{a[1]=100;a[2]=200;print a[2]}'

awk 'BEGIN{a[88]=100;a[2]=200;print a[1]}' #下标不存在,无任何输出

awk 'BEGIN{a[88]=100;a[2]=200;print a[88]}' #修改了下标,输出时也修改

awk 'BEGIN{abc["a"]=100;abc["b"]="xyz";print

abc["a"],abc["b"]}' #下标和值不仅可以用数字, 其他字符也可以,但要加双引号

awk 'BEGIN{abc["192.168.0.1"]=100;abc["192.168.0.2"]="xyz";pri

nt abc["192.168.0.2"]}'

awk数组与for循环遍历数组

for(变量名称 in 数组名称){执行指令}

for循环在遍历数组时的变量名称是数组的下标,而不是值!

awk 'BEGIN{abc[1]=10;abc[2]=20;for(i in abc){print i }}' #定义数组abc,分别有2个下标和2个值,然后交给for循环输出下标

awk 'BEGIN{abc[1]=10;abc[2]=20;for(i in abc){print abc[i]

}}' #定义数组abc,分别有2个下标和2个值,然后交给for循环输出值awk 'BEGIN{abc[1]=10;abc[2]=20;for(i in abc){print i,abc[i] }}' #下标和值都输出

[root@server0 opt]# cat abc abc

abc xyz opq abc

opq

awk '{a[$1]++}END{for(i in a){print i}}' abc #使用awk数组

+for循环, 显示abc中不同的行

awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc #使用awk数组+for循环, 显示abc中不同的行以及这行出现了几次

[root@server0 opt]# cat abc abc 192.168.0.10

abc 192.168.0.10

xyz 192.168.0.20

opq 192.168.0.30

abc 192.168.0.10

opq 192.168.0.30

awk '{ip[$2]++}END{for(i in ip){print i,ip[i]}}' abc #输出同一ip的出现次数

使用awk统计网站访问量:

1,安装httpd服务

yum -y install httpd 2,开启服务,将防火墙临时关闭

systemctl restart httpd

systemctl stop firewalld

3,使用其他主机访问该网站,每次访问的记录会存在网站日志中curl http://172.25.0.11

4,查看/var/log/httpd/access_log保存了客户的访问记录tail -1 curl http://172.25.0.11

5,使用awk统计访问次数

awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log #统计次数,以及访问者的ip

awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log | sort -n -r #统计次数,以及访问者的ip,并排序

sort命令可以用来排序 -n是以数字排序 -r是降序

ab -n 1000 -c 1 http://172.25.0.11/

-n 访问次数,-c 并发访问量 #增加访问记录,然后在使用awk输出信息查看

编写监控脚本

#!/bin/bash while :

do

uptime |awk '{print "cpu的平均负载是"$10 , $11 ,$12}' ifconfig eth0 |awk '/RX p/{print "主机eth0网卡的接收流量是"$5"字节"}'

ifconfig eth0 |awk 'NR==7{print "主机eth0网卡的发送流量是"$5"字节"}'

free -h |awk '/Mem/{print "主机内存剩余容量是"$4}' df -h | awk '/vda1/{print "主机根分区 剩余容量是"$4}'

awk 'END{print "计算机的用户数量是"NR"个"}' /etc/passwd uptime | awk '{print "当前登录用户数量是" $6}'

p=`ps aux | wc -l`

echo "主机运行的进程数量是$p个" m=`rpm -qa | wc -l`

echo "本机已经安装的软件包数量是$m个" sleep 3 #睡眠3秒

clear #清屏done

编写脚本, 监控主机,当有人尝试访问本机输入密码失败超过3次后发邮件通知管理员

#!/bin/bash

x=`awk '/Failed/{ip[$11]++}END{for(i in ip){print ip[i]","i} }' /var/log/secure` #先使用awk找出次数,ip for l in $x #将找出的次数与ip交给for循环

do

h=${l%,*} #去尾,得到次数p=${l#*,} #掐头,得到ip

[ $h -gt 3 ] && echo "$p访问本机输入密码错误$h次" | mail -s test root #如果次数大于3,发邮件把ip通知管理员

done

sort排序

sort可针对文本文件的内容,以行为单位来排序。不加选项,默认升序

选项 描述

-b 从第一个可见字符开始比较,忽略每行前面开始出的空格字符。

-c

会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

-f 排序时,将小写字母视为大写字母。

-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

-m 将几个排序好的文件进行合并。

-M 将前面3个字母依照月份的缩写进行排序。比如JAN小于FEB 等等

-n 依照数值的大小排序。

-o 将排序后的结果存入指定的文件。

-r 以相反的顺序来排序。

-t<分隔字符> 指定排序时所用的栏位分隔字符。

+<起始栏位>-<结 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏束栏位> 位。

--version 显示版本信息

--help 显示帮助。

-u 在输出行中去除重复行。

-k 指定列数

-h 按照文件大小倒序显示

[root@zhoucentos log]# cat date 2017-12-02

2017-01-09

2017-10-23

2017-04-24

[root@zhoucentos log]# sort -n -k 2 -t'-' date 2017-01-09

2017-04-24

2017-10-23

2017-12-02

uniq命令

uniq 不会检查重复的行,除非它们是相邻的行。

选项 描述

-c 在每行前加上表示相应行目出现的重复次数

-d 只输出重复的行

-D 显示所有重复的行

-u 只显示唯一的行

-i 忽略大小写字符的不同;

cut命令

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut是以每一行为一个处理对象的,这种机制和sed是一样的

选项 描述

-d 后面接分隔字符。与 -f 一起使用;

-f 依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;

-c 以字符 (characters) 的单位取出固定字符区间;

[root@www ~]# echo $PATH

/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bi n:/usr/games

# 1 : 2 : 3 : 4 : 5 : 6 : 7

将 PATH 变量取出,我要找出第五个路径。

[root@www ~]#echo $PATH | cut -d ':' -f 5

/usr/local/bin

将 PATH 变量取出,我要找出第三和第五个路径。

#echo $PATH | cut -d ':' -f 3,5

/sbin:/usr/local/bin

将 PATH 变量取出,我要找出第三到最后一个路径。

echo $PATH | cut -d ':' -f 3-

/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

将 PATH 变量取出,我要找出第一到第三个路径。

#echo $PATH | cut -d ':' -f 1-3

/bin:/usr/bin:/sbin:

实用例子:只显示/etc/passwd的用户和shell #cat /etc/passwd | cut -d ':' -f 1,7 root:/bin/bash

daemon:/bin/sh bin:/bin/sh

wc命令

统计文件里面有多少单词,多少行,多少字符。

选项 描述

-l 统计行数

-w 统计单词出现次数

-m 统计文件的字节数

#wc /etc/passwd

40 45 1719 /etc/passwd

节数

#40是行数,45是单词数,1719是字

#wc -l /etc/passwd #统计行数,在对记录数时,很常用

40 /etc/passwd #表示系统有40个账户

#wc -w /etc/passwd #统计单词出现次数

45 /etc/passwd

#wc -m /etc/passwd #统计文件的字节数1719

标签:输出,shell,语言,echo,abc,awk,print,root
From: https://www.cnblogs.com/zj-cloud/p/17216353.html

相关文章

  • C语言
    01-C语言概述 C语言概述1.什么是C语言C语言就是人和计算机交流的一种语言语言是用来交流沟通的。有一方说,有另一方听,必须有两方参与,这是语言最重要的功能:说的一方......
  • 数据结构-C语言
    一、基本定义1、数据数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。数据结构:是相互之间存在一种或多种特定关系......
  • python语言基础
    python语言基础1.1python语法特点1.1.1注释规则什么是注释?所谓注释,就是在代码中添加标注性的文字,进而更好的帮助我们更好的阅读代码,注释又分为单行注释和多行注释。......
  • Linux & 标准C语言学习 <DAY13>
    一、字符串  字符:类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号  串:是一种数据结构,存储类型相同的若干个数据,对于串型结构......
  • shell使用-awk
    工作原理:当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执......
  • 快速上手Meta大语言模型LLaMA,构建“本地化ChatGPT”
    近期,Meta发布了人工智能大语言模型LLaMA,包含70亿、130亿、330亿和650亿这4种参数规模的模型。其中,最小的LLaMA7B也经过了超1万亿个tokens的训练。本文我们将以7B模型为例,分......
  • shell使用-基本正则和常用例子
    元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。......
  • 开源免费:分享powershell读写k8s的etcd的脚本库
      powershelletcdreadwriteputgetdelkubernetesk8s读写博客园---【前言】--- 篡改记忆=写入你脑仁,这是一项可怕的技术!它可以很容易把猫的爸爸,篡改成狗狗......
  • 32位汇编语言实现求数组的最大值
    INCLUDEIrvine32.inc.dataarrdd99,2,3,1,22,188,7,77,54,10;定义数组 lendd($-arr)/4;用当前地址减去数组首元素地址除以4得到数组的长度.codemainPROC......
  • 32位汇编语言实现冒泡排序
    INCLUDEIrvine32.inc.dataarrdd99,2,3,1,22,88,7,77,54;定义数组lendd($-arr)/4;定义数组的长度变量.codemainPROCmovedx,offsetarr......