Linux常用工具命令(regex-cut-grep-
xargs-sed-find-awk-sort)
这些内容相当丰富,难以穷尽,后续不断更新。
一:regex(正则表达式)
正则表达式是一种文本模式,包括普通字符和元字符,模式描述在搜索文本时要匹配的一个或多个字符串。regex在各种命令中的形参名称一般为:
PATTERN。
定位及转义匹配:
字符
说明
^
匹配必须从字符串或一行的开头开始
$
匹配必须出现在一行或字符串的末尾
\
将下一个字符记为特殊字符,多为转义。“\n”匹配换行符;序列“\\”匹配“\”。
\d
匹配一个数字字符,等效于[0-9]
\D
匹配一个非数字字符,等效于[^0-9]
\n
匹配换行符
\r
匹配回车符
\t
匹配一个制表符
限定匹配:
字符
说明
*
匹配前面子表达式零次或多次
+
匹配前面子表达式的一次或多次
?
匹配前面子表达式零次或一次
{n}
匹配确定的n次
{n,}
至少匹配n次
{n,m}
至少匹配n次,至多匹配m次
x|y
匹配x或y
[字符序列]
匹配字符集合,如[xyz]表示匹配[]中的xyz任意字符
[^字符序列]
反向匹配字符集合,如[^xyz]表示匹配不在[]中的xyz任意字符
[first-last]
匹配从first到last范围内的任何单个字符。如[a-z],[A-Z],[0-9]
可以使用国际模式匹配的类名:
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]]
[0-9a-zA-Z]
[[:space:]]
空格或tab
[[:alpha:]] [a-zA-Z]
二:cut命令
cut命令主要用途在于,对文本行内(处理的对象是行内的字符串信息)的数据进行分解,能以某字符作为分割参数,加以切割,来取得我们所需要的数据[列]。多用于分析log,但在处理多空格相连的数据时较麻烦。也就是说cut命令更适用于每一行具有统一的格式的文本或数据。
命令格式:cut OPTION... [FILE]...
常用参数:
用range[表示范围]
N N'th byte, character or field, counted from 1
N- from N'th
byte, character or field, to end of line
N-M from N'th to M'th (included) byte, character or field
-M from first
to M'th (included) byte, character or field
-b range 截取本行range字符
-c range 截取本行range字符
-f 用来指定经特定分隔符分割后的区域,表示取第几段的意思。举例:-f 3; -f 3,5
-d 用来指定分隔符,默认分隔符TAB。举例:-d
‘:’ ; -d ‘-’;
-d ’x’ ; -d ’空格’。
-s 忽略不包含指定分隔符的文本行。
[注意]
使用-d指定的分割符后,一般要与-f连用,取出所要的区段;
-b与-c后面必须指定range范围,构成完成的命令;
没有指定输入文件时,默认以标准input为输入。
[举例]
export | cut -c 2
export | cut -c 2-8
export | cut -c 2-
export | cut -c -2
echo $PATH | cut -d ':' -f 1
echo $PATH | cut -d ':' -f 1,4
echo $PATH | cut -d ':' -f 1,4,6
export > testcut.txt
echo "AAAAAA" >> testcut.txt
cut -s -d "-" -f 1
testcut.txt [-s会忽略掉最后加的AAAAAA行]
三:grep
grep命令是主要是分析文本行(处理的对象是文本行),它是强大的文本搜索工具,能使用多种类型的正则表达式来搜索文本,并且可以控制匹配结果的输出格式和内容等。
命令格式:grep [OPTION] ... PATTERN
[FILE]...
-c, --count 输出控制,只输出每个文件匹配行的计数;
-f,--file=FILE 指定PATTERN来自文件FILE;
-w, --word-regexp 强制全字匹配有效,比如匹配’is’,那么’this’就会被忽略;
-x, --line-regexp 整行匹配有效;
-v, --invert-match 反向匹配,获得不包含指定匹配模式的行信息;
-n, --line-number 输出时打印出匹配字段行和所在的行号;
-R, -r, --recursive 递归的去匹配文件夹下的每个文件;
-i, --ignore-case 匹配字符不区分大小写;[默认是区分大小写的]
-h, --no-filename 多文件搜索时,输出不显示文件名;
-l, --files-with-matches 多文件搜索时,输出只显示文件名;常与xargs连用;
[举例]
显示文件configre.txt中含有小写单词create的行:
grep "create" configure.txt
显示文件configre.txt中含有大写单词CREATE的行和行号[n]:
grep "CREATE" -n configure.txt
递归[r]的搜索当前目录下的所有文件和目录及子目录,打印包含CREATE的行和行号[n]:
grep "CREATE" -rn ./
递归[r]的搜索当前目录下的所有文件和目录及子目录,打印出包含独立单词[w]CREATE的行及行号[n],但是CREATE中的6个字母不区分大小写[i]:
grep "CREATE" -rnwi ./
递归[r]的搜索当前目录下的所有文件和目录及子目录,仅打印含有CREATE的文件名[l]:
grep "CREATE" -rl ./
补充1:过滤关键字
grep -v -E "key1|key2|key3"
四:xargs
xargs命令的作用是将参数列表转换成小块分段传递给其它命令,避免参数列表过长的问题。简言之,它服务于其它命令,为其它命令准备参数,xargs可以将参数列表加以处理,转换成小块分段。
典型的使用场景:常常会将A命令的输出,当做B命令的输入;大多数情况下可能A命令的输出结果不能满足B命令的格式要求;那么xargs将会对A命令的输出加以分段/处理,传递给B命令作为输入。
常用参数:
-i {}替换
ls | xargs -i mv {}
{}.bak
-n 数字,以n指定的大小进行分组
-t 先打印出命令,然后再执行
-p 交互模式
[举例]
用xargs列出前目录下的文件及文件夹,成为名称文本:
ls | xargs
用xargs列出前目录下的文件及文件夹,成为名称文本,每4个一组:
ls | xargs -n 4
name,拷贝为name.bak:
ls | xargs -i cp -rf {} {}.bak
删除当前目录及其子目录下的所有pyc文件,每20个为一组(以空格为分隔符),作为rm
-rf的参数:
find ./ -name *pyc | xargs -n 20 rm -rf
find ./ -name *pyc | xargs -n 20 rm -rf
sed是一个强大的文件处理工具,以文件的行为单位进行处理,可以将数据进行替换,删除,更新等。它是一种在线编辑器,能自动处理多个文件,它依次处理给定文件的每一行;处理时,把当前处理的行存储到临时缓冲区中;接着用sed命令处理缓冲区中的内容,完成后将缓冲区的内容发送到屏幕;原文件内容并没有改变,除非重定向输出。
命令格式: sed [OPTION]... {script-only-if-no-other-script}
[input-file]...
行表示写法:n;n,m;n,$
-n 不自动打印处理后的结果,只是默默的处理
-i 直接作用在目标文件上,不会输出结果
[举例]
删除命令:d
删除test.py文件中的第10行:
sed -e '10d' test.py
删除test.py文件中的第10至40行:
sed -e '10,40d' test.py
删除test.py文件中的第10至最后行:
sed -e '10,$d' test.py
删除test.py文件中含有django行:
sed -e '/django/'d test.py
替换命令:s
将test.py文件中的每行第一个from替换为FROM:
sed -e 's/from/FROM/' test.py
将test.py文件中的每行所有的from替换为FROM:
sed -e 's#from#FROM#g' test.py
[紧跟着s命令的都被认为是新的分隔符,此处为#]
将test.py文件中的每行所有的from替换为FROM,直接作用在原文件test.py上:
sed -i
-e 's/from/FROM/g' test.py
要在第30行以后插入一行新的内容:
sed -i '30a\AAAAAAAAAAAAA' test.py
sed -i '/AAAAAAAAAAAAA/aBBBBBBBBBBBBB' test.py
六:find命令
find命令主要的作用是在给定的搜索范围内的文件系统中,按条件查找目标文件/夹的集合。
命令格式:find pathname
-options [-print -exec -ok ...]
-name按照文件名查找文件。
-perm按照文件权限来查找文件。
-prune使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user按照文件属主来查找文件。
-type查找某一类型的文件,诸如:b
-块设备文件;d
-目录;c
-字符设备文件;p
-管道文件;l
-符号链接文件;f
-普通文件。
[举例]
查找当前目录及子目录下,所有py文件
find ./ -name *py
find ./ -name *py
-exec ls -l {} \;
为了用ls
-l命令列出所匹配到的文件,可以把ls
-l命令放在find命令的-exec选项中
find . -type f -exec ls -l {} \;
查找当前用户主目录下的所有文件:
find $HOME -print
find ~ -print
让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件
$ find . -type f -perm 644 -exec ls -l {} \;
为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
find / -type f -size 0 -exec ls -l {} \;
为了查找当前文件系统中的所有目录并排序;
find . -type d | sort
查找当前目录(不包括其子目录)下的空文件:
find -maxdepth 1 -empty
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,在其对数据分析并生成报告时,显得尤为强大。它是对文本每行切片并处理的工具。它自成语言,拥有自己的语法,编写的程序可以读取输入文件、切分文件中的每行、抽取分片并做进一步处理计算生成报表等。
命令格式:awk '{pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。Filenames为文件集合,通常awk是以文件的一行为处理单位的。
awk工作流程:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键"
或 "[tab]键"。
-F指定域分隔符,不指定默认为"空白键"
或 "[tab]键"
print $N active的一种,打印此行的第N个分片
awk常用的内置变量:
FILENAME awk浏览的文件名
FNR
浏览文件的记录数
FS
设置输入域分隔符,等价于命令行 -F选项
NF
浏览记录的域的个数
NR
已读的记录数
[举例]
常规用法:
last -n 5 | awk '{print $1}'
cat /etc/passwd |awk -F
':' '{print $1}'
awk -F ':' '{print $0}' /etc/passwd
进阶用法BEGIN-EDN:
cat /etc/passwd |awk -F
':' 'BEGIN {print
"name,shell"} {print $1","$7} END {print
"blue,/bin/nosh"}'
awk搜索,正则匹配行:
awk -F: '/root/{print $0}' /etc/passwd
awk -F: '/root/{print $3}' /etc/passwd
print与printf:
awk -F ':' '{print
"filename:" FILENAME ",linenumber:" NR ",columns:" NF
",linecontent:"$0}' /etc/passwd
find ./ -name *py -exec ls -l {} \;
[参考下文八]
find ./ -name *py -exec ls -l {} \; |
awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",
size}'
当前目录及其子目录下所有py文件的总行数:
find ./ -name *py | xargs cat {} | awk
'BEGIN{count=0} {count=count+1;print $0} END{print
count}'
find ./ -name *py | xargs cat {} | awk
'BEGIN{count=0} {count=count+1} END{print count }'
八:sort命令
准确的说sort命令处理的单位是每个切片(连续一个或一个以上字符的组合)。广义化来说,每个文件含有多行文本,而每行文本一般会被分隔符(默认为空格和tab)切开,也就是每个切片,这时可以将切片作为关键字排序,来达到对文件或文件行的排序作用。默认是按ASCII码值排序。
命令格式:sort [OPTION]...
[FILE]... 或者sort [OPTION]...
--files0-from=F
常用选项:
-b, --ignore-leading-blanks 忽略每一行的空白字符;
-c, --check 排序前,检查待排序列是否已经有序,多数情况下加上-c是无害处的;
-u, --unique 去除带排序列中重复的切片;
-r, --reverse 反转排序结果,简言之逆序;
-o, --output=FILE 重定向排序结果,可以覆盖原文件;
-n, --numeric-sort 按数值顺序排序,而非默认的ASCII码值,此参数主要针对数字排序;
-t, --field-separator=SEP 指定切片限定符,类似于cut -d命令;
-k, --key=POS1[,POS2] 选择关键字,类似于cut –f命令;
一般-t与-k参数会同时使用。
[举例]
cat seq.txt
banana
apple
pear
orange
banana
默认按ASCII码值排序:
sort seq.txt
排序中去重:
sort -u seq.txt
逆序(从大到下)排序:
sort -r number.txt
重定向排序结果到原文件:
sort -r number.txt -o number.txt
安数值排序:
sort -n number.txt
按‘:’切片,选第二个关键字按数值大小排序:
cat book.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
sort -n -k 2 -t : book.txt