- 1.shell命令
- 2.使用vi编辑器
- 3.管道命令:pipe |
- 4.选取命令:cut和grep
- 5.排序命令:sort、wc和uniq
- 6.双向重导向:tee
- 7.字符转换命令:tr、col、join、paste、expand
- 8.拆分命令:split
- 9.参数代换:xargs
- 10.减号(-)的用途
- 11.通配符与特殊符号
- 12.基础正则表达式
- 13.格式化显示:printf
- 14.变量
- 15.如何判断一个变量为空
- 16.变量的有效范围
- 17.变量键盘读取、数组与申明:read、array、declare
- 18. shell中的$,比如$@和$#
- 19. shell中的/dev/null,代表空设备文件
- 20. 获得文本中的最短行和最长行
- 21.Shift命令
1.shell命令#
shell是连接linux内核和linux命令的模块
命令名称 /bin/sh /bin/csh /bin/ksh
chsh -s 输入新的shell,即修改shell
可以使用env命令查看当前的环境变量,可以查看当前使用的是什么shell命令
1 | env | grep SHELL |
2.使用vi编辑器#
键盘输入 | 功能 |
---|---|
i | 进入插入模式 |
esc | 进入命令模式 |
w | 将目前文件内容加以保存 |
q | 退出,如果文件有修改会出现错误信息 |
q! | 强制离开vi,并且不保存文件 |
wq | 将修改过的内容保存,并离开vi |
set nu | 给文件中每一行添加行号 |
set nonu | 取消行号 |
输入数字 | 直接输入数字再按esc,可将光标移至该行行首 |
/字符串 | 从头查找特定字符串 |
?字符串 | 从尾查找特定字符串 |
3.管道命令:pipe |#
1.把一个命令的输出作为另一个命令的输入
1 | ls -al /etc | less |
4.选取命令:cut和grep#
cut命令可以将一段消息的某段切出来。
-d接分隔符,-f是取出第几段的意思,-c是以字符串为单位取出固定的字符串范围
1 | ls -F | grep '/' -v | cut -d'.' -f 1 #在取出不是文件夹的文件后,通过分隔符‘.’来分割,取出不包括文件后缀的文件名 |
grep命令分析一行消息,如果其中有所需要的信息,就将该行取出。
1 | ls -F | grep '/' #取出文件夹的名字 |
fgrep命令用于匹配文件内容
1 | fgrep 'test' ./xxx.py |
5.排序命令:sort、wc和uniq#
(a.txt保存的是ls -al的输出)
使用sort命令进行排序
-f:表示忽略大小写
-b:忽略最前面的空格
-M:表示以月份的名字来排序,JAN、DEC等
-n:使用“纯数字”进行排序,10在9之后,而不会在1之后(默认是以文字类型来排序)
1 | cat 下载/a.txt | sort -t' ' -k 6 -n |
-r:表示反向排序
-u:表示uniq,相同的数据中,仅出现一行表示,(如果用第k栏来排序,第k栏相同的只出现一个)
-t:是分隔符,-k:是按某个字段来进行排序
1 | cat 下载/a.txt | sort -t' ' -k 6 #-t表示分割,-k表示用第k栏来排序 |
使用uniq命令来将重读的数据仅显示一次
1 | cat 下载/a.txt | cut -d' ' -f 1,2 | sort -t' ' -k 2 -n | uniq #取出权限和文件数,然后按文件数排序,再去重 |
使用wc命令来统计文件的字数、行数、字符数
-l:仅显示多少行,-w:仅显示多少字(英文单词),-m:多少字符
1 | cat 下载/a.txt | wc #分别显示“行数、字数、字符数” |
去掉第一行的“总用量”,再统计行数
1 | common@common-Aspire-4750:~$ cat 下载/a.txt | grep -v '总用量' | wc -l |
6.双向重导向:tee#
同时将数据流分送到文件和屏幕
1 | cat 下载/a.txt | sort | tee 下载/a.txt #把txt的内容排序后,双向重导向,不能使用>来把一个文件的内容修改后,再重导向回本身,该操作会清空这个文件 |
7.字符转换命令:tr、col、join、paste、expand#
tr可以用来删除一段消息中的文字,或者是进行文字消息的替换
-d:删除一段消息中的文字,-s:替换重复的字符
1 | cat a.txt | sed 's/[ ][ ]*/ /g' #先把文件中连续的空格变成一个空格,方便使用字段来进行切分或者排序 |
1 | cat a.txt | awk '{$1=$1;print}' #去掉连续空格的其他方法 |
1 | cat a.txt | tr -s ' ' #去掉连续空格的其他方法 |
1 | cat 下载/a.txt | tr '[a-z]' '[A-Z]' #把输出的所有小写字母替换成大写字母 |
1 | cat 下载/a.txt | tr -d ' ' #删除所有的空格 |
col可以用来将【tab】按键替换成为空格键,在cat -A中,【tab】会以^I来表示,【换行符】会以^M
1 | cat regTrees.py | col -x | cat -A #将tab键转换成对等的空格键 |
join可以用来处理两个文件之间的数据
-t:join默认以空格符号分割数据,并且比较“第一个字段”的数据,如果两个文件相同,则将两个数据联成一行,且第一个字段放在第一个。
-i:忽略大小写的差异
-1:表示第一个文件要用哪个字段来分析
-2:表示第二个文件要用哪个字段来分析
比如第一个文件a.txt是
1 | 1 2 3 |
第二个文件b.txt是
1 | 1 4 5 |
1 | common@common-Aspire-4750:~/下载$ join -t ' ' -1 1 a.txt -2 1 b.txt |
paste直接将两行贴在一起,且中间以[tab]键隔开
-d:后面可以接分隔符,默认以[tab]来分割
-:如果file部分写成-,表示来自标准输入的数据
1 | common@common-Aspire-4750:~/下载$ paste a.txt b.txt |
1 | common@common-Aspire-4750:~/下载$ cat a.txt | paste a.txt b.txt - | head -n 3 #把要显示的文件和后面的输出贴在一起,且只取出前三行 |
expand将【tab】按键转换成空格键
-t:后面可以接数字,一般一个tab键可以用8个空格键来替换
unexpand将空格键转换成【tab】
1 | expand -1 treeExplore.py #-t表示一个[tab]按键表示多少个字符 |
8.拆分命令:split#
split命令可以用来拆分文件
-b:后接要拆分的文件大小,可加单位,例如b,k,m等
1 | split -b 1k a_copy.txt a_split #拆分之后在前缀后面加上aa、ab、ac |
-l:按行数进行拆分
1 | ls -al | split -l 10 - lsxiazai #输出的信息,每10行记录成一个文件,必须要“-”符号 |
9.参数代换:xargs#
xargs命令可以读入stdin的数据,并且以空格符或换行符作为标示,将stdin的数据分隔成为参数,作为某个命令的参数
-0:如果输入的stdin含有特殊字符,例如`,\,空格键等字符,这个-0可以还原成一般字符。这个参数可以用于特殊状态
-e:这时EOF的意思。后面可以接一个字符串,当xargs分析到这个字符串的时候,就会停止继续工作
-p:在执行每个命令的参数的时候,都会询问用户是否执行,输入y或者n
-n:后面接次数
1 | common@common-Aspire-4750:~$ cut -d':' -f 1 < /etc/passwd | xargs |
1 | cut -d':' -f 1 < /etc/passwd | xargs finger #将输入的参数作为finger命令的输出,finger命令用于查找并显示用户信息 |
1 | cut -d':' -f 1 < /etc/passwd | xargs -p -n 5 finger #每次仅查看5个账号,且询问用户 |
1 | cut -d':' -f 1 < /etc/passwd | xargs -p -e'games' finger #当参数遇到games的时候,就包括后面的舍弃掉 |
10.减号(-)的用途#
当用到一个命令的stdout作为这次的stdin的时候,stdin和stdout可以利用“-”来替代
1 | tar -cvf - /home | tar -xvf - #后面的-取用前一个命令的stdout |
11.通配符与特殊符号#
1 | * #代表多个字母或者数字 |
1 | ctrl+C #终止当前面命令 |
12.基础正则表达式#
grep命令
-a:在二进制文件中,以文本文件的方式搜索数据
-c:计算找到”搜索字符串“的次数
-i:忽略大小写
-n:输出行号
-v:反向选择
搜索特定字符和利用[]来搜索集合字符
1 | grep -n 'the' regular-express.txt #搜索特定字符串,输出行号 |
行首字符^与行尾字符$
1 | grep -n '^[A-Z]' regular-express.txt #行首字符^,选择行首是[A-Z]的行 |
1 | grep -n '\.$' a.txt #把以.结尾的行输出,注意window的换行是^M$,Linux的换行是$ |
任意一个字符(.)与重复字符(*)
1 | grep -n 'g..d' regular-express.txt #找到有g??d字符的行 |
限定连续重复字符范围{},使用的时候需要使用转义字符{}
1 | grep -n 'o\{2\}' regular-express.txt #找到两个o的字符串的行 |
13.格式化显示:printf#
\n 输出新的一行
\t 水平的tab按键
\v 垂直的tab按键
\xNN NN为两位数的数字,可以转换数字为字符
1 | printf '%s\t %s\t %s\t \n' `cat a.txt` #``中的命令先执行,然后按格式输出,用tab分割 |
14.变量#
1 | echo $HOME #输出环境变量 |
参考
1 | https://www.huweihuang.com/linux-notes/shell/shell-var.html |
15.如何判断一个变量为空#
16.变量的有效范围#
变量能否被引用是与export有关的,被export后的变量,可以称之为“环境变量”,环境变量可以被子程序所引用,但是其他的自定义变量就不会存在于子程序中。
在scripts2.sh会去引用scripts1.sh中的变量,那么scripts1.sh就应该设置export
17.变量键盘读取、数组与申明:read、array、declare#
1、read,用来读取来自键盘输入的变量
-p:后面可以接提示符
-t:后面可以接等待的秒数,不会一直等待用户
1 | common@common-Aspire-4750:~$ read -p "请输入name:" -t 30 name #提示符和等待 |
2、declare和typeset,用来申明变量的属性
-a:申明数组(array)
-i:申明整数数字(integer)
-x:和export一样,申明环境变量
-r:将一个变量申明为只读,不可更改内容,也不能unset
1 | common@common-Aspire-4750:~$ sum=100+300 |
3.数组属性array
1 | common@common-Aspire-4750:~$ name[1]=123 |
18. shell中的$,比如$@和$##
1 | $0 Shell本身的文件名 |
$# 参数的数量
$@ 参数的内容
比如test.sh
1 | #!/bin/sh |
运行 ./test a b,输出
1 | number:2 |
19. shell中的/dev/null,代表空设备文件#
参考:Linux Shell 1>/dev/null 2>&1 含义
1 | > :代表重定向到哪里,例如:echo "123" > /home/123.txt |
20. 获得文本中的最短行和最长行#
1 | 最短行:awk '(NR==1||length(min)>length()){min=$0}END{print min}' data.txt |
21.Shift命令#
Shift命令运行一次,将会销毁一个输入参数,后面的参数前移,比如下面脚本
1 | #!/bin/bash |
输入参数是 a b c,运行一次shift,参数 a b c将会减少一个
1 | ./shift_test.sh a b c |