linux的文本工具操作
一、输入输出重定向
####1、输出重定向:
ss -nltp > 1.txt #替换
ss -nltp >> 1.txt # 追加
####2、输入重定向:
wc -l 1.txt # output:行数 文件名
wc -l < 1.txt # output:行数
wc < 1.txt > 2.txt # 同时替换输入输出,从1.txt文件中读取,结果集输出到2.txt文件中,输入和输出不可以是同一个文件
wc 1.txt > 2.txt # 同时替换输入输出,从1.txt文件中读取,结果集包含源文件名
echo 'aaaa' > /dev/null #输出丢弃
echo 'bbbb' > /dev/null 2>&1 #屏蔽stdout和stderr,0是标准输入STDIN,1是标准输出STDOUT,2是标准错误输出
sh 1.txt > 3.txt 2>&1 #将stdout和stderr合并后重定向(覆盖)到file
sh 1.txt >> 3.txt 2>&1 #将stdout和stderr合并后重定向(追加)到file
3、example
#!/bin/bash
# author:761071654@qq.com
cat << EOF
您好,
再见。
www.baidu,com
EOF
二、awk文本查找
1、行匹配(语句只能用单引号,但是里面的逻辑判断可以用双引号进行比较)
netstat -nltp|awk '{print $4,$5,$6}' #以空格或者Tab为分割,打印4,5,6列
netstat -nltp|awk -va=1 '{print $2+a,$5,$6}' # 设置变量
ss -nltp|awk -F: '{print $2,$3}' # 指定分隔符
ss -nltp|awk -F: '$2>1 {print $2,$3}' # awk脚本
2、原料
4.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
A、用例
awk '/Tom/' 4.txt # 输出包含Tom的行
awk 'BEGIN{IGNORECASE=1} /ja/' 4.txt # 忽略大小写
awk '$2 ~ /23/ {print $2,$4}' 4.txt # 输出第二列包含23,并打印第二列和第四列
awk '$1 !~ /ik/ {print $1,$2}' 4.txt # 模位取反
awk '$1 ! /ik/ {print $1,$2}' 4.txt # 模位取反
3、awk脚本
#!/bin/awk -f
#运行前
BEGIN {
math = 0
english = 0
computer = 0
printf "姓名 编号 数学 英语 微机 小计\n"
printf "--------------------------------------------\n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n",$1,$2,$3,$4,$5,$3+$4+$5
}
#运行后
END {
printf "--------------------------------------------\n"
printf " 小计:%10d %8d %8d \n",math,english,computer
printf " 总计:%10.2f %8.2f %8.2f \n",math/NR,english/NR,computer/NR # NR行号,从1开始
}
A、运行
awk -f 5.awk 4.txt
4、其他的一些运用
awk 'BEGIN {print "hello,world"}'
ls -l *.txt |awk '{sum+=$5} END {print sum}' # 计算文件大小
awk 'length<100' 2.txt # 找出文件中长度小于100的行
三、seq序列化输出
以指定增量从首数开始打印数字到尾数
-f 使用printf样式的浮点格式
-s 使用指定分隔符分割数字
-w 在列前添加0,使得宽度相同,即默认自动补位
–help
-version
seq [尾数]
seq [首数 尾数]
seq [首数 增量 尾数]
seq -s '#' 5 #1#2#3#4#5
seq -s ' ' 1 2 10 #输出10之内的奇数
seq 1 4 | xargs -I{} echo {} > 3.txt # 间隔输出,且写入文件,默认分隔符为\n
seq -w 1 10 # 默认补位操作,前置不足补零
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%d*%d=%d%s",i,NR,i*NR,i==NR?"\n":"\t")}' # 九九乘法表
# -v=用户自定义变量 RS=记录分隔符,默认换行
四、sed
利用脚本来处理文件,编辑一个或多个文件,简化对文件的反复操作,编写转换程序.
sed [-hnv][-e script][-f<script>][文本文件]
- 参数说明:
- -e<script>或--explession=<script>以选项中指定的脚本来处理输入的文本文件
- -f<script文件>或-file=<script文件>以选项中指定的脚本文件来处理输入的文本文件
- -h帮助信息
- -n或--quit或--slient仅显示script处理后的脚本
- -V或--version显示版本信息
- 动作说明
- a:新增,a的后面可以接字串,而这些子串会在下一行出现;
- c:取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行;
- d:删除,一般d后面不接任何参数
- i:插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p:打印,亦或将某个选择的数据印出,通常p会与参数sed -n 一起使用
- s:取代,可以直接进行工作取代,通常s需要配合正则表达式使用,例如1,20s/old/new/g
1、实例
A、原料5.txt
Hello,LINUX!
Linux is a free unix-type operating system.
this is linux testfile.
Linux test.
B、使用
i、终端输出
sed -e 4a\newline 5.txt # 在第四行的后面追加一行,并将结果输出到标准输出
sed -e 3 a \newline\newline2 5.txt #在第三行后面追加了两行
sed -e '3a\newline\newline2\n' 5.txt #第三行后面追加两行字串,一行空行
sed -e '1a\ ' 5.txt # 第一行后面加空行
sed '4 a \\' 5.txt # 第四行下面插入一个完全为空的行
sed '4 a \\n' 5.txt # 第四行下面插入两个完全为空的行
sed '4 a \\n\n' 5.txt # 第四行下面插入三个完全为空的行
nl /etc/passwd # 列印行号输出
nl /etc/passwd | sed '2,5d' # 内容列印行号输出,并删除2行~5行
nl /etc/passwd | sed '2d' # 只删除2行
nl /etc/passwd | sed '6,$d' 删除6行~最后一行
nl /etc/passwd | sed '2a drink tea' #在第二行下面追加字串
nl /etc/passwd | sed '2i drink tea' #在第二行上面插入字串
nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer?' # 第二行下面追加多行
nl /etc/passwd | sed '2,5c 大家好,我是法外狂徒张三' # 将第二行~第五行替换成字串
nl /etc/passwd | sed '1,3p' # 仅列出1~3行
nl /etc/passwd | sed '/root/p' # 搜索有关root关键词的行,如果找到,除了输出匹配行,还输出所有行
nl /etc/passwd | sed -n '/root/p' # 输出字包含模版的行
nl /etc/passwd | sed '/root/d' # 删除所有包含root的行,其他行输出
nl /etc/passwd | sed -n '/root/{s/bash/张三警告/;p;q}' # 找到root对应的行,执行后面花括号中的一组命令,这里把'bash'替换成'张三警告'并输出
/sbin/ifconfig eth0 |grep 'inet' | sed 's/^.*inet//g' # 查看网卡信息,筛选出包含inet的行,并将inet替换为空输出
/sbin/ifconfig eth0 | grep 'netmask' | sed 's/^.*inet//g' | sed 's/netmask.*$//g' # 筛选出ipv4地址
nl /etc/passwd | sed -e '3,$d' -e 's/bash/基础/' # 删除第三行~末尾的数据,并把base替换成基础
ii、文件修改
sed -i 's/\.$/\?/g' 5.txt 每一行结尾为.的换成?
sed -i '$a # 这就是张三' 5.txt # 直接在最后一行追加 '# 这就是张三',由于$代表的是最后一行,而a代表的动作是新增,因此该文件最后追加字串。
iii.linux的进程
Ossim接口阻塞的问题
lsof -i:40011
supervisorctl restart api