文件查找 find
简单的find
# 查找当前目录下的某个文件find -name "target.java"
带有正则表达式的find
#从根目录下 . 用户目录 ~ 查找某个文件find . -name "target.*"# 这里需要注意的是'和"在对于普通字符串来说是没有区别的,对于find -name来说""中只会被最终解析成一个字符串
忽略大小写
# 忽略大小写find -iname 'target.*'
其他指令
man find
检索文件内容-grep
grep [options] pattern [file]
全称:Global Regular Expression Print
作用:查找文件里符合条件的字符串
补充:部分符合,不是完全匹配,必须要和patter符合,并且是按行匹配。str
和pattern
str | pattern | match | |
---|---|---|---|
'strrrrr' | 'str' | 'strrr1' | |
'trrrrr' | 'str' | None | |
'trrr1str something behind youstrr1stend' | 'str' | 'str something behind youstrr1' | |
'trrr1str something behind youstrr1stend' | 'str*' | 'str something behind youstrr1stend' |
指令man:
-o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
-o输出正则表达式匹配的数据不是行-v, --invert-match Invert the sense of matching, to select non-matching lines.
-v 反向过滤
# 找出日志中WARN 的部分并使用-o打印出对应部分 'WARN'grep 'WARN' house-info.log | grep -o 'WARN'
# 去除自身的部分ps -aux | grep postfix | grep -v 'grep'# 匹配以A开头的grep '^A' house-info.log # 匹配以B结尾的grep 'B$' house-info.log# 匹配正整数grep '[1-9][0-9]*' house-info.log # 由于默认的模式下不支持\d 和 \D,+.?,+被改为了\+,?为\?
流重定位符
/> 用于重定向流到文件中,会进行覆盖而不是追加
/>>用于重定向流到文件中,进行追加
0:屏幕输入流,1:屏幕正确输出流,2:屏幕错误输出流
1>:以覆盖的的方式将正确的数据重定向到指定的文件或装置上
2>:以覆盖的方式将错误的数据重定向到指定的文件或设备上
既然已经提到流重定向,不放再提提Linux黑洞 /dev/null,能处理不需要的信息
command>a 2>a 与 command>a 2>&1的区别
通过上面的分析,对于command>a 2>&1
这条命令,等价于command 1>a 2>&1
可以理解为执行command产生的标准输入重定向到文件a中,标准错误也重定向到文件a中。那么是否就说command 1>a 2>&1
等价于command 1>a 2>a
呢。其实不是,command 1>a 2>&1
与command 1>a 2>a
还是有区别的,区别就在于前者只打开一次文件a,后者会打开文件两次,并导致stdout被stderr覆盖。&1
的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的a。从IO效率上来讲,command 1>a 2>&1
比command 1>a 2>a
的效率更高。
也就是说command 1>a 2>a
是打开两次文件。
awk 三个人名
awk [选项参数] 'script' var=value file(s)
或awk [选项参数] -f scriptfile var=value file(s)awk -F "splitor"
awk
需要制定文件分割符,默认为' ' ,需要注意的是空格的指定是通过-F
。常用的常量包括NR(Number of Rows行数),FS(不知道英文 当前行分割符),NF(当前拥有的字段数 $0的长度)
grep '\[ ACC \]' new.txt | awk -F " " '{res[$9]++ }END{for(i in res){print 'name:' i "\tnumber:" res[i]}}'# 统计每个单词出现的次数 以空格为分割符awk -F " " '(NR>=1){res[$9]++ }{print "rows:"NR "\tname:"$9 "\tNF:"NF}END{for(r in res)print r "\tnumber:" res[r]}' new.txt
需要注意的是每行执行体中只能执行一个语句
{}
如{res[$9]++ print $9}
是不正确的需要改为{res[$9]++}{print $9}
'和"
'表示纯粹的字符串
"表示的字符串还需要经过解析
n = 3echo '$n' # '$n'echo "$n" # 3
sed指令
sed全名为stream editor 流式编辑器,也是一个以行为单位的工具,主要用于替换而不是查找,统计
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~ s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
字符串替换opeartion/old/new/model
,model
为可选参数g|None
,g
代表替换一行中的所有匹配的东西
替换操作s
# 进行替换而不修改原来的文件 替换全部str为String 注意包含有g,意味着全部替换sed '/s/str/String/g' target3.java# 进行替换并修改文件sed -i ........# 替换文件并修改到指定的临时文件上 注意使用的是"",使用双引号而不是单引号可以使shell脚本更加灵活sed -f "newFile_$$" '/s/str/String/g' target3.java
删除和打印操作
sed -n '1p' file #显示第一行sed -n '$p' file #显示最后一行sed -n '1,2p' file #显示第一行到最后一行sed -n '1,$p' file# 删除的话将p换为d
需要进行更加复杂的定位比如第二行到倒数第三行需要在自己计数给出范围
tar指令
-z,--gzip,--gunzip,--ungzip 调用执行压缩或解压缩。
-v,--verbose 列出每一步处理涉及的文件的信息,只用一个“v”时,仅列出文件名,使用两个“v”时,列出权限、所有者、大小、时间、文件名等信息。
-f,--file [主机名:]文件名 指定要处理的文件名。可以用“-”代表标准输出或标准输入
-x,--extract,--get 解开tar文件
-c,压缩文件
压缩
tar -czvf
解压
tar -xzvf