0
点赞
收藏
分享

微信扫一扫

Bash 快速查询手册

图片引用链接:https://www.bilibili.com/video/BV16Z4y1N7R1?p=2&spm_id_from=pageDriver

执行命令: $(commands)
输出变量: ${var}
输出字符串:"string"
逻辑/整数/浮点数/字符串比较:[[ 1 < 2 && "a" = "b" ]] # false(0) true(1),单括号也可以
布尔运算/文件测试/整数比较:[ xxx -o xxx ]、[ ! xxx ]、[ xxx -a xxx ]、[ -e filename ]、[ 整数1 -lt 整数2 ]...
运算表达式:
jiaming@jiaming-VirtualBox:~/Documents$ (( 1 > 7 || "a" == "a" ))
jiaming@jiaming-VirtualBox:~/Documents$ echo $?
0
jiaming@jiaming-VirtualBox:~/Documents$ (( a=6 ))
jiaming@jiaming-VirtualBox:~/Documents$ (( a=a+4,a=a-1 ))
jiaming@jiaming-VirtualBox:~/Documents$ echo ${a}
9
函数:
function func(){
...
}

文件测试:​​[ -e file ]​​​、​​[ -f file ]​​​…
逻辑比较、算数运算:​​​(( a=a+4,a=a-1 ))​​​ 、​​(( 1 > 7 || "a" == "a" ))​

1. 常用 Shell 类型

解释器类型

介绍

/bin/sh

Bourne Shell,是 UNIX 最初使用的 shell

/bin/bash

Bourne Again Shell,它是 Bourne Shell 的扩展,简称 bash,是 Linux OS 默认 shell,有灵活和强大的编辑接口,同时又很友好的用户接口,交互性很强

/bin/nologin

未登录解析器,Shell 设置为 /bin/nologin 适用于控制用户禁止登录系统的,有时候有些服务,比如邮件服务,大部分都用来接受主机的邮件而已,并不需要登录

/bin/dash

比 Bash 小,只需要较少的磁盘空间,对话性功能少,交互性差

/bin/csh

C 语言风格

/bin/tcsh

C shell 扩展版本

2. 注释

#!/bin/bash 
:<<!
@file_name: Gyz.sh
@author: jiaming
@description: show sth...
!
# typing ...

3. 变量

3.1 系统环境变量

通过加载 Shell 配置文件(全局)中变量数据,共享给 Shell 所有 Shell 程序使用。

3.2 用户环境变量

Shell 环境加载个人配置文件中定义的变量。

3.3 查看环境变量

# env:系统环境变量
# set:系统环境变量/自定义变量/函数

3.4 常用环境变量

# PATH:命令搜索的目录路径,与 windows 的环境变量 PATH 一致
# LANG:查询系统的字符集
# HISTFILE:查询当前用户执行命令的历史列表

3.5 自定义变量

declare [+/-][aArxif][变量名称=设置值]

+/- :"-" 可用来指定变量的属性,"+" 取消变量所设的属性。
a:array,设置为普通索引的数组。
A:array,设置为关联数组(map)。
r:readonly,将变量设置为只读。
x:export,设置变量为环境变量。
i:int,设置为整型变量。
f:function,设置为一个函数变量。

declare -f 函数原型
declare -F 所有函数名
var_name=value
  1. 变量名由字母、数字和下划线组成,数字不能开头。
  2. 等号两侧不能有空格。
  3. 在 bash 环境中,变量的默认类型都是字符型,不能直接参与数值运算。
  4. 变量的值如果有空格,必须使用双引号
  5. 不能使用关键词作为变量名称。

3.6 查询变量

jiaming@jiaming-VirtualBox:~$ var=jiaming
jiaming@jiaming-VirtualBox:~$ echo my name is $var
my name is jiaming
jiaming@jiaming-VirtualBox:~$ echo my name is $var123
my name is
jiaming@jiaming-VirtualBox:~$ echo my name is ${var}123 # **拼接字符串**
my name is jiaming123

3.7 变量删除

unset var_name

3.8 定义只读常量

jiaming@jiaming-VirtualBox:~$ varname=jack
jiaming@jiaming-VirtualBox:~$ readonly varname
jiaming@jiaming-VirtualBox:~$ varname=lucy
bash: varname: readonly variable

3.9 全局变量

仅限于父子shell。

在当前 shell 和子 shell 环境中都可以使用。

export var_name1 var_name2 ...
#!/bin/bash
var="variable"
export var
sh subShell.sh

3.10 特殊变量

位置参数变量

作用

$n

n为数字,$0 代表命令本身,$1-$9代表第一到第九个参数,十以上需要使用大括号 ${10}

$*

这个变量代表命令行中所有的参数, $* 把所有的参数看成一个整体

$@

这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待,空格分隔

$#

这个变量代表命令行中所有参数的个数,当命令行上没有任何参数时, $# 的值为 0

