Linux命令大全
文档
第六章:IO
6.1、stdout、stderr、stdin
stdout、stderr、stdin对应文件描述符的索引:0,1,2
6.1.1、stdout重定向( >/>> :重定向符)
- 重定向功能可以选择将选择将标准输出发送到哪里
# 将ls -l的命令输出保存到ls-output.txt里面 (39971K)
[root@localhost ~]# ls -l /usr/bin > ls-output.txt
[root@localhost ~]# ls -l ls-output.txt
-rw-r--r--. 1 root root 39971 Apr 29 09:31 ls-output.txt
# 查看ls-output.txt内容
[root@localhost ~]# less ls-output.txt
total 59740
-rwxr-xr-x. 1 root root 41496 Nov 5 2016 [
-rwxr-xr-x. 1 root root 107848 Apr 1 21:20 a2p
-rwxr-xr-x. 1 root root 52640 Apr 2 09:14 ab
......
- 将目录名称转换为一个不存在的目录
(为什么错误显示在屏幕上:因为此时未将其重定向标准错误,只重定向了标准输出,故错误消息仍然在屏幕上)
[root@localhost ~]# ls -l /bin/usr > ls-output.txt
ls: cannot access /bin/usr: No such file or directory
# 此时ls-output.txt 内容被重置为0
[root@localhost ~]# ls -l ls-output.txt
-rw-r--r--. 1 root root 0 Apr 29 09:34 ls-output.txt
(文件大小为零的原因:因为当重定向符">"来重定向输出时,目的文件从开头部分开始改写,而ls未输出任何信息,只有一条错误信息显示在屏幕上,故重定向开始改写文件,并在错误时停止,故此时文件内容被删除)
- 删除文件内容(或者创建一个新的空文件夹)
[root@localhost ~]# > ls-outout.txt
仅仅使用重定向符,在前面不加任何命令
- 覆盖文件(从尾部添加元素)
[root@localhost ~]# ls -l /usr/bin >> ls-output.txt
[root@localhost ~]# ls -l /usr/bin >> ls-output.txt
[root@localhost ~]# ls -l /usr/bin >> ls-output.txt
# (生成原来三倍大小的文件)
[root@localhost ~]# ls -lh ls-output.txt
-rw-r--r--. 1 root root 118K Apr 29 09:45 ls-output.txt
使用重定向符:">>"
6.1.2、stderr重定向
将"2"放于重定向之前,错误将重定向到ls-error.txt
[root@localhost ~]# ls -l /bin/usr 2> ls-error.txt
6.1.3、stdout和stderr重定向到同一个文件
[root@localhost ~]# ls -l bin/usr &> ls-output.txt
[root@localhost ~]# less ls-output.txt
ls: cannot access bin/usr: No such file or directory
此时将stdout和stderr都重定向到了ls-output.txt文件
6.1.4、处理不想要的命令
(有时候命令执行后我们不想要得到输出,而是直接将输出丢弃,特别是输出错误和状态信息下,即抑制(隐藏)一个命令的错误信息)
# 重定向到/dev/null
[root@localhost ~]# ls -l /bin/usr 2> /dev/null
6.1.5、stdin重定向
- cat:合并文件
格式:cat [file…]
作用:读取一个或者多个文件,并将其复制到标准输出文件中
# crtl+d:代表到了文件结尾了
[root@localhost ~]# cat
This is my cat
This is my cat
[root@localhost ~]#
# 输入到lazy_dog.txt文件里面
[root@localhost ~]# cat > lazy_dog.txt
This is my dog
# 为了看到结果:使用cat将文件复制到标准输出文件中
[root@localhost ~]# cat lazy_dog.txt
This is my dog
# "<":将标准输出的源头从键盘转换为lazy_dog.txt文件
[root@localhost ~]# cat < lazy_dog.txt
This is my dog
6.2、管道
管道操作符:’|’ 将一个命令的标准输出传送到另一个命令的标准输入
command1 | command2
# 通过这条命令可以查看任意一条生成标准输出的命令
[root@localhost ~]# ll /usr/bin | less
total 59740
-rwxr-xr-x. 1 root root 41496 Nov 5 2016 [
-rwxr-xr-x. 1 root root 107848 Apr 1 21:20 a2p
...
过滤器
sort–排序
目标:将/bin和usr/bin目录下的所有可执行文件合并成一个列表,并且按照顺序排列,最后查看这个列表
[root@localhost ~]# ls /bin/ usr/bin | sort | less
[
a2p
ab
addr2line
...
base64
basename
bash
...
uniq–报告或忽略重复行
[root@localhost ~]# ls /bin /usr/bin | sort | uniq | less
# 若想查看重复行 uniq -d
[root@localhost ~]# ls /bin /usr/bin | sort | uniq -d | less
wc-(word count)-打印行数、字数、字节数
[root@localhost ~]# wc lazy_dog.txt
1 4 15 lazy_dog.txt
[root@localhost ~]# ls /bin /usr/bin | sort | uniq | wc
706 705 6156
# -l:限制只报告行数
# 查看排好序的条目数
[root@localhost ~]# ls /bin /usr/bin | sort | uniq | wc -l
706
grep–查找匹配文本
Usage: grep [OPTION]… PATTERN [FILE]…
# 查找文件名包含zip的文件
[root@localhost ~]# ls /bin /usr/bin | sort | uniq | grep zip
gpg-zip
gunzip
gzip
-i:grep搜索时忽略大小写
-v:grep搜索时只输出与模式不匹配的行(取反)
head/tail:打印文件开头及结尾
# -n:调整输出行数
[root@localhost ~]# head -n 3 ls-output.txt
total 59740
-rwxr-xr-x. 1 root root 41496 Nov 5 2016 [
-rwxr-xr-x. 1 root root 107848 Apr 1 21:20 a2p
[root@localhost ~]# tail -n 3 ls-output.txt
-rwxr-xr-x. 1 root root 5916 Aug 2 2017 zgrep
-rwxr-xr-x. 1 root root 2041 Aug 2 2017 zless
-rwxr-xr-x. 1 root root 2859 Aug 2 2017 zmore
# 管道中应用
[root@localhost ~]# ls /usr/bin | tail -n 5
zgrep
zless
zmore
znew
zsoelim
tail的一个选项:查看实时文件(如观察正在被写入的日志文件)
# -f:tail可持续跟踪这个文件,一旦增加新行。会立即显示在屏幕上,ctrl+c终止
[root@localhost ~]# tail -f /var/log/messages
Apr 29 10:09:20 localhost NetworkManager[713]: <info> [1588169360.0154] dhcp4 (ens33): state changed bound -> bound
Apr 29 10:09:20 localhost dbus[663]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service'
Apr 29 10:09:20 localhost systemd: Starting Network Manager Script Dispatcher Service...
Apr 29 10:09:20 localhost dbus-daemon: dbus[663]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service'
Apr 29 10:09:20 localhost dhclient[835]: bound to 192.168.0.103 -- renewal in 3160 seconds.
Apr 29 10:09:20 localhost dbus[663]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Apr 29 10:09:20 localhost dbus-daemon: dbus[663]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Apr 29 10:09:20 localhost systemd: Started Network Manager Script Dispatcher Service.
Apr 29 10:09:20 localhost nm-dispatcher: req:1 'dhcp4-change' [ens33]: new request (3 scripts)
Apr 29 10:09:20 localhost nm-dispatcher: req:1 'dhcp4-change' [ens33]: start running ordered scripts...
第七章:扩展与引用(echo)
echo:显示一行文本
1、扩展
[root@localhost ~]# echo this is a test
this is a test
[root@localhost ~]# echo *
anaconda-ks.cfg lazy_dog.txt ls-error.txt ls-output.txt
发生了什么?此时将 * 扩展为匹配文件名中的任意字符,故打印出全部文件名
路径名扩展
[root@localhost ~]# ls
anaconda-ks.cfg lazy_dog.txt ls-error.txt ls-output.txt
[root@localhost ~]# ls a*
anaconda-ks.cfg
[root@localhost ~]# echo a*
anaconda-ks.cfg
[root@localhost ~]# echo *t
lazy_dog.txt ls-error.txt ls-output.txt
# 查看除主目录之外的其他目录
[root@localhost ~]# echo /usr/*/share
/usr/local/share
# 查看隐藏文件的路径名
# 此时扩展为以一个点字符开头的所有文件名,.后面至少要跟个字符
[root@localhost ~]# ls -d .[!.]?*
.bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
波浪线扩展
# 默认:扩展为当前用户的主目录名
[root@localhost ~]# echo ~
/root
# 指定参数
[root@localhost ~]# echo ~mine
/home/mine
算术扩展(只支持整数)
格式:$((expression))
[root@localhost ~]# echo $((2+2))
4
[root@localhost ~]# echo $(($((5**2)) * 3))
75
[root@localhost ~]# echo $(((5**2)*3))
75
[root@localhost ~]# echo Five divided by two equals $((5/2))
Five divided by two equals 2
[root@localhost ~]# echo with $((5%2)) left over
with 1 left over
花括号扩展
花括号可包含一系列逗号分割的字符串,也可以包含一系列整数或者单个字符
[root@localhost ~]# echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back
[root@localhost ~]# echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
[root@localhost ~]# echo {z..a}
z y x w v u t s r q p o n m l k j i h g f e d c b a
[root@localhost ~]# echo a{A{1,2},B{1,2}}b
aA1b aA2b aB1b aB2b
应用:生成日期
[root@localhost ~]# mkdir Pics
[root@localhost ~]# cd Pics/
[root@localhost Pics]# mkdir {2015..2018}-0{1..9} {2015..2018}-{10..12}
[root@localhost Pics]# ls
2015-01 2015-06 2015-11 2016-04 2016-09 2017-02 2017-07 2017-12 2018-05 2018-10
2015-02 2015-07 2015-12 2016-05 2016-10 2017-03 2017-08 2018-01 2018-06 2018-11
2015-03 2015-08 2016-01 2016-06 2016-11 2017-04 2017-09 2018-02 2018-07 2018-12
2015-04 2015-09 2016-02 2016-07 2016-12 2017-05 2017-10 2018-03 2018-08
2015-05 2015-10 2016-03 2016-08 2017-01 2017-06 2017-11 2018-04 2018-09
参数扩展
格式:$(变量)
[root@localhost ~]# echo $USER
root
# 查看可用变量名
[root@localhost ~]# printenv | less
XDG_SESSION_ID=2
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.0.104 54053 22
...
# 错误的变量名仍然会进行扩展,此时为空字符串
[root@localhost ~]# echo $da
命令替换(此时是括号)
格式:$(expression)
可以当成命令输出的扩展模式
[root@localhost ~]# echo $(ls)
anaconda-ks.cfg lazy_dog.txt ls-error.txt ls-output.txt Pics
# 应用于整个管道 此时管道输出的为file命令的参数列表
[root@localhost ~]# file $(ls /usr/bin/* | grep zip)
/usr/bin/gpg-zip: POSIX shell script, ASCII text executable
/usr/bin/gunzip: POSIX shell script, ASCII text executable
/usr/bin/gzip: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=31a65cac38d3c43e1414595f0819a2b9b717b4cf, stripped
# 获取cp的完整路径(未成功实现)
[root@localhost ~]# ls $(which cp)
ls: invalid option -- '''
Try 'ls --help' for more information.
# 替代
[root@localhost ~]# which cp
alias cp='cp -i'
/usr/bin/cp
[root@localhost ~]# ll /usr/bin/cp
-rwxr-xr-x. 1 root root 155168 Nov 5 2016 /usr/bin/cp
2、引用
有选择性的避免不必要的扩展
双引号
如果将文本放在反斜杠里面,那么所有特殊字符都将失去意义("$"、""、"’"除外)
如果一个文本名为two words.txt
# 此时可以访问到
ls -l "two words.txt"
# 改名
mv "two words.txt" two_words.txt
参数扩展、算术扩展、和命令替换在双引号中仍然生效
[root@localhost ~]# echo "$USER $((2+2)) $(cal)"
root 4 April 2020
Su Mo Tu We Th Fr Sa
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 28 29 30
对字符的影响
# 默认都为4个不同参数,空格、制表符、换行符默认都为分隔符
[root@localhost ~]# echo this is a test
this is a test
# 此时被当成参数的一部分
[root@localhost ~]# echo "this is a test"
this is a test
命令替换时的影响
# 默认为38个参数
[root@localhost ~]# echo $(cal)
April 2020 Su Mo Tu We Th Fr Sa 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 28 29 30
# 默认为一个参数
[root@localhost ~]# echo "$(cal)"
April 2020
Su Mo Tu We Th Fr Sa
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 28 29 30
单引号
抑制所有扩展
# 三种进行比较
[root@localhost ~]# echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /root/lazy_dog.txt /root/ls-error.txt /root/ls-output.txt a b foo 4 root
[root@localhost ~]# echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 root
[root@localhost ~]# echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
转义字符(参考书籍即可)
第八章:常用快捷键
- clear
- history
- 组合使用如:history | less
- history | grep /usr/bin
- ctrl+f:光标向前移动一个字符
- ctrl+b:光标向后移动一个字符
- ctrl+l:清屏
- ctrl+p:向上
- ctrl+n:向下
- Tab