Linux指令
文件及目录管理
创建和删除
- 创建:mkdir
- 删除:rm
- 删除非空目录:rm -rf file目录
- 删除日志 rm *log (等价:
$find ./ -name “*log” -exec rm {} ;)
- 移动:mv
- 复制:cp (复制目录:cp -r )
查看当前目录下文件个数:
$find ./ | wc -l
复制目录:
$cp -r source_dir dest_dir
目录切换
- 找到文件/目录位置:cd
- 切换到上一个工作目录: cd -
- 切换到home目录: cd or cd ~
- 显示当前路径: pwd
- 更改当前工作路径为path: $cd path
列出目录项
- 显示当前目录下的文件 ls
- 按时间排序,以列表的方式显示目录项 ls -lrt
以上这个命令用到的频率如此之高,以至于我们需要为它建立一个快捷命令方式:
在.bashrc 中设置命令别名:
alias lsl='ls -lrt'
alias lm='ls -al|more'
这样,使用lsl,就可以显示目录中的文件按照修改时间排序;以列表方式显示;
注:.bashrc 在/home/你的用户名/ 文件夹下,以隐藏文件的方式存储;可使用 ls -a 查看;
- 给每项文件前面增加一个id编号(看上去更加整洁):
>ls | cat -n
查找目录及文件 find/locate
搜寻文件或目录:
$find ./ -name "core*" | xargs file
查找目标文件夹中是否有obj文件:
$find ./ -name '*.o'
递归当前目录及子目录删除所有.o文件:
$find ./ -name "*.o" -exec rm {} \;
find是实时查找,如果需要更快的查询,可试试locate;locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库:
$locate string
寻找包含有string的路径:
$updatedb
与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。
查看文件内容
查看文件:cat vi head tail more
显示时同时显示行号:
$cat -n
按页显示列表内容:
$ls -al | more
只看前10行:
$head - 10 **
显示文件第一行:
$head -1 filename
显示文件倒数第五行:
$tail -5 filename
查看两个文件间的差别:
$diff file1 file2
动态显示文本最新信息:
$tail -f crawler.log
查找文件内容
使用egrep查询文件内容:
egrep '03.1\/CO\/AE' TSF_STAT_111130.log.012
egrep 'A_LMCA777:C' TSF_STAT_111130.log.035 > co.out2
文件与目录权限修改
- 改变文件的拥有者 chown
- 改变文件读、写、执行等属性 chmod
- 递归子目录修改: chown -R tuxapp source/
- 增加脚本可执行权限: chmod a+x myscript
给文件增加别名
创建符号链接/硬链接:
ln cc ccAgain :硬连接;删除一个,将仍能找到;
ln -s cc ccTo :符号链接(软链接);删除源,另一个无法使用;(后面一个ccTo 为新建的文件)
管道和重定向
- 批处理命令连接执行,使用 |
- 串联: 使用分号 ;
- 前面成功,则执行后面一条,否则,不执行:&&
- 前面失败,则后一条执行: ||
ls /proc && echo suss! || echo failed.
能够提示命名是否执行成功or失败;
与上述相同效果的是:
if ls /proc; then echo suss; else echo fail; fi
重定向:
ls proc/*.c > list 2> &l 将标准输出和标准错误重定向到同一文件;
等价的是:
ls proc/*.c &> list
清空文件:
:> a.txt
重定向:
echo aa >> a.txt
设置环境变量
启动帐号后自动执行的是 文件为 .profile,然后通过这个文件可设置自己的环境变量;
安装的软件路径一般需要加入到path中:
PATH=$APPDIR:/opt/app/soft/bin:$PATH:/usr/local/bin:$TUXDIR/bin:$ORACLE_HOME/bin;export PATH
Bash快捷输入或删除
快捷键:
Ctl-U 删除光标到行首的所有字符,在某些设置下,删除全行
Ctl-W 删除当前光标到前边的最近一个空格之间的字符
Ctl-H backspace,删除光标前边的字符
Ctl-R 匹配最相近的一个文件,然后输出
综合应用
查找record.log中包含AAA,但不包含BBB的记录的总数:
cat -v record.log | grep AAA | grep -v BBB | wc -l
总结
文件管理,目录的创建、删除、查询、管理: mkdir rm mv
文件的查询和检索: find locate
查看文件内容:cat vi tail more
管道和重定向: ; | && >
文本处理
find 文件查找
查找txt和pdf文件:
find . \( -name "*.txt" -o -name "*.pdf" \) -print
正则方式查找.txt和pdf:
find . -regex ".*\(\.txt|\.pdf\)$"
-iregex: 忽略大小写的正则
否定参数 ,查找所有非txt文本:
find . ! -name "*.txt" -print
指定搜索深度,打印出当前目录的文件(深度为1):
find . -maxdepth 1 -type f
定制搜索
- 按类型搜索
find . -type d -print //只列出所有目录
-type f 文件 / l 符号链接 / d 目录
find支持的文件检索类型可以区分普通文件和符号链接、目录等,但是二进制文件和文本文件无法直接通过find的类型区分出来;
file命令可以检查文件具体类型(二进制或文本):
$file redis-cli # 二进制文件
redis-cli: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$file redis.pid # 文本文件
redis.pid: ASCII text
所以,可以用以下命令组合来实现查找本地目录下的所有二进制文件:
ls -lrt | awk '{print $9}'|xargs file|grep ELF| awk '{print $1}'|tr -d ':'
-
按时间搜索
- -atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
- -mtime 修改时间 (内容被修改)
- -ctime 变化时间 (元数据或权限变化)
最近第7天被访问过的所有文件:
find . -atime 7 -type f -print
最近7天内被访问过的所有文件:
find . -atime -7 -type f -print
查询7天前被访问过的所有文件:
find . -atime +7 type f -print
- 按大小搜索:
w字 k M G 寻找大于2k的文件:
find . -type f -size +2k
按权限查找:
find . -type f -perm 644 -print //找具有可执行权限的所有文件
按用户查找:
find . -type f -user weber -print// 找用户weber所拥有的文件
找到后的后续动作
- 删除
删除当前目录下所有的swp文件:
find . -type f -name "*.swp" -delete
另一种语法:
find . type f -name "*.swp" | xargs rm
- 执行动作(强大的exec)
将当前目录下的所有权变更为weber:
find . -type f -user root -exec chown weber {} \;
注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;
将找到的文件全都copy到另一个目录:
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
- 结合多个命令
如果需要后续执行多个命令,可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可:
-exec ./commands.sh {} \;
-print的定界符
默认使用’\n’作为文件的定界符;
-print0 使用’\0’作为文件的定界符,这样就可以搜索包含空格的文件;
grep 文本搜索
grep match_patten file // 默认访问匹配行
常用参数
-
-o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
-
-c 统计文件中包含文本的次数
grep -c “text” filename
-
-n 打印匹配的行号
-
-i 搜索时忽略大小写
-
-l 只打印文件名
在多级目录中对文本递归搜索(程序员搜代码的最爱):
grep "class" . -R -n
匹配多个模式:
grep -e "class" -e "vitural" file
grep输出以0作为结尾符的文件名(-z):
grep "test" file* -lZ| xargs -0 rm
综合应用:将日志中的所有带where条件的sql查找查找出来:
cat LOG.* | tr a-z A-Z | grep "FROM " | grep "WHERE" > b
查找中文示例:工程目录中utf-8格式和gb2312格式两种文件,要查找字的是中文;
-
查找到它的utf-8编码和gb2312编码分别是E4B8ADE69687和D6D0CEC4
-
查询:
grep:grep -rnP "\xE4\xB8\xAD\xE6\x96\x87|\xD6\xD0\xCE\xC4" *即可
xargs 命令行参数转换
xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find; - 将多行输出转化为单行输出
cat file.txt| xargs
n 是多行文本间的定界符
- 将单行转化为多行输出
cat single.txt | xargs -n 3
-n:指定每行显示的字段数
xargs参数说明
- -d 定义定界符 (默认为空格 多行的定界符为 n)
- -n 指定输出为多行
- -I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
- -0:指定0为输入定界符
示例:
cat file.txt | xargs -I {} ./command.sh -p {} -1
#统计程序行数
find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l
#redis通过string存储数据,通过set存储索引,需要通过索引来查询出所有的值:
./redis-cli smembers $1 | awk '{print $1}'|xargs -I {} ./redis-cli get {}
sort 排序
字段说明
- -n 按数字进行排序 VS -d 按字典序进行排序
- -r 逆序排序
- -k N 指定按第N列排序
示例:
sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符
uniq 消除重复行
sort unsort.txt | uniq
- 统计各行在文件中出现的次数
sort unsort.txt | uniq -c
- 找出重复行
sort unsort.txt | uniq -d
可指定每行中需要比较的重复内容:-s 开始位置 -w 比较字符数
用tr进行转换
- 通用用法
echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符
cat text| tr '\t' ' ' //制表符转空格
- tr删除字符
cat file | tr -d '0-9' // 删除所有数字
-c 求补集
cat file | tr -c '0-9' //获取文件中所有数字
cat file | tr -d -c '0-9 \n' //删除非数字数据
- tr压缩字符
tr -s 压缩文本中出现的重复字符;最常用于压缩多余的空格:
cat file | tr -s ' '
- 字符类
tr中可用各种字符类:
- alnum:字母和数字
- alpha:字母
- digit:数字
- space:空白字符
- lower:小写
- upper:大写
- cntrl:控制(非可打印)字符
- print:可打印字符
使用方法:tr [:class:] [:class:]
tr '[:lower:]' '[:upper:]'