for循环如何处理文本
-
- 帖子: 5
- 注册时间: 2010-09-08 23:26
for循环如何处理文本
root@linux:[/etc/shell]cat list.txt
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
大概这种内容的文本数据很长,用for循环然后做文字筛选,但是for循环后面的参数要加引号才能区分空格
#!/bin/bash
a=`cat list.txt `
for r in $a
do
# echo "`echo $r |grep 203.86.48.53 |sed 's/host/ip/'`"
echo $r
done
类似这种脚本 想对$r做文字处理,但是这样写的话把list.txt文本里的空格区作为一个参数,应该怎么做才能按照文本原样的行来处理??
sep
8
23:26:58
mx2
sshd(pam_unix)[23164]:
authentication
failure;
logname=
uid=0
euid=0
tty=ssh
ruser=
rhost=203.86.48.53
Sep
8
23:27:00
mx2
sshd(pam_unix)[23169]:
check
pass;
user
unknown
Sep
8
运行脚本的结果是这样的。都用空格区分了,文本太长又不能贴在变量里用“”,老大指示了必须用for写怎么做呢??大家帮帮忙
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
大概这种内容的文本数据很长,用for循环然后做文字筛选,但是for循环后面的参数要加引号才能区分空格
#!/bin/bash
a=`cat list.txt `
for r in $a
do
# echo "`echo $r |grep 203.86.48.53 |sed 's/host/ip/'`"
echo $r
done
类似这种脚本 想对$r做文字处理,但是这样写的话把list.txt文本里的空格区作为一个参数,应该怎么做才能按照文本原样的行来处理??
sep
8
23:26:58
mx2
sshd(pam_unix)[23164]:
authentication
failure;
logname=
uid=0
euid=0
tty=ssh
ruser=
rhost=203.86.48.53
Sep
8
23:27:00
mx2
sshd(pam_unix)[23169]:
check
pass;
user
unknown
Sep
8
运行脚本的结果是这样的。都用空格区分了,文本太长又不能贴在变量里用“”,老大指示了必须用for写怎么做呢??大家帮帮忙
-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: for循环如何处理文本
代码: 全选
while read r; do
echo "$r"
done < list.txt
-
- 帖子: 5
- 注册时间: 2010-09-08 23:26
Re: for循环如何处理文本
如果一定要用for应该怎么做呢??
-
- 帖子: 5
- 注册时间: 2010-09-08 23:26
Re: for循环如何处理文本
要做的是用for筛选处理文本每一行的内容,然后显示处理后每一行的结果。
但是文本中有空格,无法把一整行进行处理,应该怎么用for做??
for r in "文本内容第一行" "文本内容第二行" ................................
do
echo "`echo $r | sed这里对文本做筛选`"
done
就是这样对每行做相同的删选,我知道其他的方法也能做,但现在必须要用for做,把文本放在for r in list.txt这地方文本的空格默认就认为一个变量了,无法提取完整的一行
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
这种文本的内容
但是文本中有空格,无法把一整行进行处理,应该怎么用for做??
for r in "文本内容第一行" "文本内容第二行" ................................
do
echo "`echo $r | sed这里对文本做筛选`"
done
就是这样对每行做相同的删选,我知道其他的方法也能做,但现在必须要用for做,把文本放在for r in list.txt这地方文本的空格默认就认为一个变量了,无法提取完整的一行
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
这种文本的内容
- trigger
- 帖子: 1604
- 注册时间: 2006-10-25 18:08
Re: for循环如何处理文本
代码: 全选
#!/bin/bash
oldIFS=$IFS
IFS=$'\n'
for line in `cat list.txt`
do
echo $line
done
IFS=$oldIFS
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
- trigger
- 帖子: 1604
- 注册时间: 2006-10-25 18:08
Re: for循环如何处理文本
从楼主的需求看,不需要循环
sed 's/rhost=203.86.48.53/rip=203.86.48.53/g' list.txt
sed 's/rhost=203.86.48.53/rip=203.86.48.53/g' list.txt
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
Re: for循环如何处理文本
cat xxx|while read i; do xxxxx
IFS改了,麻烦的
如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl
@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;
@_里面就是失败的ip的数组了。
IFS改了,麻烦的
如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl
@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;
@_里面就是失败的ip的数组了。
● 鸣学
- trigger
- 帖子: 1604
- 注册时间: 2006-10-25 18:08
Re: for循环如何处理文本
ee活在自己的世界,人都说了,必须用foreexpress 写了:cat xxx|while read i; do xxxxx
IFS改了,麻烦的
如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl
@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;
@_里面就是失败的ip的数组了。

楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
-
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
- 联系:
Re: for循环如何处理文本
代码: 全选
for i in $(seq "$(dog -n file | tail -n1 | sed -re 's/^\s+//' | awk '{print $1}')") ; do
read line
sed something <<< "$line"
done
其实没有必要用for
上次由 tusooa 在 2010-09-09 20:08,总共编辑 1 次。
代码: 全选
] ls -ld //
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: for循环如何处理文本
一定要用 for 循环,那可能是在做作业。为了完全实际任务一般是“不择手段”的。