shell 基础知识和脚本应用

dirname和basename

简介:

  • dirname   从文件名剥离非目录的后缀(文件名可以是普通文件或者目录),命令去除文件名中的非目录部分,仅显示与目录有关的内容
  • basename 命令用于打印目录或者文件的基本名称,显示最后的目录名或文件名

使用实例:

  • dirname   用于最后一个文件是普通文件情形

[root@paas-controller-3:/home/pict]$ ls -l
total 151620
drwxr-x--- 9 pict pict       276 May 25  2021 java1.8
drwxrwxrwx 5 pict pict       181 Dec 17 08:56 jenkins
-rw-r----- 1 pict pict 155251047 Dec 17 08:51 jenkins.tar.gz
drwxr-x--- 2 pict pict        90 Dec 17 15:01 qiu
-rwxrwxrwx 1 root root       167 Dec 17 15:45 zhao.sh
[root@paas-controller-3:/home/pict]$ cd /root
[root@paas-controller-3:~]$ dirname /home/pict/zhao.sh
/home/pict

  • dirname   用于最后一个时目录的情形
[root@paas-controller-3:~]$ ls -l /home/pict
total 151660
drwxr-x--- 9 pict pict       276 May 25  2021 java1.8
drwxrwxrwx 5 pict pict       181 Dec 17 08:56 jenkins
-rw-r----- 1 pict pict 155251047 Dec 17 08:51 jenkins.tar.gz
-rw-r----- 1 pict pict     36867 Dec 20 09:22 oms_locale.xlsx
drwxr-x--- 2 pict pict        90 Dec 17 15:01 qiu
-rwxrwxrwx 1 root root       167 Dec 17 15:45 zhao.sh
[root@paas-controller-3:~]$ dirname /home/pict/qiu
/home/pict
  • basename 显示文件名,不包含目录

[root@host-10-57-66-70 zhouq]# ls -l
total 340972
drwxr-xr-x 2 root root         6 Dec 20 09:55 fu
-rw------- 1 root root 178689523 Nov  3 11:30 node_modules2.zip
-rw------- 1 root root 170453137 Nov  3 11:28 node_modules.zip
-rw-r--r-- 1 root root        16 Dec 17 10:03 tmp.txt
-rwxrwxrwx 1 root root        19 Dec 14 15:35 zhao.sh
[root@host-10-57-66-70 zhouq]# basename /root/zhouq/zhao.sh
zhao.sh
  • basename 显示文件名,不包含目录,不显示后缀
[root@host-10-57-66-70 zhouq]# basename /root/zhouq/zhao.sh .sh
zhao
  •  显示最后一个目录的名字
[root@host-10-57-66-70 zhouq]# basename /root/zhouq/fu
fu

awk

awk是一个强大的文本分析工具,最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。简单来说awk就是把文本逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

常用选项:-F  指定分隔符,

使用实例:

  • 逐行读取文件内容,并打印该行,$0保存的是当前行的内容

[root@host-10-57-66-70 zhouq]# awk '{print $0}' zhao.sh
#! /bin/sh
echo $0

[root@host-10-57-66-70 zhouq]# awk '{print}' zhao.sh
#! /bin/sh
echo $0

 


[root@host-10-57-66-70 zhouq]# cat fu.txt | awk -F: '{print $2}'
tom
10
  • 打印第一列内容,在不指定分割符的情况下,awk默认使用空白做分割符
[root@host-10-57-66-70 zhouq]# awk '{print $1}' zhao.sh
#!
echo
  • 使用 指定的分割符 
[root@host-10-57-66-70 zhouq]# awk -F  ':' '{print $1}' fu.txt
name
age
  •  条件判断操作和指定打印多列
[root@host-10-57-66-70 zhouq]# awk -F  ':' '$2<19 {print $2}' fu.txt
10
[root@host-10-57-66-70 zhouq]# ^C
[root@host-10-57-66-70 zhouq]# awk -F  ':' '{print $1,$2}' fu.txt
name tom
age 10
  • 搜索关键字所在行并打印
[root@host-10-57-66-70 zhouq]# awk -F: '/age/{print $2}' fu.txt
10
[root@host-10-57-66-70 zhouq]# awk -F: '/age/' fu.txt
age:10
[root@host-10-57-66-70 zhouq]#
[root@host-10-57-66-70 zhouq]# ls -l
total 340976
-rw-r--r-- 1 root root        16 Dec 20 10:55 fu.txt
-rw------- 1 root root 178689523 Nov  3 11:30 node_modules2.zip
-rw------- 1 root root 170453137 Nov  3 11:28 node_modules.zip
-rw-r--r-- 1 root root        16 Dec 17 10:03 tmp.txt
-rwxrwxrwx 1 root root        19 Dec 14 15:35 zhao.sh
[root@host-10-57-66-70 zhouq]# ls -l | awk '/zhao/'
-rwxrwxrwx 1 root root        19 Dec 14 15:35 zhao.sh

命令替换

命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

Shell 中有两种方式可以完成命令替换,

  • ``(反引号)
  • $()

使用实例:

[root@localhost ~]# echo today is $(date "+%Y-%m-%d")
today is 2021-12-14
[root@localhost ~]# echo today is `date "+%Y-%m-%d"`
today is 2021-12-14

$( )与``区别

在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:

1.``很容易''搞混乱,尤其对初学者来说。
2.在多层次的复合替换中,``必须要额外的转义字符处理(反斜线),而$( )比较直观。
3.$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的

test 和 []

两者是一样的,在命令行里test expr和[ expr ]的效果相同。

test的三个基本作用是判断文件、判断字符串、判断整数。支持使用 ”与或非“ 将表达式连接起来。

test中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。

与文件检测相关的 test 选项

选 项作 用
-b filename判断文件是否存在,并且是否为块设备文件。
-c filename判断文件是否存在,并且是否为字符设备文件。
-d filename判断文件是否存在,并且是否为目录文件。
-e filename判断文件是否存在。
-f filename判断文件是否存在,井且是否为普通文件。
-s filename判断文件是否存在,并且是否为非空。
-x 文件名如果文件存在且可执行则为真
-r 文件名如果文件存在且可读则为真
-w filename判断文件是否存在,并且是否拥有写权限

与数值比较相关的 test 选​项

选 项作 用
num1 -eq num2判断 num1 是否和 num2 相等。
num1 -ne num2判断 num1 是否和 num2 不相等。
num1 -gt num2判断 num1 是否大于 num2 。
num1 -lt num2判断 num1 是否小于 num2。
num1 -ge num2判断 num1 是否大于等于 num2。
num1 -le num2判断 num1 是否小于等于 num2。

与字符串判断相关的 test 选项

选 项作 用
-n str判断宇符串 str 是否为非空。
-z str判断字符串 str 是否为空。
str1 = str2
str1 == str2
===是等价的,都用来判断 str1 是否和 str2 相等。
str1 != str2判断 str1 是否和 str2 不相等。
str1 \> str2判断 str1 是否大于 str2。\>>的转义字符,这样写是为了防止>被误认为成重定向运算符。
str1 \< str2判断 str1 是否小于 str2。同样,\<也是转义字符。

echo 修改脚本文件

创建并写入文件内容

echo "a" 
# a
echo "a">a.txt  # 将'a'写入到a.txt文件中,会覆盖文件原有内容
echo "a">>a.txt  # 将'a'追加到a.txt文件中
echo -e "123\n243"  # -e 开启转义
# 123
# 243

wc 命令

wc命令可以用来统计文件字数及行数信息

wc [选项] 文件
-c 统计字节数
-l 统计行数
-w 统计字数
-m 统计字符数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值