与grep命令不同的是,grep命令只是将符合条件的内容查找出来,并不会做其他什么操作。而cut命令会将内容提取
cut [选项] 文件名
-f 列号:提取第几列
注意:cut 命令的默认分隔符是制表符,也就是 Tab 键,对空格符支持得不怎么好,若要使用其他分隔符需要和[-d 选项]一起使用,通过-d声明指定的分隔符
-d 分隔符:按照指定分隔符分割列
-c 字符范围:不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段提取。"n-"表示从第 n 个字符到行尾;"n-m"表示从第 n 个字符到第 m 个字符;"-m"表示从第 1 个字符到第 m 个字符;
例子:
存在student.txt文件
id name sex
1 james m
2 jack m
3 rose f
命令: cut -d " " -f 2,3 ./student.txt
输出结果表示:以空格为分隔符截取第二列和第三列的内容
结果:
name sex
james m
jack m
rose f
Shell printf格式化输出命令
和print区别是:print 会在每个输出之后自动加入一个换行符;而 printf 是标准格式输出命令,并不会自动加入换行符,如果需要换行,则需要手工加入换行符
printf '输出类型输出格式' 输出内容
%ns:输出字符串。n 是数字,指代输出几个字符
%ni:输出整数。n 是数字,指代输出几个数字‘’
%m.nf: 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如 %8.2f 代表共输出 8 位数,其中 2 位是小数,6 位是整数
\a: 输出警告声音
\b:输出退格键,也就是 Backspaced 键
\f:清除屏幕
\n:换行
\r:回车,也就是 Enter 键
\t:水平输出退格键,也就是 Tab 键
\v:垂直输出退格键,也就是 Tab 键
例子:
存在文本文件:student.txt
id name gender
1 james m
2 jack m
3 rose f
命令 printf '%s\n\t' $(cat ./student.txt)
结果:
id
name
gender
1
james
m
2
jack
m
3
rose
f
Shell awk命令详解(格式+使用方法)
相比较于cut,awk的特点是无论是空格还是tab键分隔符都可以被识别,而cut却做不到这一点
awk '条件1 {动作 1} 条件 2 {动作 2} …' 文件名
条件类型 条 件 说 明
awk保留字 BEGIN 在 awk 程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次
awk保留字 END 在 awk 程序处理完所有数据,即将结束时执行?END 后的动作只在程序结束时执行一次
关系运算符 > 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
!= 不等于
A~B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串
A!~B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
正则表达式 /正则/ 如果在“//”中可以写入字符,则也可以支持正则表达式
sed [选项] '[动作]' 文件名
-n:一般 sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过 sed 命令处理的行输出到屏幕上
-e: 允许对输入数据应用多条 sed 命令编辑
-f 脚本文件名:从 sed 脚本中读入 sed 操作。和 awk 命令的 -f 选项非常类似
-r:在 sed 中支持扩展正则表达式
-i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作
a \:追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
c \:行替换,用c后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结
i \:插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
d:删除,删除指定的行
P:打印,输出指定的行
s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和Vim中的替换格式类似)
单分支 if 条件语句
if [条件判断式];then
程序
fi
注意:[条件判断式] 就是使用 test 命令判断,所以中括号和条件判断式之间必须有空格。
df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1
双分支if条件语句
if [条件判断式]
then
当条件判断式成立时,执行的程序
else
当条件判断式不成立时,执行的另一个程序
fi
多分支if条件语句
if[条件判断式1]
then
当条件判断式1成立时,执行程序1
elif [条件判断式2]
then
当条件判断式2成立时,执行程序2
…省略更多条件...
else
当所有条件都不成立时,最后执行此程序、
fi
Shell case 多分支条件判断
case $变量名 in
"值 1")
;;
如果变量的值等于值1,则执行程序1,值
2")
如果变量的值等于值2,则执行程序2
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
例子:获取用户输入,并对用户输入做判断
read -t 30 -p "please user enter something:" str
case $str in
"yes")
echo "user have entered yes"
;;
"no")
echo "user have entered no"
;;
*)
echo "user entered wrong message"
;;
esac
Shell for循环的使用详解
for 变量 in 值1 值2 值3…
do
程序
done
for ((初始值;循环控制条件;变量变化))
do
程序
done
例子:for循环从1+2+3...+99+100
for((i= 1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo "1+2+3...+99+100="$s
Shell while 循环及其用法
while [条件判断式] (注意:while和条件判断式之间存在一个空格,还有就是条件判断式两边的空格)
do
程序
done
对于 while 循环来讲,只要条件判断式成立,循环就会继续;一旦条件判断式不成立,循环就会停止
例子:for循环从1+2+3...+99+100
echo "use while to test 1 plus to 100"
i=1
s=0
while [ $i -le 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo "1+2+3+...+99+100=$s"
Shell until循环及其用法
until [条件判断式]
do
程序
done
对于 until 循环来讲,只要条件判断式不成立,循环就会继续;一旦条件判断式成立,循环就会停止
例子:for循环从1+2+3...+99+100
x=1
y=0
until [ $x -ge 101 ]
do
y=$(($y+$x))
x=$(($x+1))
done
echo "1+2+3+...+99+100=$y"
Shell函数及其用法
function 函数名(){
程序
}
函数也有自己的位置参数变量,$0 代表函数名,$1 代表函数的第 1 参数,$2 代表函数的第 2 个参数,以此类推
例子:重写1-100的加法运算,使用函数
function sum(){
s=0
for((i=1;i<=$1;i=i+1)) #循环框为双括号
do
s=$(($i+$s))
done
echo "1+2+3+...+$1=$s"
}
read -t 30 -p "please enter a number:" num
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ];then
sum $num
else
echo "please enter a valid number"
fi
Shell exit流程控制语句及用法
在linux命令中exit命令代表退出当前登录,而在shell脚本中,exit代表退出当前脚本
exit [返回值]
(返回值可以由$?命令查看)
例子:利用exit退出脚本,并且定义返回值
read -t 30 -p "please enter a number:" num
y=$(echo $num | sed 's/[0-9]//g')
[ -n "$y" ] && echo "Error! please enter a number" && exit 500
echo "user entered the number is:$num"
Shell break和continue循环控制语句及其用法
break和continue都可以用来退出循环,而它们之间的不同之处在于,break退出的是当前整个循环,而continue退出的是单次当前循环
break例子:
for((i=1;i<=10;i=i+1))
do
if [ "$i" -eq 5 ];then
break
fi
echo "current number is:$i"
done
continue例子:
for((i=1;i<=10;i=i+1))
do
if [ "$i" -eq 5 ];then
continue
fi
echo "current number is:$i"
done