Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4467715
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2010-09-17 12:10:31

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 \;

阅读(1301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~