Linux学习笔记-shell(2)

管道命令(pipe)

管道命令使用的是“|”,简单来说就是后一个命令的输入是前一个命令的结果
[root@Dark ~]# ls -al /etc | less

选取命令:cut,grep

cut:处理的信息以行为单位;
[root@Dark ~]# cut -d '分割字符' -f fields
[root@Dark ~]# cut -c 字符范围
参数:
-d:后面接分割字符,与-f一起使用
-f:取出第几段的意思
-c:以字符的单位取出固定的字符区间

[root@Dark ~]# echo $PATH | cut -d ':' -f 3,5
/usr/local/sbin:/sbin

[root@Dark ~]# export | cut -c 12-23

取出字符范围12-23的结果


grep

分析一行信息;
[root@Dark ~]# grep [-acinv] '查找字符串' filename
参数:
-a: 将binary文件以text文件的方式查找数据
-c: 计算找到'查找字符串'的次数
-i: 忽略大小写
-n: 顺便输出行号
-v: 反向选择

[root@Dark ~]# last | grep 'root' | wc -l

[root@Dark ~]# last | grep -v 'root'


grep常用方法:

1.查找特定字符串

[root@Dark ~]# cat oracle.sh | grep -n 'hostname'


[root@Dark ~]# grep -n '[^a]ss' /root/Desktop/oracle.sh

找出ss前面不带a的那一行;


[root@Dark ~]# grep -n '[^a-z]ss' /root/Desktop/oracle.sh

找出ss前面不带小写字符的行



[root@Dark ~]# grep -n '[0-9]' filename

找出含有数字的行


2.行首与行尾字符^$

[root@Dark ~]# grep -n '^the' oracle.sh

找出以the开头的行


[root@Dark ~]# grep -n '^$' oracle.sh

输出空白行


3.任意一个字符. 与重复字符 *

.(小数点):代表一定有一个任意字符的意思

*(星号):代表重复前一个0到无穷多次,重复前一个


[root@Dark ~]# grep -n 'g..d' oracle.sh

输出结果中  含有 good,glad 等等


[root@Dark ~]# grep -n 'oo*' hehe.txt

输出结果含有oo,ooo,ooooo等


[root@Dark ~]# grep -n 'g.*g' hehe.txt

得到以g开头,g结尾,中间为任意字符的行


sed工具

[root@Dark ~]# sed [-nefr] [动作]

参数:

-n: 使用安静模式;

-e: 直接在命令行模式上进行sed动作编辑;

-f: 直接将sed的动作写在一个文件内,-f filename则可以指向filename内的sed动作

-r: sed的动作支持是拓展型正则表达式的语法

-i: 直接修改读取的文件内容,而不是由屏幕输出


动作说明:[n1[,n2]] function

n1,n2:不见得会存在,一般代表选择进行动作的行数


function 参数:

a: 新增,a的后面可以接字符串,这些字符串会在新的一行出现

c: 替换,c后面可以接字符串,这些字符串可以替换n1,n2之间的行!

d: 删除

i: 插入,i的后面可以接字符串,

p: 打印

s:替换,可以直接进行替换的工作;可以搭配正则表达式!如: 1,20s/old/new/g


[root@Dark ~]# nl /etc/passwd | sed '2,5d'

[root@Dark ~]# cat -n /etc/passwd | sed '2,6d'
     1  root:x:0:0:root:/root:/bin/bash
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  news:x:9:13:news:/etc/news:


[root@Dark ~]# cat -n /etc/passwd | sed '2a heheda'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
heheda
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@Dark ~]# nl /etc/passwd | sed '2,5c Heheda'
     1  root:x:0:0:root:/root:/bin/bash
Heheda
     6  sync:x:5:0:sync:/sbin:/bin/sync

[root@Dark ~]# nl /etc/passwd | sed -n '2,5p'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@Dark ~]# ifconfig | grep addr | sed 's/100/LOVE/g'
eth0      Link encap:Ethernet  HWaddr 00:0C:29:76:BF:50  
          inet addr:172.16.LOVE.130  Bcast:172.16.LOVE.255  Mask:255.255.255.0
          Interrupt:83 Base address:0x2024 
          inet addr:127.0.0.1  Mask:255.0.0.0

直接修改文件内容:

sed -i 's/ONBOOT=no/ONBOOT=yes/g' /etc/sysconfig/network-scripts/ifcfg-eth0



awk:

[root@Dark ~]# awk '条件类型1{动作1} 条件类型2{动作2}...' filename

[root@Dark ~]# date | awk '{print $6 "\t" $4}'
2016    04:35:45

[root@Dark ~]# last -n 5 | awk '{print $1 "\t" $3}'
root    :0.0
root    :0.0
root    Mon
root    Mon
reboot  boot


wtmp    Fri


awk最常用的动作,是通过print的功能将字段的数据列出来




简单的Shell统计字段总数

查看请求访问量:

cat access.log | cut -d " " -f1 | sort | uniq -c | sort -k 1 -n -r | head -10


模拟生成日志java程序:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import org.apache.commons.io.FileUtils;

public class log {
	public static void main(String[] args) {
		String []IP = {"192.168.51.134","192.168.0.101","192.168.0.151","192.168.14.137","192.168.15.179","125.19.22.29","174.119.232.29","124.119.22.59"};
		String []time = {"21","43","67","599","24","740","230","154","78","95"};
		String []request = {"GET","POST"};
		String []url = {"www.baidu.com","www.xxx.com","www.douyu.tv","www.sina.com","www.wjq.com","www.panda.tv","www.zganqi.con"};
		String []status = {"200","301","302","404","500"};
		String []sendbyte = {"3344","2789","432004","490","98324","3158","47851","99641"};
		
		
		File file = new File("E:\\accesslog.txt");
		for(int i=0;i<1000000;i++)
		{
			String line = getOne(IP) + getOne(time) + getOne(request) + getOne(url) + getOne(status) + getOne(sendbyte);
			ArrayList<String> lines = new ArrayList<String>();
			lines.add(line);
			try {
				FileUtils.writeLines(file, lines,true);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static String getOne(String[] arr)
	{
		int length = arr.length;
		Random r = new Random();
		int rand = r.nextInt(length);
		return arr[rand]+" ";
	}
}













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值