${!#}

返回命令行用到的脚本名

$?

函数返回值或者上一个 shell 命令的返回值

$$

当前 shell 进程 ID 号

4. Shell 配置文件

全局配置文件

/etc/profile # 供所有 shell 使用
/etc/profile.d/*.sh
/etc/bashrc

个人配置文件

$HOME/.bash_profile
$HOME/.bashrc

4.1 创建环境变量

# 1. 编辑 /etc/profile 全局配置文件,定义变量并且 export。
# 2. 重载配置文件。source /etc/profile

4.2 shell 登录环境和非登录环境加载文件流程

Bash 快速查询手册_bash

需要登录执行的 shell 脚本环境变量配置在 /etc/profile、/当前用户/.bash_profile
不需要登录执行的 shell 脚本环境变量配置在:/当前用户/.bashrc、/etc/bashrc

4.3 使用 Shell 登录环境/非登录环境执行脚本

sh/bash -l/--login xxx.sh # 先加载 Shell 登陆环境流程初始化环境变量,再执行脚本
bash # 加载 shell 非登录环境
sh/bash xxx.sh # 加载 shell 非登录环境执行脚本
# $0 用于获取 shell 环境的类型
# bash 代表 shell 非登录环境,-bash 代表 shell 登陆环境
# 脚本中 $0 表示脚本文件名
# 加载 shell 登陆环境变量
# su 用户名 --login / su 用户名 -l

# 加载 shell 非登录环境变量
# su 用户名

5. 字符串

5.1 字符串的三种格式

字符串表示使用双引号

# 第一种,单引号,可以有空格,原样输出
jiaming@jiaming-VirtualBox:~$ var=abc
jiaming@jiaming-VirtualBox:~$ echo 'abc${var}'
abc${var}

# 第二种,双引号,可以有空格,可以解析变量
jiaming@jiaming-VirtualBox:~$ var=abc
jiaming@jiaming-VirtualBox:~$ echo "abc\"${var}\" hello"
abc"abc" hello

# 第三种,无引号,不能有空格,可以解析变量
jiaming@jiaming-VirtualBox:~$ var=abc def ghi

Command 'def' not found, did you mean:

command 'df' from deb coreutils
command 'dex' from deb dex
command 'dep' from deb go-dep

Try: sudo apt install <deb name>
`commands`
$(commands)

Bash 快速查询手册_字符串_02

5.2 获取字符串长度

jiaming@jiaming-VirtualBox:~$ var=abcd
jiaming@jiaming-VirtualBox:~$ echo ${#var}
4

5.3 拼接字符串

jiaming@jiaming-VirtualBox:~$ var1=abc
jiaming@jiaming-VirtualBox:~$ var2="hello world"
jiaming@jiaming-VirtualBox:~$ var3=${var1}${var2}
jiaming@jiaming-VirtualBox:~$ echo $var3
abchello world
jiaming@jiaming-VirtualBox:~$ var3="${var1}${var2}"
jiaming@jiaming-VirtualBox:~$ echo $var3
abchello world
jiaming@jiaming-VirtualBox:~$ var3=${var1}"&"${var2}
jiaming@jiaming-VirtualBox:~$ echo $var3
abc&hello world

5.4 截取字符串

Bash 快速查询手册_字符串_03

6 数组

6.1 数组的定义与遍历

索引数组

jiaming@jiaming-VirtualBox:~$ nums=(29 1 0 34 5 "helloo")
jiaming@jiaming-VirtualBox:~$ nums[1]=100
jiaming@jiaming-VirtualBox:~$ echo ${nums[*]}
29 100 0 34 5 helloo
jiaming@jiaming-VirtualBox:~$ echo ${nums[@]}
29 100 0 34 5 helloo
jiaming@jiaming-VirtualBox:~$ echo ${nums[2]}
0
jiaming@jiaming-VirtualBox:~$ echo ${#nums[*]}
6
jiaming@jiaming-VirtualBox:~$ echo ${#nums[@]}
6
jiaming@jiaming-VirtualBox:~$ echo ${#nums[5]}
6

key-value 关联数组

jiaming@jiaming-VirtualBox:~$ bash H5Q.sh 
hello
100 abc hello
hello
abc hello 100
jiaming@jiaming-VirtualBox:~$ cat H5Q.sh
#!/bin/bash
declare -a array1=(100 abc "hello")
echo ${array1[2]}
echo ${array1[*]}

declare -A array2=(["one"]=100 ["two"]=abc ["three"]="hello")
echo ${array2["three"]}
echo ${array2[@]}

5.2 数组的拼接

jiaming@jiaming-VirtualBox:~$ array1=(1 aa bb)
jiaming@jiaming-VirtualBox:~$ array2=(hello 123)
jiaming@jiaming-VirtualBox:~$ array3=(${array1[*]} ${array2[@]})
jiaming@jiaming-VirtualBox:~$ echo ${array3[@]}
1 aa bb hello 123

5.3 数组的删除

jiaming@jiaming-VirtualBox:~$ echo ${array1[*]}
1 aa bb
jiaming@jiaming-VirtualBox:~$ unset array1[1]
jiaming@jiaming-VirtualBox:~$ echo ${array1[*]}
1 bb
jiaming@jiaming-VirtualBox:~$ unset array1
jiaming@jiaming-VirtualBox:~$ echo ${array1[*]}

6. 内部/外部命令

jiaming@jiaming-VirtualBox:~$ type cd
cd is a shell builtin
jiaming@jiaming-VirtualBox:~$ type ifconfig
ifconfig is /sbin/ifconfig

内置命令会比外部命令执行的更快。
执行外部命令会调动磁盘 I/O,还需要 fork 出一个单独的进程来执行。
执行内置命令相当于调用当前 shell 进程的一个函数,还是在当前 shell 环境内,减少了上下文切换。

7. alias

jiaming@jiaming-VirtualBox:~$ alias 
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

alias 别名="命令"
unlias 别名 # 删除别名
unlias -a # 删除当前 shell 中的所有别名

8. echo

echo -n 输出数据 # 输出不换行的字符串
echo -e 输出数据 # 需要表达字符串中的转义字符;消除默认 echo 结尾换行符

9. read

$REPLY 变量表示 read 读入的最后一个数据
reap -p "您确定要删除数据吗?(在 60s 内请输入y/n):" -t 60 -n 1 char
printf "\n"

10. expr

整数运算、字符串处理

10.1 expr 整数运算

jiaming@jiaming-VirtualBox:~$ expr 1 + 2
3
jiaming@jiaming-VirtualBox:~$ result=`expr 1 + 2`
jiaming@jiaming-VirtualBox:~$ echo $result
3
jiaming@jiaming-VirtualBox:~$ expr 1 +2 # 注意空格
expr: syntax error
jiaming@jiaming-VirtualBox:~$ declare -i a=1;declare -i b=2
jiaming@jiaming-VirtualBox:~$ echo $a
1
jiaming@jiaming-VirtualBox:~$ echo $b
2
jiaming@jiaming-VirtualBox:~$ expr $a + $b
3
jiaming@jiaming-VirtualBox:~$ expr $a - $b
-1
jiaming@jiaming-VirtualBox:~$ expr $a \* $b
2
jiaming@jiaming-VirtualBox:~$ expr $b / $a
2
jiaming@jiaming-VirtualBox:~$ expr $b % $a
0
jiaming@jiaming-VirtualBox:~$ a=$b
jiaming@jiaming-VirtualBox:~$ echo $a
2
jiaming@jiaming-VirtualBox:~$ expr \( $a + $b \) / $a
2

可以直接输出
引用变量使用 $,特殊字符需要转义,只能计算一个表达式

10.2 expr 字符串处理

jiaming@jiaming-VirtualBox:~$ expr length "hello~" # 求解长度
6
jiaming@jiaming-VirtualBox:~$ expr substr "hello" 1 3 # 截取子串,起始位置为 1,结束位置为 3
hel
jiaming@jiaming-VirtualBox:~$ expr index "world" l # 求出第一次出现 l 字符的位置,从 1 开始
4
jiaming@jiaming-VirtualBox:~$ expr match "itheima" ".*m" # 正则匹配,匹配字符串中 m 前面的字符串长度
6
jiaming@jiaming-VirtualBox:~$ expr "itheima" : ".*m" # 正则匹配,匹配字符串中 m 前面的字符串长度
6

11. 整数比较

注意空格,

  • ​[ $a -eq $b ]​
  • ​[ $a -ne $b ]​
  • ​[ $a -gt $b ]​
  • ​[ $a -lt $b ]​
  • ​[ $a -ge $b ]​
  • ​[ $a -le $b ]​

双括号内格式随意,有 ​​>=​​​ 情况,​​=​​ 表示赋值,建议使用本方法,小数不能比较

  • ​(( $a < $b ))​
  • ​(( $a <= $b ))​
  • ​(( $a > $b ))​
  • ​(( $a >= $b ))​
  • ​(( $a == $b ))​
  • ​(( $a != $b ))​

12. 整数/浮点数/字符串比较

没有 ​​>=​​​ 情况,需要转义,可以 ​​=​

  • ​[ $a == $b ]​​​ /​​[ $a = $b ]​
  • ​[ $a != $b ]​
  • ​[ $a \< $b ]​​​ /​​[ $a \> $b ]​

没有 ​​>=​​​ 情况,不需要转义,可以 ​​=​

  • ​[[ $a == $b ]]​​​ /​​[[ $a = $b ]]​
  • ​[[ $a != $b ]]​
  • ​[[ $a > $b ]]​​​ /​​[[ $a < $b ]]​

字符串比较的特殊方法:

  • ​[ -z $a ]​​ 检查字符串长度是否为 0。
  • ​[ -n $a ]​​ 检查字符串长度是否不为 0。
  • ​[ $a ]​​ 字符串不空返回 true。

13. [[ ]] 和 [ ] 区别

  • ​[[ ]]​​​ 会将字符串拆开单个比较,​​[ ]​​ 不会。
  • ​[[ 1 > 2 ]]​​​,​​[ 1\> 2 ]​

14. 文件测试

[ -e filename ]:文件存在为真
[ -r filename ]:文件存在且可读为真
[ -w filename ]:文件存在且可写为真
[ -x filename ]:文件存在且可执行为真
[ -s filename ]:文件存在且至少有一个字符为真
[ -d filename ]:文件存在且为目录为真
[ -f filename ]:
[ -c filename ]:
[ -b filename ]:
test 整数1 options 整数2 # lt gt le ge eq ne
test 字符串1 options 字符串2 # < > != = ==,注意转义
test options filename # -r -w- x- e- s- d

15. 布尔运算

  • ​[ ! 表达式 ]​
  • ​[ 表达式1 -o 表达式2 ]​
  • ​[ 表达式1 -a 表达式2 ]​

16. 逻辑运算

  • ​[[ 表达式1 && 表达式2 ]]​
  • ​[[ 表达式1 || 表达式2 ]]​
  • ​[[ ! 表达式 ]]​

17. 算数运算 (( )) / $[ ]

jiaming@jiaming-VirtualBox:~/Documents$ echo $[1+2]
3
jiaming@jiaming-VirtualBox:~/Documents$ echo $[1 + 2]
3
jiaming@jiaming-VirtualBox:~/Documents$ echo $[1 + 2 ]
3
jiaming@jiaming-VirtualBox:~/Documents$ echo $[1.3 + 2 ]
bash: 1.3 + 2 : syntax error: invalid arithmetic operator (error token is ".3 + 2 ")
jiaming@jiaming-VirtualBox:~$ (( a = 1 + 6 ))
jiaming@jiaming-VirtualBox:~$ (( b = a - 1 ))
jiaming@jiaming-VirtualBox:~$ (( c = a + b ))
jiaming@jiaming-VirtualBox:~$ echo $c
13
jiaming@jiaming-VirtualBox:~$ a=$((1+6))
jiaming@jiaming-VirtualBox:~$ b=$(( a - 1 ))
jiaming@jiaming-VirtualBox:~$ c=$((a+b))
jiaming@jiaming-VirtualBox:~$ echo $c
13
jiaming@jiaming-VirtualBox:~$ (( a>7 && b==c ))
jiaming@jiaming-VirtualBox:~$ (( a=3+5,b=a + 10 ))

直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值
需要获取值之后才能输出

jiaming@jiaming-VirtualBox:~$ let a=1+6 b=a-1 c=a+b

赋值简单,特殊字符不需要转义
不能直接输出

$[表达式]

特殊字符不需要转义
不能多表达式计算

18. bc 命令

​bc [options] [参数]​

-h: 帮助信息
-v: 版本信息
-l: 使用内置函数
-i: 强制交互
-w: 显示 POSIX 警告信息
-s: s 使用 POSIX 标准来处理
-q: 不显示欢迎信息
jiaming@jiaming-VirtualBox:~$ cat task.txt 
108*67+12345
58+2007*11
jiaming@jiaming-VirtualBox:~$ bc -q task.txt
19581
22135
quit

内置变量

scale:指定精度,小数点后的位数
ibase:指定输入的数字的进制
obase:指定输出的数字的进制
last 或者 .:获取最近计算打印结果的数字

内置数字函数

s(x):计算正弦值,x 是弧度值
c(x):计算余弦值
a(x):计算反正切值
l(x):计算 x 的自然对数
e(x):求解 e 的 x 次方
j(n, x):贝塞尔函数,计算从 n 到 x 的阶数
jiaming@jiaming-VirtualBox:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2
3
scale=2;10/3
3.33
obase=2;7
111
quit
jiaming@jiaming-VirtualBox:~$ echo "scale=2;7" | bc
7
jiaming@jiaming-VirtualBox:~$ var1=`echo 1+3 | bc`
jiaming@jiaming-VirtualBox:~$ echo $var1
4
jiaming@jiaming-VirtualBox:~$
jiaming@jiaming-VirtualBox:~$ var2=$(echo "2+4" | bc)
jiaming@jiaming-VirtualBox:~$ echo $var2
6
jiaming@jiaming-VirtualBox:~$ a=100
jiaming@jiaming-VirtualBox:~$ b=$(bc << EOF
> ibase=10;
> obase=2;
> $a
> EOF
> )
jiaming@jiaming-VirtualBox:~$ echo $b
1100100

19. case

case 只支持一部分正则表达式,且不需要每个 case 选项都有一个 break,和 C 不一样。

*
[abc]
[m-n]
|

20. 循环

while 条件; do
...
continue;
break;
done
jiaming@jiaming-VirtualBox:~/Documents$ bash MIv.sh 
enter a number: 5
hello0
hello1
hello2
hello3
hello4
jiaming@jiaming-VirtualBox:~/Documents$ cat MIv.sh
#!/bin/bash
read -p "enter a number: " number
i=0
while ((i<number)); do
echo "hello${i}"
let i++
done
jiaming@jiaming-VirtualBox:~/Documents$ bash rvz.sh 
1
2
3
4
5
jiaming@jiaming-VirtualBox:~/Documents$ cat rvz.sh
#!/bin/bash
for var in 1 2 3 4 5; do
echo ${var}
done
jiaming@jiaming-VirtualBox:~/Documents$ cat rvz.sh 
#!/bin/bash
for var in {1..5}; do
echo ${var}
done
jiaming@jiaming-VirtualBox:~/Documents$ bash rvz.sh
1
2
3
4
5
jiaming@jiaming-VirtualBox:~/Documents$ bash rvz.sh 
1
2
3
4
5
jiaming@jiaming-VirtualBox:~/Documents$ cat rvz.sh
#!/bin/bash
for ((i=1; i<=5; i++)); do
echo ${i}
done

21. select

死循环,需要配合 break 使用。

select var in menu1 menu2 ...;do
commands
done
jiaming@jiaming-VirtualBox:~/Documents$ bash SvM.sh 
enter a word:
1) a
2) b
3) c
4) d
#? 3
c
jiaming@jiaming-VirtualBox:~/Documents$ cat SvM.sh
#!/bin/bash
echo "enter a word: "
select word in "a" "b" "c" "d"; do
echo ${word}
break
done

Bash 快速查询手册_linux_04

22. 函数

系统函数:basename、dirname
自定义函数

jiaming@jiaming-VirtualBox:~/Documents$ basename /home/jiaming/Documents/SvM.sh 
SvM.sh
jiaming@jiaming-VirtualBox:~/Documents$ dirname /home/jiaming/Documents/SvM.sh
/home/jiaming/Documents
jiaming@jiaming-VirtualBox:~/Documents$ bash HI3.sh 
execuse function.
first parameter: 1
second parameter: 2
tenth parameter: 10
number of parameters: 10
string of parameter: 1 2 3 4 5 6 7 8 9 10
func return value: 255
jiaming@jiaming-VirtualBox:~/Documents$ cat HI3.sh
#!/bin/bash
function func(){
echo "execuse function."
echo "first parameter: $1"
echo "second parameter: $2"
echo "tenth parameter: ${10}"
echo "number of parameters: $#"
echo "string of parameter: $*"
return 255
}
func 1 2 3 4 5 6 7 8 9 10
echo "func return value: $?"

参数

说明

$#

传递到脚本或参数个数

$*

以一个单字符串显示所有参数

$$

脚本运行的当前进程号

$!

后台运行的第一个进程号

$@

与 $* 类似,使用时加引号,并在引导中返回每个参数

$?

显示最后命令的退出状态

shell 程序命令:运行命令时开启一个子进程运行命令。
函数:在当前 shell 环境中运行,没有开启进程。

类型

符号

作用

标准输出重定向

命令 > 文件

覆盖方式

命令 >> 文件

追加方式

标准错误输出重定向

错误命令 2> 文件

覆盖方式

错误命令 2>> 文件

追加方式

正确输出和错误输出同时保存

命令 > 文件 2>&1

覆盖方式,正确输出和错误输出都保存到同一个文件中。

命令 >> 文件 2>&1

追加方式,正确输出和错误输出都保存到同一个文件中。

命令 &> 文件

覆盖方式,正确输出和错误输出都保存到同一个文件中。

命令 &>>文件1 2>>文件2

把正确的输出追加到文件1中,把错误的输出追加到文件2中。

cut - 列 文本处理工具

可以切割指定列\字符\字节的数据

cut [options] filename
+ -f 提取范围:获取第几列
+ -d 自定义分隔符:默认为制表符
+ -c 提取范围:以字符为单位进行分隔
+ -b 提取范围:以字节为单位进行分隔,中文占两个字节
+ -n:配合 -b
提取范围:
+ n-:
+ n-m:
+ -m:
+ n1,n2,...
jiaming@jiaming-VirtualBox:~/Documents$ cat cut1.txt 
AA itheima 11 XX
BB itcast 22 XXX
CC Shell 33 XXXX
DD it 44 XXX
jiaming@jiaming-VirtualBox:~/Documents$ cut -d " " -f 1 cut1.txt
AA
BB
CC
DD
jiaming@jiaming-VirtualBox:~/Documents$ cut -d " " -f 1,3 cut1.txt
AA itheima
BB itcast
CC Shell
DD it
jiaming@jiaming-VirtualBox:~/Documents$ cut -d " " -f 2- cut1.txt
itheima 11 XX
itcast 22 XXX
Shell 33 XXXX
it 44 XXX
jiaming@jiaming-VirtualBox:~/Documents$ cut -d " " -f -4 cut1.txt
AA itheima 11
BB itcast 22
CC Shell 33
DD it 44
jiaming@jiaming-VirtualBox:~/Documents$ cut -d " " -f 2-4 cut1.txt
itheima 11
itcast 22
Shell 33
it 44
jiaming@jiaming-VirtualBox:~/Documents$ cut -c 1 cut1.txt
A
B
C
D
jiaming@jiaming-VirtualBox:~/Documents$ cut -c 1-2 cut1.txt
AA
BB
CC
DD
jiaming@jiaming-VirtualBox:~/Documents$ cut -c 1,4,5 cut1.txt
A i
B i
C S
D i
jiaming@jiaming-VirtualBox:~/Documents$ cut -c 5- cut1.txt
itheima 11 XX
itcast 22 XXX
Shell 33 XXXX
it 44 XXX
jiaming@jiaming-VirtualBox:~/Documents$ echo "abc123" | cut -b 1-3
abc
jiaming@jiaming-VirtualBox:~/Documents$ ps -aux | grep bash | head -n 1
jiaming 2427 0.0 0.0 24708 5820 pts/0 Ss 2月22 0:00 bash
jiaming@jiaming-VirtualBox:~/Documents$ ps -aux | grep bash | head -n 1 | cut -d " " -f 4
2427
jiaming@jiaming-VirtualBox:~/Documents$ ifconfig 
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::def3:6cb5:c8d6:cd3c prefixlen 64 scopeid 0x20<link>
ether 08:00:27:09:5c:61 txqueuelen 1000 (Ethernet)
RX packets 62181 bytes 76557624 (76.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13768 bytes 974737 (974.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2175 bytes 197712 (197.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2175 bytes 197712 (197.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

jiaming@jiaming-VirtualBox:~/Documents$ ifconfig | grep broadcast
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
jiaming@jiaming-VirtualBox:~/Documents$ ifconfig | grep broadcast | cut -d " " -f 10
10.0.2.15

sed - 行 文本处理工具

stream editor,流编辑器,可对文本文件的每一行数据匹配查询之后进行增、删、改、查等操作。支持按行、字段、正则匹配文本。

读取文件中每行数据到缓存区,匹配后执行 sed 命令,将执行后的结果输出。

sed [options][模式匹配][文件名]
-e:执行多条 sed 命令
-i:修改源文件
-f:保存到其它文件
-n:
-r:
a: 后面可接字串,在下一行出现
c: 更改匹配行的内容
d: 删除匹配的内容
i: 向匹配行前插入内容
p: 打印出匹配的内容
s: 替换掉匹配的行的行号
=: 用来打印被匹配的行的行号
n: 读取下一行,遇到 n 时会自动跳入下一行
! 取反
{sed命令1;sed命令2} 多个命令操作同一个行
jiaming@jiaming-VirtualBox:~/Documents$ cat sed.txt 
ABC
itheima itheima
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '3ahello' sed.txt
ABC
itheima itheima
itcast
hello
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ cat sed.txt
ABC
itheima itheima
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '3ihello' sed.txt
ABC
itheima itheima
hello
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '/itheima/ihello' sed.txt
ABC
hello
itheima itheima
itcast
123
hello
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '$ahello' sed.txt
ABC
itheima itheima
itcast
123
itheima
hello
jiaming@jiaming-VirtualBox:~/Documents$ sed '$ihello' sed.txt
ABC
itheima itheima
itcast
123
hello
itheima
jiaming@jiaming-VirtualBox:~/Documents$ cat sed.txt 
ABC
itheima itheima
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '2d' sed.txt
ABC
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '1~2d' sed.txt
itheima itheima
123
jiaming@jiaming-VirtualBox:~/Documents$ sed '1,3d' sed.txt
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '1,3!d' sed.txt
ABC
itheima itheima
itcast
jiaming@jiaming-VirtualBox:~/Documents$ sed '$d' sed.txt
ABC
itheima itheima
itcast
123
jiaming@jiaming-VirtualBox:~/Documents$ sed '/itheima/d' sed.txt
ABC
itcast
123
jiaming@jiaming-VirtualBox:~/Documents$ sed '/itheima/,$d' sed.txt
ABC
jiaming@jiaming-VirtualBox:~/Documents$ sed '/itheima/,+1d' sed.txt
ABC
123
jiaming@jiaming-VirtualBox:~/Documents$ sed '/itheima\|itcast/!d' sed.txt
itheima itheima
itcast
itheima
jiaming@jiaming-VirtualBox:~/Documents$ cat sed.txt 
ABC
itheima itheima
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '1chello' sed.txt
hello
itheima itheima
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed '/itheima/chello' sed.txt
ABC
hello
itcast
123
hello
jiaming@jiaming-VirtualBox:~/Documents$ sed '$chello' sed.txt
ABC
itheima itheima
itcast
123
hello
jiaming@jiaming-VirtualBox:~/Documents$ sed 's/itheima/hello/' sed.txt
ABC
hello itheima
itcast
123
hello
jiaming@jiaming-VirtualBox:~/Documents$ sed 's/itheima/hello/g' sed.txt
ABC
hello hello
itcast
123
hello
jiaming@jiaming-VirtualBox:~/Documents$ sed 's/itheima/hello/2' sed.txt
ABC
itheima hello
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed 's/itheima/hello/2w sed2.txt' sed.txt
ABC
itheima hello
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ cat sed2.txt
itheima hello
jiaming@jiaming-VirtualBox:~/Documents$ sed -n 's/itheima/hello/2pw sed2.txt' sed.txt
itheima hello
jiaming@jiaming-VirtualBox:~/Documents$ sed '/i/s/t.*//' sed.txt
ABC
i
i
123
i
jiaming@jiaming-VirtualBox:~/Documents$ sed '/i/s/t.*//p' sed.txt
ABC
i
i
i
i
123
i
i
jiaming@jiaming-VirtualBox:~/Documents$ sed -n '/i/s/t.*//p' sed.txt
i
i
i
jiaming@jiaming-VirtualBox:~/Documents$ sed 's/$/& test/' sed.txt
ABC test
itheima itheima test
itcast test
123 test
itheima test
jiaming@jiaming-VirtualBox:~/Documents$ sed 's/^/&#/' sed.txt
#ABC
#itheima itheima
#itcast
#123
#itheima
jiaming@jiaming-VirtualBox:~/Documents$ cat sed.txt 
ABC
itheima itheima
itcast
123
itheima
jiaming@jiaming-VirtualBox:~/Documents$ sed -n '/itcast/p' sed.txt
itcast
jiaming@jiaming-VirtualBox:~/Documents$ ps -aux | grep sshd
root 618 0.0 0.0 72304 5696 ? Ss 2月22 0:00 /usr/sbin/sshd -D
jiaming 12547 0.0 0.0 16180 1040 pts/0 S+ 16:55 0:00 grep --color=auto sshd
jiaming@jiaming-VirtualBox:~/Documents$ ps -aux | sed -n '/sshd/p'
root 618 0.0 0.0 72304 5696 ? Ss 2月22 0:00 /usr/sbin/sshd -D
jiaming 12549 0.0 0.0 18276 1192 pts/0 S+ 16:56 0:00 sed -n /sshd/p
jiaming@jiaming-VirtualBox:~/Documents$ sed -e '1d' -e 's/itheima/itcast/g' sed.txt
itcast itcast
itcast
123
itcast

awk - 文本分析工具

默认分隔符为空格,

awk options 'pattern{action}' {filenames}
options:
+ -F: 指定输入文件的分隔符
+ -v: 赋值一个用户定义变量

Bash 快速查询手册_sed_05

jiaming@jiaming-VirtualBox:~/Documents$ echo "abc 123 456" | awk '{print $1"&"$2"&"$3}'
abc&123&456
jiaming@jiaming-VirtualBox:~/Documents$ awk '/root/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" '/root/{print $7}' passwd
/bin/bash
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" '{print "filename:"FILENAME",lineNumber:"NR",columnNumber:"NF",text:"$0}' passwd
filename:passwd,lineNumber:1,columnNumber:7,text:root:x:0:0:root:/root:/bin/bash
filename:passwd,lineNumber:2,columnNumber:7,text:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
filename:passwd,lineNumber:3,columnNumber:7,text:bin:x:2:2:bin:/bin:/usr/sbin/nologin
filename:passwd,lineNumber:4,columnNumber:7,text:sys:x:3:3:sys:/dev:/usr/sbin/nologin
filename:passwd,lineNumber:5,columnNumber:7,text:sync:x:4:65534:sync:/bin:/bin/sync
filename:passwd,lineNumber:6,columnNumber:7,text:games:x:5:60:games:/usr/games:/usr/sbin/nologin
filename:passwd,lineNumber:7,columnNumber:7,text:man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
filename:passwd,lineNumber:8,columnNumber:7,text:lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
filename:passwd,lineNumber:9,columnNumber:7,text:mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
filename:passwd,lineNumber:10,columnNumber:7,text:news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
filename:passwd,lineNumber:11,columnNumber:7,text:uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
filename:passwd,lineNumber:12,columnNumber:7,text:proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
filename:passwd,lineNumber:13,columnNumber:7,text:www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
filename:passwd,lineNumber:14,columnNumber:7,text:backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
filename:passwd,lineNumber:15,columnNumber:7,text:list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
filename:passwd,lineNumber:16,columnNumber:7,text:irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
filename:passwd,lineNumber:17,columnNumber:7,text:gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
filename:passwd,lineNumber:18,columnNumber:7,text:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
filename:passwd,lineNumber:19,columnNumber:7,text:systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
filename:passwd,lineNumber:20,columnNumber:7,text:systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
filename:passwd,lineNumber:21,columnNumber:7,text:syslog:x:102:106::/home/syslog:/usr/sbin/nologin
filename:passwd,lineNumber:22,columnNumber:7,text:messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
filename:passwd,lineNumber:23,columnNumber:7,text:_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
filename:passwd,lineNumber:24,columnNumber:7,text:uuidd:x:105:111::/run/uuidd:/usr/sbin/nologin
filename:passwd,lineNumber:25,columnNumber:7,text:avahi-autoipd:x:106:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
filename:passwd,lineNumber:26,columnNumber:7,text:usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
filename:passwd,lineNumber:27,columnNumber:7,text:dnsmasq:x:108:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
filename:passwd,lineNumber:28,columnNumber:7,text:rtkit:x:109:114:RealtimeKit,,,:/proc:/usr/sbin/nologin
filename:passwd,lineNumber:29,columnNumber:7,text:cups-pk-helper:x:110:116:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin
filename:passwd,lineNumber:30,columnNumber:7,text:speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
filename:passwd,lineNumber:31,columnNumber:7,text:whoopsie:x:112:117::/nonexistent:/bin/false
filename:passwd,lineNumber:32,columnNumber:7,text:kernoops:x:113:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin
filename:passwd,lineNumber:33,columnNumber:7,text:saned:x:114:119::/var/lib/saned:/usr/sbin/nologin
filename:passwd,lineNumber:34,columnNumber:7,text:pulse:x:115:120:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
filename:passwd,lineNumber:35,columnNumber:7,text:avahi:x:116:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
filename:passwd,lineNumber:36,columnNumber:7,text:colord:x:117:123:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
filename:passwd,lineNumber:37,columnNumber:7,text:hplip:x:118:7:HPLIP system user,,,:/var/run/hplip:/bin/false
filename:passwd,lineNumber:38,columnNumber:7,text:geoclue:x:119:124::/var/lib/geoclue:/usr/sbin/nologin
filename:passwd,lineNumber:39,columnNumber:7,text:gnome-initial-setup:x:120:65534::/run/gnome-initial-setup/:/bin/false
filename:passwd,lineNumber:40,columnNumber:7,text:gdm:x:121:125:Gnome Display Manager:/var/lib/gdm3:/bin/false
filename:passwd,lineNumber:41,columnNumber:7,text:jiaming:x:1000:1000:jiaming,,,:/home/jiaming:/bin/bash
filename:passwd,lineNumber:42,columnNumber:7,text:vboxadd:x:999:1::/var/run/vboxadd:/bin/false
filename:passwd,lineNumber:43,columnNumber:7,text:user001:x:1001:1000::/home/wxc:/bin/bash
filename:passwd,lineNumber:44,columnNumber:7,text:user002:x:1002:1002::/home/yx:/bin/bash
filename:passwd,lineNumber:45,columnNumber:7,text:user003:x:1003:1003::/home/lhm:/bin/bash
filename:passwd,lineNumber:46,columnNumber:7,text:user004:x:1004:1004::/home/byf:/bin/bash
filename:passwd,lineNumber:47,columnNumber:7,text:user005:x:1005:1006::/home/lhb:/bin/bash
filename:passwd,lineNumber:48,columnNumber:7,text:user006:x:1006:1006::/home/sj:/bin/bash
filename:passwd,lineNumber:49,columnNumber:7,text:user007:x:1007:1007::/home/djy:/bin/bash
filename:passwd,lineNumber:50,columnNumber:7,text:user008:x:1008:1008::/home/aoko:/bin/bash
filename:passwd,lineNumber:51,columnNumber:7,text:smmta:x:122:127:Mail Transfer Agent,,,:/var/lib/sendmail:/usr/sbin/nologin
filename:passwd,lineNumber:52,columnNumber:7,text:smmsp:x:123:128:Mail Submission Program,,,:/var/lib/sendmail:/usr/sbin/nologin
filename:passwd,lineNumber:53,columnNumber:7,text:sshd:x:124:65534::/run/sshd:/usr/sbin/nologin
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" 'NR==2{printf("filename:%s,text:%s\n",FILENAME,$0)}' passwd
filename:passwd,text:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
jiaming@jiaming-VirtualBox:~/Documents$ ls -a | awk '/^c/'
c.diff
countfiles.sh
create_kvm.sh
cut1.txt
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" '{print $1}' passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
systemd-network
systemd-resolve
syslog
messagebus
_apt
uuidd
avahi-autoipd
usbmux
dnsmasq
rtkit
cups-pk-helper
speech-dispatcher
whoopsie
kernoops
saned
pulse
avahi
colord
hplip
geoclue
gnome-initial-setup
gdm
jiaming
vboxadd
user001
user002
user003
user004
user005
user006
user007
user008
smmta
smmsp
sshd
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" '{print $NF}' passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/usr/sbin/nologin
/bin/false
/bin/false
/bin/bash
/bin/false
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" '{print $(NF-1)}' passwd
/root
/usr/sbin
/bin
/dev
/bin
/usr/games
/var/cache/man
/var/spool/lpd
/var/mail
/var/spool/news
/var/spool/uucp
/bin
/var/www
/var/backups
/var/list
/var/run/ircd
/var/lib/gnats
/nonexistent
/run/systemd/netif
/run/systemd/resolve
/home/syslog
/nonexistent
/nonexistent
/run/uuidd
/var/lib/avahi-autoipd
/var/lib/usbmux
/var/lib/misc
/proc
/home/cups-pk-helper
/var/run/speech-dispatcher
/nonexistent
/
/var/lib/saned
/var/run/pulse
/var/run/avahi-daemon
/var/lib/colord
/var/run/hplip
/var/lib/geoclue
/run/gnome-initial-setup/
/var/lib/gdm3
/home/jiaming
/var/run/vboxadd
/home/wxc
/home/yx
/home/lhm
/home/byf
/home/lhb
/home/sj
/home/djy
/home/aoko
/var/lib/sendmail
/var/lib/sendmail
/run/sshd
jiaming@jiaming-VirtualBox:~/Documents$ awk -F ":" '{if(NR>=10 && NR<=20){print $1}}' passwd
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
systemd-network
systemd-resolve
jiaming@jiaming-VirtualBox:~/Documents$ echo "one:two/three" | awk -F"[:/]" '{print $1"&"$2"&"$3}'
one&two&three
jiaming@jiaming-VirtualBox:~/Documents$ echo -e "abc\nabc"
abc
abc
jiaming@jiaming-VirtualBox:~/Documents$ echo -e "abc\nabc" | awk '{print $0}'
abc
abc
jiaming@jiaming-VirtualBox:~/Documents$ echo -e "abc\nabc" | awk 'BEGIN{print "start..."}{print $0}END{print "ending..."}'
start...
abc
abc
ending...
jiaming@jiaming-VirtualBox:~/Documents$ echo "abc itheima itcast" | awk '{print $1"&"$2"&"$3}'
abc&itheima&itcast
jiaming@jiaming-VirtualBox:~/Documents$ echo "abc itheima itcast" | awk -v str="" '{for(n=1;n<=NF;n++){str=str$n}} END{print str}'
abcitheimaitcast

sort - 排序工具

Bash 快速查询手册_字符串_06

jiaming@jiaming-VirtualBox:~/Documents$ cat sort.txt 
Mr.san 30
Mr.si 95
Mr.bo 85
Mr.bo 85
Mr.bo 86
AA 86
BB 100
jiaming@jiaming-VirtualBox:~/Documents$ sort -t " " -k2n,2 sort.txt
Mr.san 30
Mr.bo 85
Mr.bo 85
AA 86
Mr.bo 86
Mr.si 95
BB 100
jiaming@jiaming-VirtualBox:~/Documents$ sort -t " " -k2n,2 -uk1,2 sort.txt
Mr.san 30
Mr.bo 85
AA 86
Mr.bo 86
Mr.si 95
BB 100
jiaming@jiaming-VirtualBox:~/Documents$ sort -t " " -k2n,2 -uk1,2 sort.txt -o sort2.txt
jiaming@jiaming-VirtualBox:~/Documents$ cat sort2.txt
Mr.san 30
Mr.bo 85
AA 86
Mr.bo 86
Mr.si 95
BB 100
jiaming@jiaming-VirtualBox:~/Documents$ sort -t " " -k2nr,2 -uk1,2 sort.txt
BB 100
Mr.si 95
AA 86
Mr.bo 86
Mr.bo 85
Mr.san 30


举报

相关推荐

0 条评论