❤️开发人员 shell 编程快速入门(持续更新)❤️

本文主要面向开发人员快速简单了解 shell 编程的基础知识,能够看懂并编写一些简单的 shell 脚本,并不能做到面面俱到,只会展示一些常见的用法(如果想要全面了解 shell 编程,推荐阅读书籍《Linux命令行与shell脚本编程大全》)。

因大多数命令直接在 XShell 控制台运行的效果与在 shell 脚本中的运行效果一致,故本文中的很多操作将直接在控制台运行。

1. Shell 解释器

Shell 是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell 是一个功能强大的编程语言,易编写、易调试、灵活性强。

Linux 提供默认的 Shell 解释器,可通过命令行 cat /etc/shells 查看。

# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux
/usr/bin/screen

本文默认使用 /bin/bash 解释器,每个 shell 脚本第一行需要指定要使用的 Shell 解释器 #!/bin/bash,不指定则会调用系统默认的 Shell 解释器。

2.第一个 Shell 程序

下面来编写第一个 Shell 脚本,在控制台输出 " Hello World ! "。

脚本文件命名推荐以 .sh 结尾,保持良好的命名规范,第一行输入 #!/bin/bash 指定脚本解释器。

ubuntu@VM-0-9-ubuntu:~/shell$ touch hello.sh 
ubuntu@VM-0-9-ubuntu:~/shell$ vim hello.sh 
#!/bin/bash
echo Hello World !

运行 Shell 脚本有两种方式:

(1)通过脚本解释器命令运行(即使文件没有执行权限,也可以运行)

ubuntu@VM-0-9-ubuntu:~/shell$ bash hello.sh 
Hello World !

(2)赋予文件可执行权限后,直接运行

ubuntu@VM-0-9-ubuntu:~/shell$ chmod +x hello.sh 
ubuntu@VM-0-9-ubuntu:~/shell$ ./hello.sh 
Hello World !

3. Shell 中的变量

3.1 系统变量

系统变量为全局变量,在任意 SHELL 脚本中都可以直接获取.可通过 env 命令查看在 SHELL 中能获取的所有系统变量。

ubuntu@VM-0-9-ubuntu:~/shell$ env
SSH_CONNECTION=113.247.47.242 22638 172.17.0.9 22
LANG=en_US.utf8
HISTTIMEFORMAT=%F %T 
XDG_SESSION_ID=306891
USER=ubuntu
PWD=/home/ubuntu/shell
HOME=/home/ubuntu
..................

  • 获取变量的方式

$变量名

ubuntu@VM-0-9-ubuntu:~/shell$ echo $USER
ubuntu

在获取变量时,还可以进行字符串中的拼接:“姓名:${USER}”,花括号可省略,但在拼接英文字符串时,需要加上避免产生歧义。

ubuntu@VM-0-9-ubuntu:~/shell$ echo "当前登录用户:${USER}"
当前登录用户:ubuntu

下面列举几个常用的系统变量:

表达式 含义
$HOME 获取当前系统用户主目录
$PWD 获取当前工作目录
$SHELL 获取当前所用脚本解释器名称
$USER 获取当前用户名

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ echo $HOME
/home/ubuntu
ubuntu@VM-0-9-ubuntu:~/shell$ echo $PWD
/home/ubuntu/shell
ubuntu@VM-0-9-ubuntu:~/shell$ echo $SHELL
/bin/bash
ubuntu@VM-0-9-ubuntu:~/shell$ echo $USER
ubuntu

3.2 自定义变量

基本语法:

变量=值

city="长沙市"
area="岳麓区"

注意事项:
(1)= 号两边不允许出现空格
(2)变量名称可以由数字、字母和下划线组成,不能以数字开头
(3)变量值推荐使用双引号括起来
(4)所有变量都默认为字符串类型,无法直接进行数值运算
(5)变量可以重新再次赋值

  • 获取字符串长度
    基本语法:

