当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 11 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : for循环如何处理文本
帖子发表于 : 2010-09-08 23:38 

注册: 2010-09-08 23:26
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
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写怎么做呢??大家帮帮忙


页首
 用户资料  
 
2 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 5:51 

注册: 2008-05-24 8:30
帖子: 1453
送出感谢: 2
接收感谢: 30
代码:
while read r; do
     echo "$r"
done < list.txt

看看你想干什么,也许根本不需要用 shell 循环控制。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 12:31 

注册: 2010-09-08 23:26
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
如果一定要用for应该怎么做呢??


页首
 用户资料  
 
4 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 12:38 

注册: 2010-09-08 23:26
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
要做的是用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
这种文本的内容


页首
 用户资料  
 
5 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 14:13 
头像

注册: 2006-10-25 18:08
帖子: 1582
送出感谢: 0 次
接收感谢: 0 次
代码:
#!/bin/bash
oldIFS=$IFS
IFS=$'\n'
for line in `cat list.txt`
do
echo $line
done
IFS=$oldIFS

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


_________________
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 14:29 
头像

注册: 2006-10-25 18:08
帖子: 1582
送出感谢: 0 次
接收感谢: 0 次
从楼主的需求看,不需要循环
sed 's/rhost=203.86.48.53/rip=203.86.48.53/g' list.txt


_________________
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 15:07 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
cat xxx|while read i; do xxxxx

IFS改了,麻烦的

如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl

@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;

@_里面就是失败的ip的数组了。


_________________
● 鸣学


页首
 用户资料  
 
8 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 16:45 
头像

注册: 2006-10-25 18:08
帖子: 1582
送出感谢: 0 次
接收感谢: 0 次
eexpress 写道:
cat xxx|while read i; do xxxxx

IFS改了,麻烦的

如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl

@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;

@_里面就是失败的ip的数组了。

ee活在自己的世界,人都说了,必须用for :em04


_________________
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 17:24 

注册: 2008-10-31 22:12
帖子: 6546
系统: 践兔
送出感谢: 18
接收感谢: 25
代码:
for i in $(seq "$(dog -n file | tail -n1 | sed -re 's/^\s+//' | awk '{print $1}')") ; do
read line
sed something <<< "$line"
done

可以满足lz的需求。很复杂。
其实没有必要用for


_________________
代码:
] ls -ld //


最后由 tusooa 编辑于 2010-09-09 20:08,总共编辑了 1 次

页首
 用户资料  
 
10 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-09 18:06 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
不会傻到一定要用for的。

额。楼上的,如果要这样搞。咋不直接cut -d= -f 5


_________________
● 鸣学


页首
 用户资料  
 
11 楼 
 文章标题 : Re: for循环如何处理文本
帖子发表于 : 2010-09-10 12:34 

注册: 2008-05-24 8:30
帖子: 1453
送出感谢: 2
接收感谢: 30
一定要用 for 循环,那可能是在做作业。为了完全实际任务一般是“不择手段”的。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 11 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译