【Shell环境中的预定义变量】
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
【bash shell内置命令】
type -a :
file:表示外部命令
alias:命令别名所设置的名称
buildin:内部命令
注:命令的执行可以使用:绝对路径和相对路径(./)两种方式。
【用户管理】
#chown 用户名 文件名 :修改文件所有者
#chgrp user 文件名 :修改文件所属组
【目录与文件】
mkdir:创建目录 mkdir ~/sbin
-m 设置用户权限
-p 如果路径中某些目录不存在,系统会自动创建
touch:创建文件 touch test.c
file:查看文件类型
ln:用于文件链接
ln -sf :符号链接。链接文件和源文件使用不同的inode号
ln -f :硬链接。链接文件和源文件使用同一个inode号
注:
linux下各种目录总结:
~/ :当前用户的主目录
./ :当前目录
../ :上一层目录
文件名前加“.”,表示该文件是隐藏文件
cp:-r 递归扫描文件
-f 强制复制
mv:-f:强制删除文件或目录;
-i:删除已有文件或目录之前先询问用户;
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理;
-v:显示指令的详细执行过程。
【文件内容查看】
cat:从第一行开始查看
tac:从最后一行开始查看
nl:查看时,显示出行号 nl test.c
more:一页一页显示,不能向前查看 more test.c 空格键向后翻页
less:和more类似,但可以向前查看 less test.c 空格键向后翻页
head:查看前几行 head -n 20 test.c
tail:查看后几行 tail -n 20 test.c
tail -n +K是输出从第K行开始的内容
cat file1 | tail -n +300 | head -n 200 查看file1文件的第300-500行的内容,也可以表示为
cat file1| head -n 500 | tail -n + 300
【系统】
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量
#dmesg:分析内核,以及其他硬件
#vmstat:检测cpu,内存,硬盘的状态
【资源】
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载
【磁盘和分区】
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况
【网络】
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息
#route #命令用来显示目前本机路由表的内容,并且还可以针对路由表中的记录来进行相应的添加、删除或修改等操作
#traceroute #linux下侦测主机到目的主机之前所经过的路由的命令
traceroute www.baidu.com
【进程】
# ps -ef # 查看所有进程
ps -l:查看当前用户下的进程
ps aux:查看所有进程
# top # 实时显示进程状态
【用户】
# w # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务
【服务】
# chkconfig --list # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务
【bash作业管理】
#&:在命令后添加一个&,如firefox &:后台执行
#jobs : 查看当前有多少在后台运行的命令
#Ctrl+z:或者发送信号17 : 用于将当前正在运行的前台进程暂停,变成后台进程
#ctrl+c:前台进程的终止。kill -9
#sleep :sleep 5表示延迟5s
#fg :将后台中的命令调至前台继续运行,如fg 1 ,1是编号
#bg :将后台暂停的进程继续运行,如bg 1,1是编号
【账户管理】
usermod -l 修改账号名称,使用格式:usermod -l new_name old_name
【查找】
1、正则表达式的基础
^ 行首标识
$ 篇尾标识或行尾标识
. 代表任意一个字符
? 代表前趋字符的一次出现
* 代表0个或多个前趋字符出现
[1-9] 代表一个属于1-9的字符
[^1-9] 代表一个不包含于1-9的字符
/< 词首标识
/> 词尾标识
/( /) 引用标识,可以多次引用,并在后面以/1 /2来引用
x/{m,n/} 代表x的至少m次,至多n次出现
正则扩展
| 用于使用多个正则条件,匹配之一即可
+ 与. *类似,表示1个或多个重复字符
() 用于将多个内容组成单元组
简单的说:
find :搜索磁盘中的文件名,并将结果以路径的形式输出在标准输出上;
grep: 搜索出现关键字的文件,并将匹配的行显示在标准输出上。
2 grep
通用格式 grep [option] regx file
功能:grep命令用于在指定文件中查找与模式匹配的行,并将匹配的行显示在标准输出上。
选项
-E 使用正则扩展
-e pattern 使用pattern中的正则
-f file 使用文件中的正则
-i 忽略大小写(性能较差,最好先用tr统一转换成大写或小写)
-v 反向显示不匹配的行
-V 显示版本号
输出控制选项:
-n 输出行号
-q 不显示未匹配的内容
-r 递归方式扫描文件
-l 只输出匹配的文件名
-L 只输出不匹配的文件名
-c 只显示匹配的个数
常用示例:
grep -i 'root' /etc/passwd 不区分大小写显示文件中有root的行
grep -v '^root' /etc/passwd 显示文件中开关不是root和行
grep -n 'root' /etc/passwd 显示文件中含有root的行,且打印此行在文件中的行号
grep -lr '$root' /etc 递归查找/etc下包含行结尾为root的文件名
grep -Lr 'root' /etc 递归查找/etc下文件中不包含root的文件名
grep -c 'root' /etc/passwd 统计文件中root出现的行数
grep "hello | world" 1.cpp 匹配包含hello的行和world的行
2、find 命令
语法:find 搜索路径 匹配表达式
功能:该命令用于在指定路径中查找符合条件的文件,搜索路径可以是多个目录,不同目录之间以空格分隔
(1)匹配表达式1
-name filename:要查找的文件名。可以使用通配符“*”,“?”,但要用双引号将文件名引起来
例子:【root@localhost tmp】# find –name “h*” –print
翻译:在当前目录下查找以h开头的文件
例子:【root@localhost tmp】# find / –name host -print
翻译:在整个文件系统中查找名为hosts的文件
-user username:查找属于username用户的文件
例子:【root@localhost tmp】# find /home –user user1 –print
翻译:找出/home下属于用户user1的所有文件
-group groupname:查找属于groupname组的文件
-print:显示找到文件路径名
(2)匹配表达式2
-exec 命令 {}:对找到的匹配文件,执行所列出的命令,而不询问用户是否执行这些命令,参数{} 由find找到当前的文件路径名取代,命令行末尾必须有“\;”。
例子:【root@localhost tmp】# find /home –user user1 –exec cat {}\;|more
翻译:找出/home下属于用户user1的所有文件并显示其内容
例子:【root@localhost tmp】# find /home –user user1 –exec rm –r {} \;
翻译:找出/home下属于用户user1的所有文件并删除
-ok 命令 {}:与-exec的用法相同,在执行命令之前询问用户是否要执行命令
(3)匹配表达式3
-atime n:查找前n天访问过的文件(仅第n天这一天)
-atime +n:查找前n天之前访问过的文件;-n则表示前n天之后
例子:【root@localhost tmp】# find /home –atime +365 –print
翻译:找出用户一年前访问过的文件
例子:【root@localhost tmp】# find $home –user user1 –atime +3 –exec rm –r {} \;
翻译:找出用户user1主目录下属于自己的前3天之前访问过文件并删除
(4)匹配表达式4
-type filetype:指定查找的文件类型
filetype 可以是:b块文件;c字符设备文件;d目录文件;f一般文件
例子:【root@localhost tmp】# find –type d –print
翻译:查找当前目录下的所有的子目录
例子:【root@localhost tmp】# find –type f –print
翻译:查找当前目录下的所有的普通文件
(5)匹配表达式5
-size Number和-size Numberc:按照文件大小进行查找。Numberc表示以字节为单位,否则以块(一般是512字节)为单位。-Number(或-Numberc)表示查找比该值小的文件,+Number(或-Numberc)表示查找比该值大的文件
例子:【root@localhost tmp】# find –size -10 –print
翻译:查找当前目录下所有长度小于10块的文件
例子:【root@localhost tmp】# find –size -10c –print | ls –l
翻译:查找当前目录下所有长度小于10字节的文件并以长格式显示文件信息
例子:【root@localhsot tmp】# find –size +100 –size -200 –exec ls –s {} \;
翻译:在当前目录下查找100~200块长的文件并显示文件的实际块数
3、sed
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)
删除某行
[root@localhost ruby] # sed '1d' ab #删除第一行
[root@localhost ruby] # sed '$d' ab #删除最后一行
[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行
[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行
显示某行
[root@localhost ruby] # sed -n '1p' ab #显示第一行
[root@localhost ruby] # sed -n '$p' ab #显示最后一行
[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行
[root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行
使用模式进行查询
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
增加一行或多行字符串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
代替一行或多行
[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end
替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
插入
[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
删除匹配行
sed -i '/匹配字符串/d' filename (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
替换匹配行中的某个字符串
sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
awk '{if ($2<0.99) print $0}' _full_datasets_ret.txt
这是因为这些命令的参数太长,即文件个数过多。其中train2014 文件夹的内容全是.jpg 格式的图片文件 解决的方法如下:
find train2014/ -name "*.jpg" | xargs -i mv {} coco_train2014/
find ./ -name "*2013*.temp" | xargs rm -rf
ps aux | grep python | awk '{system("kill "$2)}'