A此刻·少年

Linux高级操作指令学习

2022-02-1613 分钟 5k 次阅读
Linux高级操作指令学习

管道符 |#

命令1|命令2 将命令1的输出当作命令2的输入

xargs#

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。 xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。 xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。 xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:

find /sbin -perm +700 |ls -l       #这个命令是错误的
find /sbin -perm +700 |xargs ls -l   #这样才是正确的

nohup#

退出账户依然不会终止 格式: nohup command &

grep#

grep的一般格式 grep [选项] 基本正则表达式 [文件]

搜索文件中全部为大写字母的行

grep "^[A-Z]*" new.txt

搜索并显示前后两行

grep -B 2 -A 2 text inputfile -B before -A after

常用参数

-c 只输出匹配行的计数。 -i 不区分大小写(只适用于单字符) 。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n 显示匹配行及行号。 -s 不显示不存在或无匹配文本的错误信息。 -v 显示不包含匹配文本的所有行

awk#

使用格式 awk [-F field-separator] 'commands' input-file(s)

指定分隔符获取指定列

以符号":"作为分隔符(默认是空格)取第1,2列 awk -F: '{print $1,$2}' file

awk的默认分隔符是空格,如果需要以空格来分隔,可以不用加-F参数

使用条件操作符匹配

awk可以使用条件操作符 除了普通的==,!=,<,<=,>=等,还有~(匹配),!(不匹配) 注意:awk语句中的条件部分要用(),动作部分要用{},整体要用'' awk '{if($6/Mar/) print $0}' myfile

精确匹配== awk '$5=="96" {print $0}' myfile

使用if语句通过比较符号比较2个域的大小来做判断条件 awk '{if($5>"1024") print $9 " is more than 1M"}' myfile

awk可以使用正则表达式匹配 awk '{if($9~/^..n/) print $1,$3,$9}' myfile awk '{if($6~/(Mar|Dec)/) print $0}' myfile

awk的逻辑操作符 && and:两边必须同时为真 || OR:两边同时或者只有一边为真 ! 非:求逆 例如: awk '{if ($3=="bosstux1" && $5>="20000" ) print $0}' myfile

内置变量

awk的内置变量 ---ARGC支持命令行中传入awk脚本的参数个数.ARGV是ARGC的参数排列数组,其中每 一元素表示为ARGV[n],n为期望访问的命令行参数。 ---ENVIRON支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如 ---ENVIRON[“EDITOR”] =“Vi” 。 ---FILENAME支持awk脚本实际操作的输入文件。因为awk可以同时处理许多文件,因此如 果访问了这个变量,将告之系统目前正在浏览的实际文件。 ---FNR支持 awk目前操作的记录数。其变量值小于等于NR。如果脚本正在访问许多文件, 每一新输入文件都将重新设置此变量。 ---FS用来在awk中设置域分隔符,与命令行中 -F选项功能相同。缺省情况下为空格。如果用 逗号来作域分隔符,设置 FS = ","。 ---NF支持记录域个数,在记录被读之后再设置。 ---OFS允许指定输出域分隔符,缺省为空格。如果想设置为 #,写入OFS = " # "。 ---ORS为输出记录分隔符,缺省为新行( \ n) 。 ---RS是记录分隔符,缺省为新行 ( \ n )。 ---NR 已读的记录数

awk的内置变量都可以直接使用 例: awk 'END {print NR}' myfile (显示awk已读的记录条数) awk '{print NF,NR,$0}END{print FILENAME}' myfile 合并显示当前域个数,记录条数,以及原本的文件内容,文件名 awk '{if(NR>0 && $6=="Mar") print $0}' myfile 先判断文件中的记录数是否大于0在查找指定条件的内容

NF的其他用法 echo $PWD|awk -F/ '{print $NF}' 显示目录名 echo "/bosstux1/run/myfile"|awk -F/ '{print $NF}' 显示文件名

awk设置域别名 awk '{size=$5;filename=$9;if(size>"1000"&&filename~/bin/)print "文件" filename " 的大小是 " size "kb!"}' myfile

awk域值比较操作 直接比较或者BEGIN先给变量赋值

awk修改数值域 先确保该域的子集是数值类型,可以对起进行计算操作。但是不是修改文件本身的数值,只是修改保存在缓存中的awk副本 awk '{if($9~/bin/) $5=$5+50000;print $0}' myfile

