基础知识
- 指令的历史记录位于
~/.bash_history
文件中,可以使用cat
指令查看。需要注意的是,它存储的是上一次登录时执行过的命令,而这一次登录中执行的命令将先暂存在内存中- Tab键可以用来补全命令或是提示可选的操作
\
可以用来换行增强指令的可读性- 将根据环境变量PATH来寻找指令,可以使用
echo $PATH
来查看环境变量- 在命令执行的过程中,反引号中的指令会先执行,执行的结果会作为外部的输入信息,
$()
具有同样的效果- 命令执行顺序:以相对/绝对路径执行命令,以alias找到该命令来执行,由bash内置的命令来执行,通过$PATH的顺序找到第一个命令并执行
- 数据流重定向是指将某个指令执行后应该要出现在屏幕上的数据传输到其它地方。
- 直接执行和bash或sh执行脚本会在子进程中执行,而使用source执行脚本则会在父进程中执行
各种指令与例子
alias
alias
: 显示所有的别名alias lm='ls -al'
:设置别名为lmunalias <COMMAND_NAME>
: 取消别名
type
格式:type [-ta] name
可以通过type指令找到执行文件而不是一般的文件type name
: 显示name是外部指令还是bash内部指令type -t name
:外部命令则为file,别名命令则为alias,内置命令则为builtintype -a name
: 从PATH变量定义的路径中,将所有含name的命令都列出来,包括alias
echo
显示变量echo $PATH
:显示环境变量echo $HOME
: 显示当前用户的主目录echo $MAIL
: 显示当前用户的邮件目录
也可以直接赋值,赋值时需要注意等号两边不能直接接空格符,如果有空格符可以用双引号包住。如果希望累加则应当使用双引号,如name="$name"yes
unset VARIABLE
:取消对VARIABLE的赋值export VARIALBE
: 导出变量使子进程也可以使用
env
查看所有的环境变量,如PATH,HOME,SHELL
set
不仅可以查看环境变量,还可以将bash内的其他变量全部显示出来,如HISTFILE,MAILCHECK,PS1PS1
的默认格式为'[\u@\h \W]\$'
也就是我们通常看到的[rale@localhost ~]$
这里参数的含义如下:\d
: 可显示出星期月日的格式\H
: 完整的主机名\h
: 仅取主机名在第一个小数点之前的名字\t
: 显示24小时格式的时间,格式为"HH:MM:SS"\t
: 显示12小时格式的时间\A
: 显示24小时格式的时间,格式为"HH:MM"\@
: 显示时间,格式为"am/pm格式"\u
: 目前用户的账户名称\v
: bash的版本信息\w
: 完整的工作目录\W
: 利用basename获取的工作目录名称,仅显示最后一个目录名\#
: 执行的第几个命令\$
: 提示符,如果是root,则为#,否则为$
可以使用如下指令PS1='[\u@\h \w \A #\#]\$'
来修改PS1。
read
获取来自键盘的输入read [-pt] variable
-p
: 后面可以接提示符-t
: 后面可以接等待秒数read -p "please enter your name: " -t 30 name
declare/typeset
声明变量的类型,默认类型为字符串,且无法进行小数的运算declare [-aixr] variable
-a
: 将后面的变量定义为数组类型-i
: 将后面的变量定义为整数数字类型-x
: 将后面的变量定义为环境变量,等价于export-r
: 将变量设置为readonlydeclare -i sum=100+100+50
history
history n
: 显示最近n条命令history -c
: 将目前shell中所有history内容全部消除history -a histfiles
: 将目前新增的history命令新增入histfiles中。若灭有histfiles,则默认写入~/bash_history
history -r histfiles
: 将histfiles的内容读入到目前这个shell的history记忆中history -w histfiles
: 将history的内容写入histfiles!<number>
:执行编号为number的指令!command
: 执行command开头的指令!!
: 执行上一个命令
source
读入环境配置文件的命令source ENV_FILE
比如如果修改了~/.bashrc
,无需退出重新登录,直接使用source指令即可。
last
数据流重定向
标准输入:代码为0,<或<<
标准输出:代码为1,>或>>
标准错误输出:代码为2,2>或2>>
单个符号代表重写,两个符号代表添加find /home -name .bashrc > list 2>&1
将两个输出写入到同一个文件时,要使用2>&1指令cat > catfile
: 创建一个文件,并将键盘输入的数据覆盖该文件,按[ctrl]+d结束输入cat > catfile < ~/.bashrc
将该文件的内容写入并覆盖catfile的内容cat > catfile << "eof"
键盘输入eof时结束输入,eof并不会出现在文件中
管道命令
管道命令仅会处理标准输出,对于标准错误输出会予以忽略。管道命令必须要能够接收来自前一个命令的数据成为标准输入
管道命令有:less more head tail等
cut
以行为单位处理信息,将每行的数据进行分割并获取。但是在多空格的环境中使用效果不佳。cut -d '分隔字符' -f fields
用于分隔字符cut -c 字符范围
用于排列整齐的信息echo $PATH | cut -d ':' -f 3,5
将$PATH根据:分割并且获取第3个值和第5个值last | cut -d ' ' -f 1
export | cut -c 12-
获取export每行12字符开始往后的值
grep
分析一行的数据,如果有所需要的数据,就将该行取出grep [-acinv] [--color=auto] '查找字符串' filename
-a
: 将binary文件以text的方式查找数据-c
: 计算找到'查找字符串'的次数-i
: 忽略大小写不同-n
: 输出行号-v
: 输出没找到关键字的行--color=auto
: 将关键字部分上色last | grep 'root'
将last中出现root的行取出last | grep -v 'root'
将last中没有root的行取出last | grep 'root' | cut -d ' ' -f 1
将包含root的行的第一个值取出来
sort
sort [-fbMnrtuk] [file or stdin]
-f
: 忽略大小写-b
: 忽略最前面的空格符部分-M
: 以月份的名字来排序-n
: 使用纯数字排序-r
: 反向排序-u
: 相同数据仅出现一次-t
: 分隔符,默认为Tab键-k
: 以哪个区间进行排序cat /etc/passed | sort -t ':' -k 3 -n
将输入的每一行按照:分割并根据第三列进行排序,并且将第三列作为数字来排序,默认为字符串排序
uniq
删去重复的行进行统计uniq [-ic]
-i
: 忽略大小写-c
: 计数last | cut -d ' ' -f 1 | sort | uniq
last | cut -d ' ' -f 1 | sort | uniq -c
获取最近登录用户的登录次数
wc
统计文件的行数,字数和字符数wc [-lwm]
-l
仅列出多少行-w
仅列出多少字-m
多少字符cat /etc/man.config | wc
会输出该文件的行数,字数和字符数last | grep [a-zzA-z] | grep -v 'wtmp' | wc -l
知道最近登录的用户数,除去空白行和wtmp行
tee
双向重定向,即可以将一个标准输出转存一份到文件内并将同样的数据继续送到屏幕去处理tee [-a] file
-a会以累加的方式last | tee last.list | cut -d " " -f 1
将last的内容转存一份到last.list
tr
删除一段信息中的文字,或是进行文字信息的转换tr [-ds] SET1...
-d
删除信息中SET1这个字符串-s
替换掉重复的字符last | tr '[a-z] [A-Z]'
将last中的所有小写字符变成大写字符cat /etc/passwd | tr -d ':'
将输出信息中的冒号删除
col
常用于替换tab键或是将man page转存为纯文本文件以方便查阅的功能。col [-xb]
-x将tab转换为对等的空格键,-b在文字内有反斜杠/时,仅保留反斜杠后面接的字符
join
将两个文件中有相同数据的那一行加在一次。特别注意使用join前应当对文件进行排序,否则有些对比的项目会被略过join [-ti12] file1 file2
-t
: 分隔符,默认以空格符分割数据,并且对比第一个字段的数据,如果两个文件相同,则将两条数据连成一行,并且第一个字段放在第一个-i
: 忽略大小写差异-1
: 代表第一个文件要用哪个字段来分析-2
: 代表第二个文件要用哪个字段来分析join -t ':' -1 4 -2 3 /etc/passwd /etc/group
将两个文件按照:分割,第一个文件采用第4个作为比较符,第二个文件采用第3个作为比较符
paste
直接将两行粘在一起,且中间以tab键隔开paste [-d] file1 file2
-d表示分隔符,默认为tab。如果file的部分写为-,则表示来自标准输入的数据cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3
expand
将tab键转化为空格键expand [-t] file
-t后面表示空格的个数,默认为8个空格键替换grep '^MANPATH' /etc/man.confg | head -n 3 | expand -t 6 - | cat -A
此时的输出将不会出现tab键unexpand
会将空格转换为tab
split
将一个大文件依据文件大小或是行数来切割为小文件split [-bl] file PREFIX
-b
欲切割的文件大小,可加单位如b,k,m-l
以行数来切割PREFIX
: 作为切割问价你的前导文字cd /tmp; split -b 300k /etc/termcap termcap
将文件切割为不超过300k的子文件,子文件的前缀为termcapcat termcap* >> termcapback
将子文件合并ls -al / | split -l 10 - lsroot
将结果按照每十行记录为一个文件
sed
可以分析standard input,还可以将数据进行替换、删除、新增、选取特定行等sed [-nefr] [动作]
-n
使用安静模式,在一般的sed中,所有来自stdin的数据一般都会被列出到屏幕,该模式只会列出经过sed特殊处理的那一行-e
直接在命令行模式上进行sed的动作编辑-f
将sed动作写入一个文件-r
正则表示式语法-i
直接修改读取的文件内容,而不是由屏幕输出[n1][,n2]function
nl /etc/passwd | sed '2,5d'
列出/etc/passwd并删除2到5行nl /etc/passwd | sed '2,$d'
列出/etc/passwd并删除第2行至最后一行nl /etc/passwd | sed '2a hello world'
在第二行后的一行添加hello world,可以通过反斜线添加多行nl /etc/passwd | sed '2,5c No 2-5 line
将2到5行替换为No 2-5 linesed 's/要被替换的字符串/新的字符串/g'
进行逐行的正则替换操作
egrep
支持扩展的正则表达式检索,包括+
,?
,|
,()
,()+
正则表达式详情请参考这篇文章
printf
格式化打印printf '打印格式' 实际内容
awk
将一行分为数个字段来处理,默认的字段的分隔符为空格或是tab键。它适合处理小型的数据awk '条件类型1'{动作1} '条件类型2'{动作2}...
filenameNF
: 每一行拥有的字段数NR
: 目前awk在处理第几行数据FS
: 目前的分割字符,默认为空格键
awk后序的所有动作都以单引号括住,非变量的文字部分都需要用双引号定义last -n 5 | awk '{print $1 "\t lines:" NR "\t columns: " NF}'
按照默认的空格划分一行为多个字段,打印第一个字段,以及目前在第几行和每一行拥有几个字段cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'
按照:分割,取出第三个字段小于10的内容
diff
以行为单位比较两个文件的区别,通常用在同一文件的新旧版本上的区别。diff [-bBi] from-file to-file
-b
: 忽略一行当中仅有多个空白的区别,如about me
和about me
为相同的-B
: 忽略空白行的区别-i
: 忽略大小写
参考书籍
鸟哥的linux私房菜