1.显示文件2.txt里有,而1.txt里没有的:
awk 'NR==FNR{a[$0]++} NR>FNR && !a[$0]' 1.txt 2.txt
2.删除3.txt中空白行,以#开头的行,以4位数字结尾的行:
sed '/^[# \t]\|^$/d; /[0-9]\{4\}$/d' 3.txt
3.把输出流一行一行的处理:
STDOUT | while read line
do
done
如果一行中只有两个变量,想分别取得这两个变量,可以
STDOUT | while read num1 num2
4.如果shell中的循环用到了管道,比如“STDOUT | while read line”,这样就会fork一个子进程,exit无法退出脚本,只能退出循环:
可以设置一个退出状态,比如“exit 7”,在循环结束后判断子进程的退出状态
[ $? -eq 7 ] && exit
5.在文件4.txt的第二行末尾加入Tab和当前时间:
sed -i '2,2s/$/\t$((`date +%s`))' 4.txt
6.多网络接口的环境得到本机IP接口列表:
/sbin/ifconfig | awk -F: '/inet addr/ && !/127.0.0.1/ {print $2}' | awk '{print $1}'
7.变量自加,自减:
((x++)) ((x+=1)) let x=x+1
((x--)) ((x-=1)) let x=x-1
8.把文件中相同的行合并,并且输出重复的次数:
awk '{a[$1]++}; END{for(i in a){print i,a[i]}}'
9.sed和awk使用shell变量
sed:把sed最外层的单引号改双引号就行
awk最简单一种:
line=xxx ; awk '$1=="'$line'"{print $0}'
awk本身需要将模式和动作部分用单引号引用,所以里面引用shell变量时双引号+单引号,双引号保证正确处理变量值的空格。
10.
grep -a -B 50 -A 60 'some string in the file' /dev/sda1 > result.txt
说明:
- 关于grep的-a意为–binary-files=text,也就是把二进制文件当作文本文件。
- -B和-A的选项就是这段字符串之前几行和之后几行。
- /dev/sda1,就是硬盘设备,
- Unix把所有的设备都当做文件
11.建立多层多个目录
mkdir -p sub/{1/{11,12,13},2/{21,22,23},3/{31.32,33}}
tree sub
12.在含有'stdlib'的行的前面加入一行'#include '
sed -i '/stdlib/ i #include ' arpreply.c
如果是在这一行之后则把命令中的'i'改成'a'即可
13.字符串转换成命令:
eval 'echo hello'
14.去掉字符串开头/结尾一位:
利用对字符串删除的方法(从开头删除"#",从结尾删除"%")和通配符'?' 来完成。
str=12345
echo ${str#?} 得到'2345'
echo ${str%?} 得到'1234'
15.得到文件精确时间
ls -l --time-style=+"%s" *
或者: ls -l --time-style=+"%Y%m%d%H%M%S" *
16.进行运算
echo `expr $a + $b`
$[$a+$b]
17.删除时argument list too long
find . -type f -name 'spam-*' | xargs rm
find . -type f -name 'spam-*' -exec rm {} \;
find . -type f -name 'spam-*' -exec rm {} ;
ls | grep spam- | xargs rm [这个只能处理当前目录,因为grep出来没有dirname]
或者用shell in `ls` 一个个删除,或者按文件名字母分批删除
mv命令可以参考:find . -type f -name 'spam-*' -exec mv {} $dir \;
阅读(1330) | 评论(0) | 转发(0) |