awk修改文本域 字符串需要用双秒号"",并用圆括号括起整个语法 awk '{if($9~/bin/) ($6="Aug");print $0}' myfile

只显示修改的部分 awk '{if($9~/bin/) {$6="Aug";print $0}}' myfile

awk创建新的输出域 awk 'BEGIN{print "文件名\t某数据"}{if($3=="bosstux1"){$10=$5--$2;print $9,$10}}' myfile 可以给新增的域设置更加有意义的别名

awk统计列值 awk可以很简单统计某一列(某个域)的所有值的总和 awk '{tot+=$5} END{print "文件总大小为 " tot/1024 "MB"}' myfile

ls -ltar|awk '/^[^d]/ {print $9"\t"$5}{tot+=$5} END{print "文件总大小为 "tot/1024"MB"}' ls -ltar|awk '{if($1~/^[^d]/) print $9"\t"$5}{tot+=$5} END{print "文件总大小为 "tot/1024"MB"}'

内置的字符串函数

1,gsub(r,s,t) 在整个t中用s代替r,如果不指定t,默认是$0 awk '{gsub(/bin/,"Mar");print}' myfile 不可用

2,index(s,t) 查询字符串s中t第一次出现的位置 awk 'BEGIN{print index("sssaanya","ny")}' myfile

3,length(s) 返回字符串s的长度 awk 'BEGIN{print length("xu wangcheng")}' myfile awk '{if($9~/bin/)print length($9)" "$9 }' myfile

4,match(s,r) 测试s中是否包含匹配r的字符串 awk 'BEGIN{print match("xuwsda",/s/)}' 不可用 awk '{if($9=="tools") print match($9,/l/)}' myfile 不可用

5,split(s,a,fs) 以fs为指定分隔符将字符串s分割成一个数组a awk 'BEGIN{print split("aswd|sawa|eee",Ti,"|"),Ti[1]}'

6,sub(r,s,STR) 将STR中第一次出现的r改变为s awk 'BEGIN{print sub(/ha/,"HA",'shajhsjas')}' 不可用 awk '$9=="solib.tar" sub(/Jan/,"Dec",$0)' myfile 不可用

7,substr(s,m,n) 返回s中第m至n位的字符 awk 'BEGIN{print substr("mnjkasjjas",2,6)}' awk '{if($9=="solib.tar") print substr($5,1,4)}' myfile awk 'BEGIN{STR=="sawwwaaa"}END{print substr(STR,2)}' myfile

8,从shell中向awk传入字符串 使用管道符向awk传入字符串 echo "Family is love"|awk '{print length($0)}' 设置变量,再使用管道符向awk传入 STR="myfile" echo $STR|awk '{print substr($STR,1,3)}'

sed#

sed是非交互性文本编辑器,相对于vi而讲

主要参数

sed命令的主要参数 -n 不打印 -p 打印编辑行 -c 下一条命令是编辑命令,如果只有一条sed命令,此项无用 -f 调用sed脚本文件

将sed内容重定向输出到文件中 sed ' ' myfile>myfile_1

匹配打印行

sed -n '2p' myfile 打印第二行 sed -n '1,2p' myfile 打印第1-2行 sed -n '/ChmDecompiler/'p myfile 打印匹配到ChmDecompiler的行 sed -n '4,/ChmDecompiler/'p myfile 在第4行匹配ChmDecompiler 并打印出来 sed -n '/$/'p myfile 匹配特殊字符需要加反斜杠来转义 sed -n '1,$p' myfile 打印整个文件 sed -n '/.*ered/p' myfile 匹配以ered结尾的模式 sed -e '/.*ered/=' myfile 匹配的打印行前都添加了行号 sed -n -e '/.*ered/p' -e '/.*ered/=' myfile 只显示匹配到的打印行的行数和内容

增删改查文本

sed附加文本--------在指定位置的后面 sed '/message/a
This is a append words!' myfile>myfile_1 先匹配到有message的位置,在后面附加下面的新文本,最好重定向输出到新的文件中

sed插入文件---------在指定位置的前面 sed '3i
这是一个插入的文本!' myfile>myfile_1 在第三行前面插入新的文本内容

sed修改文本-----------指定位置行数用新文本代替 sed '3c
这是一个替换文本!' myfile>myfile_1

