Shell杂谈

常用内容小记

  • echo 输出
  • readonly 标记只读变量
  • unset 删除变量
  • 单引号
    • 单引号中变量无效,内部字符原样输出;
    • 单引号字符串中不能出现单独的一个单引号,即便使用了转义字符,但可以成对出现
  • 双引号
    • 双引号里可以有变量;
    • 双引号里可以出现转义字符
  • 提取子字符串:${string:1:4} 从位置1(第二个位置)开始截取4个字符
  • 查找子字符串:expr index "$string" io 查找字符i或o的位置,哪个先出现就计算哪个
  • 数组:
    • 定义 array1=(value0 value1) 赋值 array1[0]=value3 读取 ${array1[n]}
    • 获取所有元素 echo ${array_name[@]}
  • 注释: 单行# 多行:<<EOF xxxx EOF 或 :<<’ xxxx ‘ 或 :<<! xxxx !
  • 关系运算符 只支持数字或值为数字的字符串-eq -ne -gt -lt -ge -le
  • 布尔运算符 ! -o -a
  • 逻辑运算符 && ||
  • 字符串运算符 = != -z -n $
  • 文件测试运算符 -r file 检查file是否可读 等等……
  • echo 输出
  • 显示命令执行结果,使用反引号 `
  • 单引号包括的字符串会原样输出,没有转义
  • printf 输出
  • test用于检查某个条件是否成立,可以进行 数值、字符、文件 三个方面的测试
  • if then elif then else 常与test结合使用
  • for var in item1 item2; do command1; command2; done;
  • Let 执行表达式 let “int++”
  • case esac
  • 函数 funname(){}
  • 函数参数
    • $10不能获取第10个参数,要用${10}
    • $#参数个数;
    • $*以一个单字符串显示所有向脚本传递的参数;
    • $$脚本运行的当前进行ID号;
    • $!后台运行的最后一个进程ID号
    • $@与$*相同,但是使用时加引号,并在引号中返回各个参数
    • $-显示Shell使用的当前选项,与set命令功能相同
    • $? 显示最后命令的退出状态。0表示没有错误,其他值表示有错误;$?仅对上一条指令负责,一旦函数返回后没有立即保存入参数,那么其返回值将不能再通过$?获得。
    • 输出重定向: > ; 输出以追加的方式重定向: >> ; 输出文件m与n合并 n >& m ;

awk

一种处理文本文件的语言,强大的文本分析工具。主要用于行处理。

grep 更适合单纯的查找或匹配文本

sed 更适合编辑匹配到的文本

awk 更适合格式化文本,对文本进行较复杂格式处理

基本用法

1
awk [-F filed_separator] '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

例子:

1
2
3
4
5
6
7
8
9
10
11
12
# log.txt文本内容如下:
1 : This is a test.
2 : The number indicates the index of line.
3 : We are going to learn the basic usage of awk.
4 : Let's list some fruits at first.
5 : Apple, Banana, Orange & Pear.

# log2.txt文本内容如下:
Apple:Banana:Potato
Apple : Banana : Potato
Apple: Banana: Potato
Apple,Banana,Potato
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 每行按空格或TAB分割,输出文本中1 2 5项。参数之间用,分割的话输出会用空格分割。
$ awk '{print $1,$2,$5}' log.txt
1 : a
2 : indicates
3 : going
4 : some
5 : Orange

# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$3}' log.txt
1 This
2 The
3 We
4 Let's
5 Apple,

# 指定域分隔符 -F 未加这个参数的话就是默认用空格作为分割
$ awk -F: '{print $1$2}' log2.txt
AppleBanana
Apple Banana
Apple Banana
Apple,Banana,Potato
$ awk -F, '{print $1$2}' log2.txt
Apple:Banana:Potato
Apple : Banana : Potato
Apple: Banana: Potato
AppleBanana

变量

除了 $+数字 表示某个字段,awk还提供其他一些变量。常用的有NF和NR。

变量NF表示当前行有多少个字段,因此$NF就代表最后一个字段。

1
2
$ echo 'this is a test' | awk '{print $NF}'
test

变量NR表示当前处理的是第几行。

1
2
3
4
5
6
$ awk -F ':' '{print NR ") " $2}' log.txt
1) This is a test.
2) The number indicates the index of line.
3) We are going to learn the basic usage of awk.
4) Let's list some fruits at first.
5) Apple, Banana, Orange & Pear.

其他变量如:

  • FILENAME:当前文件名
  • FS:字段分隔符,默认是空格和制表符。
  • RS:行分隔符,用于分割每一行,默认是换行符。
  • OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
  • ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
  • OFMT:数字输出的格式,默认为%.6g

函数

awk 还提供了一些方便的内置函数。

  • toupper():字符转为大写。
  • tolower():字符转为小写。
  • length():返回字符串长度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():随机数。

条件

awk允许指定输出条件,只输出符合条件的行。

1
$ awk '条件 动作' 文件名

例子:

1
2
3
4
5
6
7
8
$ awk -F ':' '/Apple/ {print $1,$2}' log.txt	 # 只输出包含Apple字段的行
5 Apple, Banana, Orange & Pear.
$ awk -F ':' 'NR%2==1 {print $0}' log.txt # 只输出奇数行
1 : This is a test.
3 : We are going to learn the basic usage of awk.
5 : Apple, Banana, Orange & Pear.
$ awk -F ':' '$1=="1 " {print $0}' log.txt # 输出第一个字段等于指定值的行
1 : This is a test.

if 语句

awk提供了if结构,用于编写复杂的条件。if结构还可以指定else部分。

1
2
3
4
5
6
$ awk -F ':' '{if ($1>"2 ") print $0; else print "---"}' log.txt
---
---
3 : We are going to learn the basic usage of awk.
4 : Let's list some fruits at first.
5 : Apple, Banana, Orange & Pear.

wget

(Coming soon……)

curl

(Coming soon……)

find

(Coming soon……)

grep

(Coming soon……)

Reference

The GNU Awk User’s Guide

awk入门教程-阮一峰的网络日志

Linux awk命令-菜鸟教程


Shell杂谈
http://bingcs.com/2021/06/16/learning-shell/
Author
Bing
Posted on
June 16, 2021
Licensed under