${#变量名}

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ city="长沙市"
ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    #city}
3
  • 截取字符串
    基本语法:

$`{ 变量名 : 起始位置(从 0 开始): 截取长度 }

示例:
从 0 开始,截取 5 个长度的字符串

ubuntu@VM-0-9-ubuntu:~/shell$ str="shell is a programming languages"
ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    str:0:5}
shell
  • 扩展用法
    (1)撤销变量 unset
ubuntu@VM-0-9-ubuntu:~/shell$ city="长沙市"
ubuntu@VM-0-9-ubuntu:~/shell$ echo $city
长沙市
ubuntu@VM-0-9-ubuntu:~/shell$ unset city
ubuntu@VM-0-9-ubuntu:~/shell$ echo $city

(2)只读变量 readonly ,声明后变量不能被更改,也不能被 unset

ubuntu@VM-0-9-ubuntu:~/shell$ readonly city="长沙市"
ubuntu@VM-0-9-ubuntu:~/shell$ unset city
bash: unset: city: cannot unset: readonly variable
ubuntu@VM-0-9-ubuntu:~/shell$ city="株洲市"
bash: city: readonly variable

(3) export 变量名,将当前变量提升为全局变量,供其他 Shell 程序使用

ubuntu@VM-0-9-ubuntu:~/shell$ name=zhangsan
ubuntu@VM-0-9-ubuntu:~/shell$ export name
ubuntu@VM-0-9-ubuntu:~/shell$ vim hello.sh 

#!/bin/bash
echo Hello World !
echo $name
ubuntu@VM-0-9-ubuntu:~/shell$ ./hello.sh 
Hello World !
zhangsan

3.3 数组

  • 定义数组
    基本语法:

数组名=(值1 值2 值3 …)

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ array=(1 2 3 4 5)
  • 通过下标获取元素(下标从0开始)
    基本语法:

${数组名[下标]}

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    array[0]}
1
ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    array[1]}
2
ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    array[2]}
3
  • 获取数组内全部元素
    基本语法:

${数组名[@]} 或 ${数组名[*]}

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    array[@]}
1 2 3 4 5
ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    array[*]}
1 2 3 4 5
  • 获取数组的长度
    基本语法:

${#数组名[@]} 或 ${#数组名[*]}

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    #array[*]}
5
ubuntu@VM-0-9-ubuntu:~/shell$ echo ${
    
    #array[@]}
5

3.4 特殊变量 $n

$n 表示获取执行脚本时,后面跟随的第几个参数(n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})。

ubuntu@VM-0-9-ubuntu:~/shell$ vim parameter.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
ubuntu@VM-0-9-ubuntu:~/shell$ bash parameter.sh a b c
parameter.sh
a
b
c

3.5 特殊变量 $#

$# 用于获取输入参数的个数,常用于循环。

ubuntu@VM-0-9-ubuntu:~/shell$ vim parameter.sh 
#!/bin/bash
echo "总计输入参数 $# 个"
echo $0
echo $1
echo $2
echo $3

ubuntu@VM-0-9-ubuntu:~/shell$ bash parameter.sh a b c
总计输入参数 3 个
parameter.sh
a
b
c

3.6 特殊变量 $*、$@

表达式 说明
$* 代表命令行中的所有参数,将所有输入参数当作一个整体
$@ 代表命令行中的所有参数,将每个参数区分对待

两者在打印上无任何区别,在循环时,$* 代表的数组长度为1,包含整个字符串,$@ 代表的数组长度为参数的个数,每个参数在数组中对应一个元素(可参照5.4 for 循环中两者的具体使用差异)。

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim parameter.sh 
#!/bin/bash
echo "总计输入参数 $# 个"
echo $0
echo $1
echo $2
echo $3
echo $*
echo $@
ubuntu@VM-0-9-ubuntu:~/shell$ bash parameter.sh a b c
总计输入参数 3 个
parameter.sh
a
b
c
a b c
a b c

3.7 特殊变量 $?

$?返回上一条执行命令的返回状态,变量值为 0 则执行成功,非 0 则证明上一个命令执行不正确,返回值的范围在 0 ~ 255 之间。

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ bash hello.sh 
zhangsan Hello World !
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
0
ubuntu@VM-0-9-ubuntu:~/shell$ bash hello_world.sh
bash: hello_world.sh: No such file or directory
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
127

4. 运算符

运算符 说明
+ 加法
- 减法
* 乘法
/ 除法
% 取余

基本语法一

$((运算式)) 或者 $[运算式]`

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ echo $((1+2))
3

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ echo $[2+3]
5

基本语法二

expr value1 运算符 value2

运算符与两个值之间必须保留空格

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ expr 2 \* 3
6
ubuntu@VM-0-9-ubuntu:~/shell$ expr 5 % 2
1

5. 流程控制

5.1 条件判断

基本语法:

[ condition ]

[ condition ] condition 与中括号之间必须有空格

常用判断条件如下:

表达式 含义
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
-r 具备读权限
-w 具备写权限
-x 具备执行权限
-f 文件存在,且为常规文件
-e 文件存在
-d 文件存在并是一个目录

示例:

ubuntu@VM-0-9-ubuntu:~/shell$  [ abc = abc ]
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
0
ubuntu@VM-0-9-ubuntu:~/shell$  [ 4 -ge 4 ]
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
0
ubuntu@VM-0-9-ubuntu:~/shell$  [ 5 -eq 2 ]
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
1
ubuntu@VM-0-9-ubuntu:~/shell$  [ -e hello.txt ]
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
0
ubuntu@VM-0-9-ubuntu:~/shell$  [ -x hello.txt ]
ubuntu@VM-0-9-ubuntu:~/shell$ echo $?
1

5.2 if 判断

基本语法一:

if [ 表达式 ] ; then
执行语句
fi

基本语法二:

if [ 表达式 ]
then
执行语句
fi

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim if.sh
#!/bin/bash
if [ $[$1%2] -eq 0 ] ;then
        echo "$1是偶数"
fi

或者

#!/bin/bash
if [ $[$1%2] -eq 0 ]
        then
                echo "$1是偶数"
fi

if-else 用法

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim if_else.sh 
#!/bin/bash
if [ $1 -gt 2 ]
then
        echo "$1大于2"
elif [ $1 -lt 2 ]
then
        echo "$1小于2"
else
        echo "$1等于2"
fi
ubuntu@VM-0-9-ubuntu:~/shell$ bash if_else.sh 1
1小于2
ubuntu@VM-0-9-ubuntu:~/shell$ bash if_else.sh 2
2等于2
ubuntu@VM-0-9-ubuntu:~/shell$ bash if_else.sh 3
3大于2
ubuntu@VM-0-9-ubuntu:~/shell$ bash if.sh 2
2是偶数
ubuntu@VM-0-9-ubuntu:~/shell$ bash if.sh 1
ubuntu@VM-0-9-ubuntu:~/shell$ 

5.3 case 语句

基本语法:

case $变量名 in
“vaule1”)
变量为value1,则执行程序1
;;
“vaule2”)
变量为value2,则执行程序2
;;
“vaule3”)
变量为value3,则执行程序3
;;
*)
如果变量不为以上的值,则执行此程序
;;

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim case.sh
#!/bin/bash
case $1 in
"a")
        echo "value值为a"