可以对同一个文本进行三种操作

sed删除文本--------删除指定行或删除匹配到的指定行 sed '1,2d' myfile>myfile_1 删除第一到第二行并将新文本输出到新的文件中 sed '1d' myfile>myfile_1 sed '$d' myfile>myfile_1

替换文本-----替换指定模式匹配到的文本内容 sed 's/version/VERSION/p' myfile

s/[被替换文本]/[替换文本]/[g p w n] 参数g:默认情况下只替换第一次出现的文本,加g将会全局替换 参数p:默认情况下sed将所有被替换行写入标准输出,加p将使-n选项无效。-n不打印输出结果 参数w:w 文件名 将被替换的行输出到新的文本中

可以使用替换模式删除指定文本

SED使用替换去修改字符串 sed -n 's/version/NWEBLUS &/p' myfile 作用:根据匹配模式找到需要被替换的文本,再将这段文本加到替换文本的后面来替换。这样就等于在被替换文本前面添加文本了

sed '/ message./r More.txt' myfile -----先在myfile中匹配模式,在匹配到的字符后面添加More.txt文件的全部文件

匹配后退出 模式匹配首次出现后立即退出sed以便执行其他脚本命令 sed '/message./q' myfile

sed可以显示文件中的控制字符 cat -v filename 也可以显示文件中的控制字符 sed -n '1,$l' myfile (前一个是数字1后一个是字母l)

sort#

sort可以对文本进行排序,合并,分割的操作

主要参数

-c 测试文件是否已经分类。 -m 合并两个分类文件。 -u 删除所有复制行。 -o 存储sort结果的输出文件名。 其他选项有: -b 使用域进行分类时,忽略第一个空格。 -n 指定分类是域上的数字分类。 -t 域分隔符;用非空格或 t a b键分隔域。 -r 对分类次序或比较求逆。 +n n 为域号。使用此域号开始分类。

用法示例

sort new.txt -o new1.txt 默认排序所有列并输出到另外一个文件

sort默认情况下认为空格或者一系列空格为分隔符,需要制定符号为分隔符的需加-t选项 sort -t: -r video -r为逆向分类结果

按指定域分类 sort -t: +2 video +1为按第2域分类,+0为第1域,以此类推 PS:如果是数值域就要加-n选项,如果不加,sort只会按照第一个数字是否相同而进行排序 sort -t: +3n -r video 默认的数字域排序是按从小到大排序的,排序后加-r选项可以逆向(从大到小)排序

唯一性分类 sort -u video -u选项会去掉重复行

多重分类 先按第4域分类,再按第1域分类 sort -t: -k4n -k1 -r video 同sort -t: +3n +0 -r video sort +0 -2 +3 : 以域0分类,忽略域2,再按域3分类

pos用法 sort -t: +2.1n video 第3个域的左起数第2个数字开始分类(域和字符位数都是从0开始计数的)

使用head和tail将输出分类 sort -t: +3n video|head -1 查看开头一行 sort -t: +3n video|tail -2 查看末尾二行

sort结合awk处理数据 sort -t: +3n video|tail -2|awk -F":" '{print $1,",age is "$3,",salary "$4,"in "$2}' cat /etc/passwd|sort -t: +0|awk -F: '{print $1}'>use.txt

将两个分类文件合并(一个已经分类的文件加入合并到另一个已经分类的文件中) sort -t: -m +0 video1 video (已第1域进行分类,不是必须加上+0的)

uniq#

类似与sort -u video,但是sort中为全局去重,uniq则只对连续出现的重复行有效。

uniq的参数: -u 只显示不重复行。 -d 只显示有重复数据行,每种重复行只显示其中一行 -c 打印每一重复行出现次数。 -fn 为数字,前 n个域被忽略。 一些系统不识别- f选项,这时替代使用 -n

uniq -f2 -c myfile_1 只对第2域进行测试

cut#

cut -d: -f3 pers 以:为域分割符,抽取第三域。 cut -d: -f1,3 pers 以:为域分割符,抽取第1和3域

cut -d: -f1,6 /etc/passwd

who -u|cut -c1-8 精确剪切,-c1-8 剪切第1到8个字符

split#

将大文件分割成小文件 split -5 file 每5行分割做一个小文件

分享这篇文章

相关阅读

评论0

还没有评论,来说点什么吧~

评论发布后需审核才会展示