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 统计字符数