;;
"b")
        echo "value值为b"
;;
"c")
        echo "value值为c"
;;
*)
        echo "$1未匹配到任何值"
;;
esac
ubuntu@VM-0-9-ubuntu:~/shell$ bash case.sh a
value值为a
ubuntu@VM-0-9-ubuntu:~/shell$ bash case.sh b
value值为b
ubuntu@VM-0-9-ubuntu:~/shell$ bash case.sh c
value值为c
ubuntu@VM-0-9-ubuntu:~/shell$ bash case.sh d
d未匹配到任何值

5.4 for 循环

基本语法一:

for ((初始值;循环控制条件;变量变化))
do
执行代码
done

示例:
计算从1到100的和

ubuntu@VM-0-9-ubuntu:~/shell$ vim for1.sh 
#!/bin/bash
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo "和为=$s"
ubuntu@VM-0-9-ubuntu:~/shell$ bash for1.sh 
和为=4950

基本语法二:

for 变量 in 值1 值2 值3 …
do
执行代码
done

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim for2.sh
#!/bin/bash
for i in 1 2 3
do
        s=$[$s+$i]
done
echo "和为=$s"
ubuntu@VM-0-9-ubuntu:~/shell$ bash for2.sh 
和为=6

这里顺带来看一下特殊变量 $* 和 $@ 的区别:

ubuntu@VM-0-9-ubuntu:~/shell$ vim for_all.sh
#!/bin/bash
for i in $*
do
        echo "i=$i"
done

for j in $@
do
        echo "j=$j"
done
ubuntu@VM-0-9-ubuntu:~/shell$ bash for_all.sh a b c d
i=a
i=b
i=c
i=d
j=a
j=b
j=c
j=d

直接使用 $* 和 $@ 来获取所有参数并打印,貌似并未有任何区别。但它们被双引号 " " 包裹住之后,$* 所有的参数会被当做一个整体来看待,$@ 中的每个参数仍然被当做个体处理。

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim for_all.sh
#!/bin/bash
for i in "$*"
do
        echo "i=$i"
done

for j in "$@"
do
        echo "j=$j"
done
ubuntu@VM-0-9-ubuntu:~/shell$ bash for_all.sh a b c d
i=a b c d
j=a
j=b
j=c
j=d

5.5 while 循环

基本语法:

while [ 条件表达式 ]
do
执行代码
done

示例:
计算 1 到 100 的和

ubuntu@VM-0-9-ubuntu:~/shell$ vim while.sh 
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done
echo "和为$s"
ubuntu@VM-0-9-ubuntu:~/shell$ bash while.sh 
和为5050

6 read 读取控制台输入

基本语法:

read (可选项) (参数)

可选项 说明
-p 指定读取时的提示符
-t 指定读取时等待的时间

参数:

参数名称 说明
变量 指定读取值的变量名 (如需输入多个变量可用隔开,如:VALUE1 VALUE2 VALUE3 … )

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim read.sh
#!/bin/bash
read -p "请在15秒内输入姓名:" -t 15 NAME
echo $NAME
ubuntu@VM-0-9-ubuntu:~/shell$ bash read.sh 
请在15秒内输入姓名:李白
李白

7 函数

7.1 系统函数

  1. baseanme 获取不带路径的文件名

基本语法:

