符号 | 含义 |
---|---|
* | 匹配任意长度字符串(包括空字符串)。特例:当文件通配符第一个字符为* 时,不匹配以. 开头的文件。 |
? | 匹配一个字符。 |
[] | 匹配方括号内任意一个字符。可以用'-'指定一个范围。例如:[A-Z]* 匹配所有以大写字母开头的文件 |
shell在执行某个命令前会先对文件通配符做展开工作,然后才执行命令
符号 | 类型 | 含义 |
---|---|---|
- | 普通文件 | 包括纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件. |
d | 目录文件 | 能用 cd 命令进入的 |
b | 块设备文件 | 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。 |
c | 字符设备 | 即串行端口的接口设备,例如键盘、鼠标等等。 |
s | 套接字文件 | 可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型 |
p | 管道文件 | 用于进程间通信 |
l | 符号链接文件 | 类似windows中的快捷方式 |
- ls命令后面不给出任何名字时,列出当前目录下所有文件和目录
- 名字为文件时,列出该文件名
- 名字为目录时,不列出目录名,而是列出列出该目录下所有的文件和子目录。
- 在同一命令行中可以指定多个名字,可以配合通配符使用,这是的执行逻辑结合2、3点。
当前目录结构如下图
.
├── a
│ └── b
│ └── c
└── linux.md
执行ls
a linux.md
执行 ls a
b
执行ls *
linux.md
a:
b
-
-a 列出所有(all)项,包括以
.
开头的隐藏文件。 -
-R 递归地列出所碰到的子目录(Recursion)。
-
-F 标记每个文件(Flag)。 标记规则:
- 目录:在文件名后加
/
- 可执行文件:在文件名后加
*
- 符号链接文件:在文件名后加
@
- 管道文件:在文件名后加
|
- 普通文件:无标记
- 目录:在文件名后加
-
-d 若ls后的名字为目录,则列出目录名,不列出目录下的文件和子目录。 eg:
ls * -d
等价于ls
-
-l 长格式列表(long)。 第一列第1个字符为文件格式,2-4个字符标识所有者权限,5-7标识同组用户权限,8-10个字符标识其他用户权限 第2列是文件的link数(i结点被引用的次数) 第3、4列是文件主的名字和组名 第5列是文件大小 第六列是最后一次被修改时间 第七列是文件名
等价于ls -al
-
cp file1 file2 把文件file1复制到file2
-
cp file1 file2 ... filen dir 把文件file1 file2 ... filen复制到已存在目录dir
-
-r/-R 递归的复制目录
-
-d 不复制软链接
-
-n 不服该已存在目录
-
-a 相当于
-dr
- mv existing-file-or-dir new-name 常用于修改文件名
- mv file1 file2 ... filen dir 把多个文件或目录移动到已存在目录dir中
-
-f 覆盖前不提示
-
-i 覆盖前询问
-
-n 不覆盖已存在文件
- rm file1 file2 ... filen 删除file1 ... filen
-
-f 忽略不存在的文件和参数,不提示
-
-i 每次删除前都提示
-
-r/-R 递归删除目录
find命令在一个指定的范围内查找符合条件的文件或者路目,然后执行相应的动作。
eg:
find dir1 dir2 -name '*.[ch]' -print
:
表示在dir1
和dir2
中查找所有以.c
或.h
结尾的文件,然后打印出文件路径。在这条命令中find
和-name
之间指定查找范围;-name
指定查找条件,在这里可以使用*,?,[]
通配符,但是这里的通配符是find命令处理的,而不需要shell展开,因此需要放在引号内;-print
表示查找到符合条件的文件后执行的动作。
-
-name 文件名的匹配。可以使用通配符,但需要放在引号内。
-
-type 文件类型的匹配。例如:
-type d
表示匹配文件目录。 -
-size ±n[b/c/w/k/M/G] 文件大小的匹配。正号表示大于,负号标识小于,无符号表示等于。数字后可加单位,默认为b(需注意大小写)。
- b 块
- c 字节
- w 字
- k 千字节
- M 兆
- G
例如:
-size +100
:表示长度大于100块。-size +100c
:表示长度大于100字节。
-
-mtime ±n: 文件最近修改(modify)时间。单位为天。
-
-atime ±n: 文件最近访问(access)时间。单位为天。
-
-user: 指定文件主。
-
-group: 指定组。
更多选项可使用man find
查看。
选项间不用符号连接表示且,用!链接表示非,用-o链接表示或。
- -print 打印符合条件的文件名。
- exec, -ok 对符合条件的查找执行某个命令。两者的区别在于**-ok**在执行命令前需要确认。
eg:
find . -name '*.[ch] -exec cat {} \;'
表示用cat命令打开以**.c或.h结尾的文件。{}
表示查找到的文件路径(中间无空格),大括号后的空格不能省,\
转义,使得find**命令可以看到分号。
打印当前工作目录(print working directory)。
创建路目
eg:mkdir hello/world
在hello目录下创建world目录。hello目录需存在,否则失败。
mkdir除了创建目录外,还在目录中创建.目录
和..目录
。
文件归档 这个命令主要掌握常用几个参数,会创建/解压等常规操作就ok。
-
-c create创建新tar文件。
-
-v 冗长(verbose)。每处理完一个文件,久打印出文件名,并冠以功能字母。
-
-f 指定设备文件名。
-
-x 抽取(extract)。解压。
-
-u 更新(update)。在末尾追加。若已经存在旧版本,则不删除旧版本,把新版本追加在尾部。
- 创建tar文件
tar -cvf a.tar filelist
- 解压tar文件
tar -xvf a.tar
tar -xvf a.tar filelist
提取a.tar中的filelist
tar -uvf a.tar filelist
更新a.tar中的filelist
tar --delete -vf a.tar filelist
删除a.tar中的filelist
采用LZW算法压缩文件,普通文本文件可压缩掉50%~80%。
解压压缩文件。
eg:
tar -cvf a.tar * 将但前目录中所有文件打包到a.tar
compress a.tar 压缩a.tar,产生a.tar.Z
将a.tar.Z通过网络发送
umcompress a.tat.Z 解压得到a.tar
tar -xvf t.tar 得到所有原始文件
- chmod [ugoa][+-=][rwx] file-list
- chmod mode file-list
u:文件主权限 g:同组用户权限 o:其他用户权限 a:所有用户权限 +:增加权限 -:取消权限 =:设置权限 r:读权限 w:写权限 x:执行权限
chmod u+rw * # 对当前目录中所有文件给文件主增加读写权限
chmod go-rwx *.[ch] # 对所有以``.c``或者.``h``文件权限同组用户和其他用户的读、写、执行权限
chmod 640 a # 设置a文件权限:文件主拥有读写权限(110),同组用户拥有读权限(100),其他用户不拥有任何权限
ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。
-s:对源文件建立符号连接,而非硬连接;
- 将目录/usr/mengqc/mub1下的文件m2.c链接到目录/usr/liu下的文件a2.c
cd /usr/mengqc
ln /mub1/m2.c /usr/liu/a2.c # a2.c为新文件
在目录/usr/liu下建立一个符号链接文件abc,使它指向目录/usr/mengqc/mub1
ln -s /usr/mengqc/mub1 /usr/liu/abc
符号连接实质是做符号替换,连接创建好后如果移动源文件,会导致链接文件失效
以树状图列出目录的内容
- tree dir
在 b-shell 中,0标识输入设备(键盘)文件描述符,1标识正常输入设备(终端)文件描述符,2表示错误输出设备(设备)文件描述符。
-
< 文件 将标准输入重定向到一个磁盘文件。
-
<< 定界符 从shell中获取数据,直到下次遇到定界符。 需要注意的是:shell会对定界符之间的内容做命令替换和变量替换, 例如:
cat << test
> $HOME
> `date`
> test
输出结果为:
/home/yimi
2018年 09月 20日 星期四 15:18:04 CST
输出结果并不是界定符之间的内容。 解决办法为:第一个定界符用单引号括起来或者在第一个定界符前加反斜杠
cat << 'test'
> $HOME
> `date`
> test
或者
cat << \test
> $HOME
> `date`
> test
cat输出的就是原生内容了。
-
> 文件 将标准输出重定向到一个磁盘文件,如果文件已存在,则覆盖。
-
>> 文件 将标准输出重定向到一个磁盘文件,如果文件已存在,则追加到文件尾部。
-
2 > 文件 将标准输出重定向到一个磁盘文件。
-
文件描述符 > &文件描述符 指定文件描述符重定向
eg:
cmd > log 2 > &1
将标准输出和标准错误输出都重定向到log文件。
cmd 1 > log 2 > &1
同上。
-
cmd1 > cmd2 将cmd1的标准输出作为cmd2的输入。
-
cmd1 2 > &1 | cmd2 将cmd1的标准输出和标准错误输出作为cmd2的输入。
用于列出文本文件的内容。 当cat命令接收的文件个数为0时,从标准输入获取内容,当文件数大于1时,按顺序打印所有文件内容。
八进制打印文件内容。
-
-x选项 十六进制打印
-
-c选项 课打印字符,打印出字符,不可打印字符,打印出ASCII码。
- head -n file 打印file中的前n行
-
tail -n file 打印出file中最后n行
-
taile -nf file 打印file中最后n行,打印后并不退出,当file中有追加时,打印出追加内容。
字计数
- wc filelist 统计filelist中的字。 输出第一列为行数,第二行为单词数,第三行为字符数,第四行为文件名。
-
-l 只统计行数
-
-c 统计byte数
-
-w 只统计单词数
-
-m 统计字符数
对文件内容排序。
-
b 忽略行首空格
-
d 字典序
-
g 按数字大小排序
-
f 需略大小写
-
i 忽略不可打印字符
-
-r reverse,逆序
-
-R 随机打乱,但是相同大小的行会在一起
-
-t 指定分隔符
-
-k 指定按第k列排序
-
-o 指定输出文件
三通,将从stdin得到的数据抄送到标准输出strout显示,同时存入磁盘文件。eg:
cmd | tee cmd.log
和shell中的通配符不同
符号 | 含义 |
---|---|
. | 匹配任意一个字符 |
* | 正则表达式后跟星号,表示匹配此单词符正则表达式的0次或任意次出现 |
[ | 匹配左方括号和右方括号之间集合中中的任意一个字符,可用减号(-)连接2个字符定义一个区间;**^**放在集合开始表示补集 |
\ | 取消特殊字符的含义 |
^ | 在**[]中的开始表示补集,在正则表达式的开始,标识以^**后的开始 |
$ | 放在正则表达式末尾,表示以**$**前的结尾 |
- grep patten filelist 当文件数小于1时,从标准输入读取数据,当文件数大于1时,查找到指定字符串时,整个行,联通该行处的文件名一起显示。
扩展正则表达式,可以使用'()',?标识0次或1次出现,+表示一次或多次出现,表达式之间可以用**'|'**连接。
快速字符串搜索,而不是按模式匹配。
grep/egrep/fgrep 都可使用下列参数:
-
-n 显示行号
-
-i 忽略大小写
-
-v 显示所有不包含模式串的行
awk逐行扫描文件,并进行处理。扫描行满足某个条件(condition)时,就执行相应的代码块。若代码块未指定条件,则所有的行都匹配。
awk程序的基本格式:
condition { action }
condition { action }
变量名 | 说明 |
---|---|
FILENAME | 当前输入文件的名字 |
$0 | 当前记录(作为单个变量) |
$1 ... Sn | 当前记录的第n个字段,字段间由FS分隔 |
FS | (Field Separator)输入字段分隔符 默认是K空白 |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始 |
RS | (Record Separator)入的记录分隔符默认为换行符 |
描述条件的方式有以下几种:
- 如果不指定任何条件,那么对文本文件的所有行进行处理
- 可以使用与C语言类似的关系运算符
- 正则表达式匹配,描述方法:
/pattern/
- 特殊的条件:BEGIN和END。BEGIN后的动作,在awk开始处理所有文本之前执行;END之后的动作,在awk处理完所有文本之后执行。
在动作部分,awk允许用户使用用户变量、条件和循环、函数、数组(map)。awk还提供了大量的内置函数,这里不再展开了,可以百度。
用法:和其他文本处理命令一样,awk支持处理0个到多个文件。
- awk
program
filelist - awk -f program-file filelist
常用选项:
- -f/--file 指定程序文件
- -F/--field-separator FS(field-separator),支持正则表达式
eg: 下来写个例子,把刚才的知识点用一遍:
题目描述
统计一篇文章中单词出现的频率、每个字母出现的频率(不区分大小写)和空行数。
单词和单词间用逗号、句号、问号、感叹号、双引号、连字符、冒号、括号分隔。假设单词中不会出现其他符号。
这个任务用awk,可能不是最适合的,在这里只作为练习。
# usage: awk -f word_count.awk file
BEGIN {
printf("=============== %s word count test ===============\n", FILENAME);
# 指定分隔符
FS = "[,.?!\"-:() ]+";
}
# 统计逻辑
function count(word) {
# 如果一行以分隔符开始或结尾,则会在一行开始之前或结束后多一个空字符串
if(word == "") return;
words[word]++;
words_cnt++;
split(word, chars, "")
for (j = 1; j <= length(word); j++) {
if(chars[j] == "'") continue;
letters[chars[j]]++;
letters_cnt++;
}
}
# 获取单词或字母的出现频率
function get_frequency(s, is_word) {
if(is_word == 1) {
return words[s]*1.0/words_cnt;
} else {
return letters[s]*1.0/letters_cnt;
}
}
# 统计空行数
NF <= 0 {
blank_lines++;
}
NF > 0 {
for (i = 1; i <= NF; i++) {
word = tolower($i);
count(word);
}
}
END {
printf("All Words: %d\n", words_cnt);
printf("All Letters: %d\n", letters_cnt);
printf("All Blank Line: %d\n", blank_lines);
print "-------------------------------------------"
for (letter in letters) {
printf("%s:\t%.2f\n", letter, get_frequency(letter, 0));
}
print "-------------------------------------------"
for (word in words) {
printf("%s:\t%.2f\n", word, get_frequency(word, 1));
}
printf("=============== %s test end ===============\n", FILENAME);
}
流编辑器,用于处理文本。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
- sed [options] 'command' file(s)
- sed [options] -f scriptfile file(s)
command部分包括:[地址1,地址2] [命令] [参数(标记)]
-f 以选项中指定的script文件来处理输入的文本文件
-n 仅显示script处理后的结果
-
s 替换指定字符
-
d 删除,删除选择的行
-
c 把选定的行改为新的文本
-
i 在当前行上面插入文本
-
g 表示行内全面替换
-
p 表示打印行
- 关于定址的概念 默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"。
sed '2s/a/b/g'
2为数字地址,s表示替换,/为定界符,g表示如何一行中有多个符合的匹配,则全部替换。/a/b/表示把a替换为b。
sed '2,4s/a/b/g'
把2到4行中所有的a替换为b
sed '2,+4s/a/b/g'
把2到6(2+4)行中的所有a替换为b
sed '4,~3s/a/b/g'
把4到6(大于4的第一个能被3整除的数)行中所有的a替换为b
sed '2~3s/a/b/g'
从第2行开始每个3行把a替换为b
sed '$s/a/b/g'
把最后一行($)中所有的a替换为b
sed '1,/^CN/d'
d表示删除,匹配从第一行到CN开头的行,把匹配的行删除
sed '10,/^TX/s/CHN/CHINA/g'
匹配从第10行开始到第一个以TX开始的行(包括),将所有的CHN替换为CHINA
http://man.linuxde.net/sed http://man.linuxde.net/sed
tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
- tr char_set1 char_set2 用第二个字符集中的字符替换第一个字符集中的字符
- tr -d char_set1 删除第一个字符集中的字符
- tr -s char_set1 把连续重复的字符(字符集中的字符)以单独一个字符表示
-
-d 删除所有属于第一字符集的字符
-
-s 把连续重复的字符以单独一个字符表示
字符集 | 含义 |
---|---|
[:alnum:] | 字母和数字 |
[:alpha:] | 字母 |
[:cntrl:] | 控制(非打印)字符 |
[:digit:] | 数字 |
[:graph:] | 图形字符 |
[:lower:] | 小写字母 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
[:space:] | 空白字符 |
[:upper:] | 大写字母 |
[:xdigit:] | 十六进制字符 |
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
把所有的大写字母换成小写字母
用于配置和显示Linux内核中网络接口的网络参数
ifconfig
查看网络参数
- 启动关闭指定网卡
ifconfig eth0 up
ifconfig eth0 down
- 为网卡配置和删除IPv6地址
ifconfig eth0 add ipv6-add #为网卡eth0配置IPv6地址
ifconfig eth0 del ipv6-add #为网卡eth0删除IPv6地址
- 用ifconfig修改MAC地址
ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE
- 配置IP地址
ifconfig eth0 ipv4
- 启用和关闭arp协议
ifconfig eth0 arp #开启网卡eth0 的arp协议
ifconfig eth0 -arp #关闭网卡eth0 的arp协议
- 设置最大传输单元
ifconfig eth0 mtu 1500
用来测试主机之间网络的连通性。使用ICMP协议。
- ping host
ping www.baidu.com
curl 是一个利用URL规则在命令行下工作的文件传输工具。支持文件的上传和下载。同时支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。
太多了,先不写,参考http://man.linuxde.net/curl
wget 用来从指定的URL下载文件。
wge URL
-
-b 进行后台的方式运行wget
-
-i 从指定文件获取要下载的URL地址(文件中存多个url)
- 使用wget下载单个文件
wget https://www.baidu.com/
- 下载并以不同的文件名保存
wget --limit-rate=300k https://www.baidu.com
- 增加重试次数
weg --tries=40 URL
- 下载多个文件
wget -i filelist.txt
tracepath、tracepath6命令用来追踪并显示报文到达目的主机所经过的路由信息。
- tracepath host
- -n 不打印主机名,只打印ip。
- -l 设置初始包长度。
用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节。
- traceroute host
结合了ping和traceroute
- mtr host
通过主机名查询ip或者根据ip查询主机名。
- host host
产看网络状态
- netstat option
-
-a/--all 显示所有连线中的Socket
-
-l/--listening 显示监控中的服务器的Socket
-
-n 直接使用ip地址,而不通过域名服务器
-
-r/--router 显示路由表
-
-s 显示网络工作信息统计表
-
-t/--tcp 显示TCP传输协议的连线状况
-
-u/--udp 显示UDP传输协议的连线状况
-
-p 显示正在使用Socket的程序识别码和程序名称
- 列出所有端口 (包括监听和未监听的)
netstat -a #列出所有端口
netstat -at #列出所有tcp端口
netstat -au #列出所有udp端口
- 列出所有处于监听状态的 Sockets
netstat -l #只显示监听端口
netstat -lt #只列出所有监听 tcp 端口
netstat -lu #只列出所有监听 udp 端口
- 显示每个协议的统计信息
netstat -s 显示所有端口的统计信息
netstat -st 显示TCP端口的统计信息
netstat -su 显示UDP端口的统计信息
- 在netstat输出中显示 PID 和进程名称
netstat -pt
nc命令是netcat命令的简称,都是用来设置路由器。
-
-l 使用监听模式,监控传入的资料
-
-p<通信端口> 设置本地主机使用的通信端口
-
-u 用UDP传输协议
-
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存
-
-w<超时秒数> 设置等待连线的时间;
- 远程拷贝文件 从server1拷贝文件到server2上。需要先在server2上,用nc激活监听。 server2上运行:
nc -lp 1234 > install.log
server1上运行:
nc -w 1 192.168.228.222 1234 < install.log
用于查看当前系统的进程状态
-
-a 显示所有终端机下执行的程序
-
-u 列出属于该用户的程序的状况
-
-x 显示所有程序,不以终端机来区分
-
-p 指定程序识别码,并列出该程序的状况
-
-l 采用详细的格式来显示程序状况。
符号 | 说明 |
---|---|
D | 不可中断 |
R | 正在运行 |
S | 休眠 |
T | 停止或被追踪 |
Z | 僵尸进程 |
W | 进入内存交换(从内核2.6开始无效) |
X | 死掉的进程 |
< | 高优先级 |
N | 低优先级 |
L | 有些页被锁进内存 |
s | 包含子进程 |
+ | 位于后台的进程组 |
l | 多线程 |
列名 | 说明 |
---|---|
USER | 用户名 |
UID | 用户号 |
PID | 进程号 |
PPID | 父进程号 |
VSZ | 虚拟内存大小(如果一个程序完全驻留在内存的话需要占用多少内存空间) |
RSS | 当前实际占用了多少内存 |
STAT | 进程状态 |
%CPU | CUP使用率 |
%MEM | 进程使用的物理内存百分比 |
TTY | 登录者的终端位置,若为远程登录使用动态终端接口(pts/n) |
TIME | 进程实际花费CPU运行的时间 |
CMD | 造成此程序的触发进程的命令为何 |
用来删除执行中的程序或工作
- kill pid
-
-l <信号编号> 若不加<信息编号>选项,则-l参数会列出全部的信息名称
-
-n n为数字表示信号编号,给进程发送编号为n的信号
- 列出信号
kill -l #列出所有信号
kill -l 9 #列出编号为9的信号的名字
- 杀死进程(实际是给进程发送信号)
kill 111 222 333 # 给所有的进程发送默认信号
kill -9 1234 # 强制杀死pid为12345的进程
###资源监控
用于查看进程打开的文件
- lsof option
-
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-
-p<进程号> 列出指定进程号所打开的文件
lsof -i:80
查看和80端口通信的进程
显示当前系统未使用的和已使用的内存数目
- free option
- -b 以Byte为单位显示内存使用情况
- -k 以KB为单位显示内存使用情况
- -m 以MB为单位显示内存使用情况
- -s<间隔秒数> 持续观察内存使用状况
可以实时动态地查看系统的整体运行情况
- top option
-
-d 屏幕刷新间隔时间
-
-u<用户名> 指定用户名
-
-p<进程号> 指定进程
-
-n<次数> 循环显示的次数
- k:终止一个进程
- q:退出程序
- M:根据驻留内存大小进行排序
- P:根据CPU使用百分比大小进行排序
- T:根据时间/累计时间进行排序
- w:将当前设置写入~/.toprc文件中