原创

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行分割做一个小文件

正文到此结束