basename [patchname] [suffix]`

suffix 为后缀,如果指定了 suffix ,basename 会将字符串中的 suffix 后缀去除。

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ basename /home/ubuntu/shell/hello.sh 
hello.sh
ubuntu@VM-0-9-ubuntu:~/shell$ basename /home/ubuntu/shell/hello.sh .sh
hello
  1. dirname 获取文件的绝对路径,去除文件名

基本语法:

dirname [patchname]

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ dirname /home/ubuntu/shell/hello.sh 
/home/ubuntu/shell

7.2 自定义函数

基本语法:

[function] functionName ()
{
action
[return int]
}

调用函数:
functionName [参数1] [参数2] [参数3] […]

在函数内获取传入参数:
$1 代表第一个参数
$2 代表第二个参数
$3 代表第三个参数
依次类推 …

注意事项
1.自定义函数必须定义在调用代码之前,因为 Shell 脚本是从上至下逐行执行,不会预先编译。
2.中括号部分 [function] 方法标识符可省略。
3.中括号部分 [return int] 可省略,省略后默认返回最后一行代码的执行结果,如果需要手动设置返回值,返回值的区别必须在0~255 之间。

示例:

ubuntu@VM-0-9-ubuntu:~/shell$ vim fun.sh 
#!/bin/bash
function sum()
{
    
    
 s=0
 s=$[$1+$2]
}

read -p "请输入求和的第一个参数:" N1
read -p "请输入求和的第二个参数:" N2
sum $N1 $N2
echo "和为:$s"

ubuntu@VM-0-9-ubuntu:~/shell$ bash fun.sh 
请输入求和的第一个参数:1
请输入求和的第二个参数:2
和为:3

8 常用工具命令

8.1 cut

cut 命令用于在文件中按照规则按行剪切需要的信息。

基本语法:

cut [选项参数] filename

选项参数 说明
-f 提取的列号
-d 指定分隔符

示例:

准备数据

ubuntu@VM-0-9-ubuntu:~/shell$ cat city_info.txt 
sort city code spellname
1 长沙 A changSha
2 株洲 B zhuZhou
3 湘潭 C xiangTan

获取文本中的第2列

ubuntu@VM-0-9-ubuntu:~/shell$ cut -f 2 -d " " city_info.txt 
city
长沙
株洲
湘潭

获取文本中的第2,3列

ubuntu@VM-0-9-ubuntu:~/shell$ cut -f 2,3 -d " " city_info.txt 
city code
长沙 A
株洲 B
湘潭 C

获取文本中的第1列至第3列

ubuntu@VM-0-9-ubuntu:~/shell$ cut -f 1-3 -d " " city_info.txt 
sort city code
1 长沙 A
2 株洲 B
3 湘潭 C

获取文本中第2列之后的所有列

ubuntu@VM-0-9-ubuntu:~/shell$ cut -f 2- -d " " city_info.txt 
city code spellname
长沙 A changSha
株洲 B zhuZhou
湘潭 C xiangTan

8.2 sed

sed 是一种流编辑器,将文本读入临时缓冲区后,按指定规则逐行处理内容。

基本语法:

sed [选项参数] [命令参数] filename

选项参数 说明
-e 将下一个参数当作 sed 指令,同时使用多个命令参数时需要使用
命令参数 说明
a 在指定行后新增字符串
d 删除整行,支持根据正则表达式删除
s 查找字符串并替换

示例:

准备数据

ubuntu@VM-0-9-ubuntu:~/shell$ cat city_info.txt 
sort city code spellname
1 长沙 A changSha
2 株洲 B zhuZhou
3 湘潭 C xiangTan

在第二行后追加字符串

ubuntu@VM-0-9-ubuntu:~/shell$ sed "2a 1.5 岳阳 yueYang" city_info.txt 
sort city code spellname
1 长沙 A changSha
1.5 岳阳 yueYang
2 株洲 B zhuZhou
3 湘潭 C xiangTan

删除第二行的文本

ubuntu@VM-0-9-ubuntu:~/shell$ sed "2d" city_info.txt 
sort city code spellname
2 株洲 B zhuZhou
3 湘潭 C xiangTan

删除文本带有 changSha 的行

ubuntu@VM-0-9-ubuntu:~/shell$ sed "/changSha/d" city_info.txt 
sort city code spellname
2 株洲 B zhuZhou
3 湘潭 C xiangTan

将文本中的 a 替换成 A

ubuntu@VM-0-9-ubuntu:~/shell$ sed "s/a/A/" city_info.txt 
sort city code spellnAme
1 长沙 A chAngSha
2 株洲 B zhuZhou
3 湘潭 C xiAngTan

删除第一行后,追加新的行

ubuntu@VM-0-9-ubuntu:~/shell$ sed -e "/changSha/d" -e "1a 1 岳阳 A yueYang"  city_info.txt 
sort city code spellname
1 岳阳 A yueYang
2 株洲 B zhuZhou
3 湘潭 C xiangTan

8.3 awk

awk 是一个文本分析工具,逐行解析文本,默认根据空格将文本分割后再根据规则进行处理。

基本语法:

awk [选项参数] ‘pattern1{action1} pattern2{action2} …{…}’ filename

pattern 代表正则表达式,action 代表需要执行的动作。

注意事项:

  1. pattern 可省略,省略后对每行文本都执行动作
  2. action 可连续,示例:awk [选项参数] ‘{action1}{action2}{action3}’ filename
选项参数 说明
-F 指定输入文件分隔符
-v 给用户定义的变量赋值

示例:

准备数据

ubuntu@VM-0-9-ubuntu:~/shell$ cat awk.txt 
湖南长沙-A1-changSha-1
湖南株洲-A2-zhuZhou-2
湖南湘潭-A2-xiangTan-3
江苏南京-B1-nanJing-4
江苏扬州-B2-yangZhou-5
江苏无锡-B3-wuXi-6
浙江杭州-C1-hangZhou-7
浙江宁波-C2-ningBo-8
浙江金华-C3-jinHua-9

获取所有湖南开头的行,并打印其第3列

ubuntu@VM-0-9-ubuntu:~/shell$ awk -F - '/^湖南/{print $3}' awk.txt 
changSha
zhuZhou
xiangTan

获取包含字母 u 的所有行,并打印第 1 列和第 3 列,中间使用 " , " 分隔

ubuntu@VM-0-9-ubuntu:~/shell$ awk -F - '/u/{print $1","$3}' awk.txt
湖南株洲,zhuZhou
江苏扬州,yangZhou
江苏无锡,wuXi
浙江杭州,hangZhou
浙江金华,jinHua

在文本首行和末尾追加文本,并打印文本的第 1 列和第 3 列

ubuntu@VM-0-9-ubuntu:~/shell$ awk -F - 'BEGIN{print "地名" ",拼音"}{print $1","$3} END{print "浙江嘉兴" ",jiaXing" }' awk.txt 
地名,拼音
湖南长沙,changSha
湖南株洲,zhuZhou
湖南湘潭,xiangTan
江苏南京,nanJing
江苏扬州,yangZhou
江苏无锡,wuXi
浙江杭州,hangZhou
浙江宁波,ningBo
浙江金华,jinHua
浙江嘉兴,jiaXing

获取湖南开头的文本,并将第4列的值加 1 ,再根据指定格式打印

ubuntu@VM-0-9-ubuntu:~/shell$ awk -v i=1 -F - '/^湖南/{print $4+i","$1","$3}' awk.txt 
2,湖南长沙,changSha
3,湖南株洲,zhuZhou
4,湖南湘潭,xiangTan

上例使用了 -v 自定义变量,其实 awk 还内置了一部分变量供我们使用。

变量 说明
FILENAME 文件名
NR 显示文本的行数
NF 显示文本的列数

打印各项内置变量

ubuntu@VM-0-9-ubuntu:~/shell$ awk -F -  '{print "文件名:" FILENAME"-"$1"-"$3"-行数:"NR"-列数:"NF}' awk.txt 
文件名:awk.txt-湖南长沙-changSha-行数:1-列数:4
文件名:awk.txt-湖南株洲-zhuZhou-行数:2-列数:4
文件名:awk.txt-湖南湘潭-xiangTan-行数:3-列数:4
文件名:awk.txt-江苏南京-nanJing-行数:4-列数:4
文件名:awk.txt-江苏扬州-yangZhou-行数:5-列数:4
文件名:awk.txt-江苏无锡-wuXi-行数:6-列数:4
文件名:awk.txt-浙江杭州-hangZhou-行数:7-列数:4
文件名:awk.txt-浙江宁波-ningBo-行数:8-列数:4
文件名:awk.txt-浙江金华-jinHua-行数:9-列数:4

8.4 sort

sort 命令可帮助我们对文本进行排序。

基本语法:

sort (选项) filename

选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列

示例:

准备数据

ubuntu@VM-0-9-ubuntu:~/shell$ cat awk.txt 
湖南长沙-A1-changSha-1
湖南株洲-A2-zhuZhou-2
湖南湘潭-A2-xiangTan-3
江苏南京-B1-nanJing-4
江苏扬州-B2-yangZhou-5
江苏无锡-B3-wuXi-6
浙江杭州-C1-hangZhou-7
浙江宁波-C2-ningBo-8
浙江金华-C3-jinHua-9

将文本按照“-”分割,按照第4列数字大小倒序

ubuntu@VM-0-9-ubuntu:~/shell$ sort -t - -nrk 4 awk.txt 
浙江金华-C3-jinHua-9
浙江宁波-C2-ningBo-8
浙江杭州-C1-hangZhou-7
江苏无锡-B3-wuXi-6
江苏扬州-B2-yangZhou-5
江苏南京-B1-nanJing-4
湖南湘潭-A2-xiangTan-3
湖南株洲-A2-zhuZhou-2
湖南长沙-A1-changSha-1

参考资料

资料名称 资料来源
尚硅谷大数据技术之Shell https://www.gulixueyuan.com/my/course/273
菜鸟教程 | Shell教程 https://www.runoob.com/linux/linux-shell-variable.html

猜你喜欢

转载自blog.csdn.net/BaymaxCS/article/details/119456139
今日推荐