找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件,然后把他们重新生成一下。要求只能用一行命令。
我对Linux 是个白痴,工作了之后才开始接触的,会用的命令只有那几个常用的。这个问题对我来说就有点难度,我只是大概知道查找文件用 grep ,其他的就不知道了。不过没关系,用Google ,查找到 grep 的完整用法:
1、grep -l ‘boss’ * 显示所有包含boss的文件名。
2、grep -n ‘boss’ file在匹配行之前加行号。
3、grep -i ‘boss’ file显示匹配行,boss不区分大小写。
4、grep -v ‘boss’ file显示所有不匹配行。
5、grep -q ‘boss’ file找到匹配行,但不显示,但可以检查grep的退出状态。(0为匹配成功)
6、grep -c ‘boss’ file只显示匹配行数(包括0)。
7、grep “$boss” file扩展变量boss的值再执行命令。
8、ps -ef|grep “^*user1″ 搜索user1的命令,即使它前面有零个或多个空格。
9、ps -e|grep -E ‘grant_server|commsvr|tcpsvr|dainfo’ 查找多个字符串的匹配(grep -E相当于egrep)
了解了grep的参数之后,问题就解决了一半了,因为可以搜索出符合条件的文件了。不过光有grep 还是不行,因为要把搜索出来的文件名作为参数传给 generate 命令。OK,接下来该管道符出场了。
即使是像我这样对Linux只是有一点了解的人也经常用到管道符,比如“|”,示例: ls -a | more 。但是对于管道符的具体意义和它做了什么我就不知道了,没关系,Google 一下,找到一些资料:
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
所以查找的时候可以这样写:
grep -rl “aaa” * | grep -v “bbb”
这样右边的命令就可以从前面的结果中筛选了。然后还有 generate 命令,因为生成文件的命令格式是这样的:
generate 文件名
不过如果直接使用 generate grep -rl “aaa” * | grep -v “bbb” 的话会出错,因为命令会从左向右执行,这条命令就会把grep作为一个文件名来看待。怎么办呢?这个时候就要使用 · (键盘上数字键1 旁边的那个符号,和“~”在一个按键上)来做命令替换了,用 · 把后面的 grep 命令包起来就好了,这样:
generate ·grep -rl “aaa” * | grep -v “bbb”·
然后就搞定了。
http://www.linuxidc.com/Linux/2011-04/34694.htm
grep 正则匹配文件
grep -in 被查找的字符串 *.log
注意: 正则匹配前后不能有 双引号出现。否则匹配不到。
这样会列出文件夹。
比
find . -name "被查找的字符串" *.log | xargs cat |grep ERROR
这种要好,用cat 后grep没有显示出查找的内容在哪个文件。
混合使用
有时候我们会查询正在改变的文件,但是我们只想查看其中的某一些信息,这时候就可以使用tail、grep的混合使用
tail -f filename | grep 'DEBUG'
实例
tail -f tmd.log | grep 'DEBUG.template.begin'
假设当前目录下有多个zip文件
data.zip invoices.zip pictures.zip visit.zip,
直接
unzip *.zip
等价于
unzip data.zip invoices.zip pictures.zip
会报错
Archive: data.zip
caution: filename not matched: invoices.zip
caution: filename not matched: pictures.zip
caution: filename not matched: visit.zip
因为会认为后面三个zip文件是在第一个zip文件里面的,因此需要
unzip '*.zip'
或者
unzip "*.zip"
或者
unzip \*.zip
来屏蔽掉linux的通配符(man可以看到Be sure to quote any character that might otherwise be interpreted or modified by the operating system, particularly under Unix and VMS.)
或者
for z in *.zip; do unzip $z; done
————————————————
unzip解压到指定目录
unzip xx -d <目录>
例如查询2020-02-19 14:10到2020-02-19 14:15区间的日志
1 |
|
查找两个文件的相同之处
方法一:sort
| uniq -d (
- -d或--repeated 仅显示重复出现的行列。
)
方法二:awk
'{print $0}' 文件1 文件2 | sort | uniq -d
方法三:grep 只能用于两个文件中一整行内容都相同的结果的查找,速度较快
-f 文件1 文件2
grep -Ff 文件1 文件2
方法四:grep 一行中部分内容相同的情况处理
grep -wf 文件1 文件2
查找两个文件的不同之处
diff 文件1 文件2
两个文件相减
file1-file2:去除掉file2中的行
grep -vFf file2 file1 //从file1中去除file2文件中的共同项
grep -vwf file2 file1 //从file1中去除file2文件中的共同项
grep -Ff只能用于两个文件中一整行内容都相同的结果的查找,速度较快,但是遇到一行中部分内容相同的情况就处理不了,所以就有了grep -wf。
grep -Ff text1 text2 //整行相同
grep -wf text2 text1 //部分相同
grep -f 1.list 2.list //输出2.list中包含1.list中行的行
grep -vwf 1.list 2.list //在2.list中删除与1.list相同的行并输出
grep -vFf 1.list 2.list //在2.list中删除与1.list相同的行并输出
grep -Ff text1 text2 //整行相同
grep -wf text2 text1 //部分相同
grep -f 1.list 2.list //输出2.list中包含1.list中行的行
grep -vwf 1.list 2.list //在2.list中删除与1.list相同的行并输出
grep -vFf 1.list 2.list //在2.list中删除与1.list相同的行并输出
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-w, --word-regexp force PATTERN to match only whole words
(、
摘要:缺陷是这个只要匹配(file1字符串包含file2)就行,而不是全部相等
例子:file1:
1 ww
2 mm
3 df
4 df
5 sf
6 as
7 jk
8 mk
a kl
b lk
c kk
d ll
file2:
d ll
c kk
2 mm
结果:file1-file2:去除掉file2中的行
grep -vFf file2 file1
命令分析:grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
-f StringFile 指定包含字符串的文件。
-v反向
1、统计两个文本文件的相同行
grep -Ff file1 file2
2、统计file1中有,file2中没有的行 file1-file2
grep -vFf file2 file1
)
-w或--word-regexp: 只显示全字符合的列。
-v或--revert-match: 反转查找。
-f<范本文件>或--file=<范本文件>: 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
-v, --invert-match select non-matching lines
-f, --file=FILE obtain PATTERN from FILE
-w, --word-regexp force PATTERN to match only whole words
grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。
grep -E 'pattern1|pattern2' filename
或者使用egrep 'pattern1|pattern2' filename
、
- 使用多个grep命令
可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。
grep -E 'pattern1' filename | grep -E 'pattern2'
- 使用 -E 'pattern1.*pattern2'
grep命令本身不提供AND功能。但是,使用 -E 选项可以实现AND操作。
grep -E 'pattern1.*pattern2' filename
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
第一个例子如下:(其中两个pattern的顺序是指定的)
$ grep -E 'Dev.*Tech' employee.txt
200 Jason Developer Technology $5,500
第二个例子:(两个pattern的顺序不是固定的,可以是乱序的)
$ grep -E 'Manager.*Sales|Sales.*Manager' employee.txt