for循环如何处理文本

sh/bash/dash/ksh/zsh等Shell脚本
回复
sai9924
帖子: 5
注册时间: 2010-09-08 23:26

for循环如何处理文本

#1

帖子 sai9924 » 2010-09-08 23:38

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写怎么做呢??大家帮帮忙
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: for循环如何处理文本

#2

帖子 aerofox » 2010-09-09 5:51

代码: 全选

while read r; do 
     echo "$r"
done < list.txt
看看你想干什么,也许根本不需要用 shell 循环控制。
sai9924
帖子: 5
注册时间: 2010-09-08 23:26

Re: for循环如何处理文本

#3

帖子 sai9924 » 2010-09-09 12:31

如果一定要用for应该怎么做呢??
sai9924
帖子: 5
注册时间: 2010-09-08 23:26

Re: for循环如何处理文本

#4

帖子 sai9924 » 2010-09-09 12:38

要做的是用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
这种文本的内容
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: for循环如何处理文本

#5

帖子 trigger » 2010-09-09 14:13

代码: 全选

#!/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制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: for循环如何处理文本

#6

帖子 trigger » 2010-09-09 14:29

从楼主的需求看,不需要循环
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循环如何处理文本

#7

帖子 eexpress » 2010-09-09 15:07

cat xxx|while read i; do xxxxx

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循环如何处理文本

#8

帖子 trigger » 2010-09-09 16:45

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制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: for循环如何处理文本

#9

帖子 tusooa » 2010-09-09 17:24

代码: 全选

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
上次由 tusooa 在 2010-09-09 20:08,总共编辑 1 次。

代码: 全选

] ls -ld //
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: for循环如何处理文本

#10

帖子 eexpress » 2010-09-09 18:06

不会傻到一定要用for的。

额。楼上的,如果要这样搞。咋不直接cut -d= -f 5
● 鸣学
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: for循环如何处理文本

#11

帖子 aerofox » 2010-09-10 12:34

一定要用 for 循环,那可能是在做作业。为了完全实际任务一般是“不择手段”的。
回复