Visit Our UNIX and Linux User Community


combine 2 lines (command & echo)


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers combine 2 lines (command & echo)
# 8  
Old 10-05-2001
If you'd like, I can take it line by line... so you can see why it works the way it does... Just let me know.
# 9  
Old 10-05-2001
you'd do that?
thanks so much buddy!

you unix people are the best! Smilie
-primal
# 10  
Old 10-05-2001
Hey, no problem! I'll add lots and lots of comments, so you can "read along" with the code...

Code:
#!/bin/sh
# The first thing I usually do in a script is define "functions"
# A function (like the one below) takes the form of
# function_name () {
# The Commands You Want Inside
# }
# Then you can just call the function_name to execute it!
# I like functions, even short ones like this, because
# it makes my "if" statements small and easy to read...
use_msg () {
echo "Usage:  `basename $0` [name]"
}
# Below is some very basic sanity checking.
# Basically, what it says, is "if there isn't exactly one argument,
# print the use_msg, then exit with errors"
# the "$#" operator counts the number of arguments. "-ne"
# Stands for "not equal".
if [ "$#" -ne "1" ] ; then
        use_msg
        exit 2
fi
# Okay, so we made it this far, lets try to extract the real name
# from the passwd file. So we're searching passwd for a
# line beginning with (^) the user id (${1}). I put curly
# braces around some of my variables to help myself keep
# it seperate from the rest. You probably don't even really need
# it here. Also, make sure you are using backticks instead of
# single quotes! The backtick key is usually found near the top
# left of your keyboard, under the Esc key
name_t=`grep ^${1} /etc/passwd | cut -d: -f5 | cut -d, -f1`
#OK, if we can't extract the real name of the user, the variable
# $name_t will be empty. If that's the case, lets use the UserID
# instead. Otherwise, use the name. It'll make the script look
# nicer later on
if [ "$name_t" = "" ] ; then
        name="$1"
else
        name="$name_t"
fi
# Here's your trick to see if the user exists:
who | grep $1 >/dev/null 2>&1
# Now watch what we're doing with the "logg" variable. If the
# user above command is successful ( exited with 0 status),
# then make the "logg" var empty. If the command did not 
# succeed (e.g. the user isn't logged in), then make logg equal
# to "not ". The space on the end is important, once again to
# make the output readable. Try it without the space, and
# see what happens.
if [ "$?" = "0" ] ; then
        logg=""
else
        logg="not "
fi
# Alrighty! This is the fruits of your labor! You echo out the
# name, which we defined above (it'll either be the full name,
# or the usedid you gave it on the command line, remember?),
# then you'll see what happens with the logg var. Remember,
# since it's empty when the user is logged it, the string will say
# "is logged in". If the user is not logged in, it will insert
# "not", then a space to say "is not logged in". The curly braces
# are needed right here to keep $logg from looking like
# $logglogged, which the shell will not understand.
echo "${name} is ${logg}logged in"

Seriously though - the best experience is to run this script, then make some changes, to "get a feel" for how the different items interact. So experiment, play, improve, and have fun!

Please don't hesitate to post back with any other questions. It may make sense to me, but not to you. Or vice-versa.
# 11  
Old 10-05-2001
Hi,

In answer to your original question, another way to do it is :

instead of:
Code:
grep $1 /etc/passwd | cut -f 5, -d : 
echo is logged on

use:
Code:
echo `grep $1 /etc/passwd | cut -f 5, -d : ` is logged on

putting `` around a command means it will run first and be replaced by the output.
# 12  
Old 10-05-2001
ghoti,
tried that, didnt work Smilie i have tried that code before (found it on the net) i also tried piping it into echo, didnt work (hey im a rookie, im trying anything lol)

livinfree,
wow, thanks so much. ill read over your message and see if i can make heads or tails of the code. just scanning throught it, i noticed something.... why did you double cut?

name_t=`grep ^${1} /etc/passwd | cut -d: -f5 | cut -d, -f1`

oh and the 2>&1 is?

who | grep $1 >/dev/null 2>&1

thanks! im gonna read some more.
-primal
# 13  
Old 10-05-2001
it works!

hey everyone,
thanks for all your help. i got it working! Smilie
i installed UWIN on my system and run the program there, it worked. so i tried it on the AIX system, and it worked too!


this is what i used:
Code:
#!/bin/sh

if [ $# != "1" ]
  then
     echo "Usage: $0 [login name]"
     exit 2
fi

who | grep $1 > /dev/null

if [ $? = "0" ]
then
   echo Yes `grep $1 /etc/passwd | cut -f5 -d:` is logged on
   exit 0
else
   echo No `grep $1 /etc/passwd | cut -f5 -d:` is not logged on
   exit 1
fi

Livinfree, thanks for your script. i pretty much understood it all except for those 2 questions in the earlier post. ill work on adding the using UserID if user doesnt exist into my script. that was a good idea.

thanks once again!!
-primal
# 14  
Old 10-09-2001
Quote:
Originally posted by primal
why did you double cut?

name_t=`grep ^${1} /etc/passwd | cut -d: -f5 | cut -d, -f1`

The reason I did that, was that some of the GECOS fields in my test passwd file are comma delimited. If the User's name is the only information that field is simply -
:Full Name:
In the case that It contains phone number, office number, so on, it looks like this -
:Full Name, Room Number, Work Phone, Home Phone:
I wanted to make sure that if more than one part of the field existed, we only grab the full name.

oh and the 2>&1 is?
who | grep $1 >/dev/null 2>&1

Oops, forgot to explain that. "2" is the file desciptor for "stderr", which is the standard error output. "1" is the descriptor for stdout, standard output. Some times you need to do something with both of them, to keep any output from showing up on your screen. What 2>&1 does, is sends stderr into stdout, so it will follow wherever you're sending the output, whether it's into /dev/null, or into a log file.

I may not be too helpful in explaining it here, but in this case, you probably don't really need it in this case. It's just one of those things I do out of habit...


thanks! im gonna read some more.
-primal

Hey, any time!
 

Previous Thread | Next Thread
Test Your Knowledge in Computers #171
Difficulty: Medium
IBM acquired Red Hat for $34 billion USD.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk to remove lines that do not start with digit and combine line or lines

I have been searching and trying to come up with an awk that will perform the following on a converted text file (original is a pdf). 1. Since the first two lines are (begin with) text they are removed 2. if $1 is a number then all text is merged (combined) into one line until the next... (3 Replies)
Discussion started by: cmccabe
3 Replies

2. Shell Programming and Scripting

awk to combine lines if fields match in lines

In the awk below, what I am attempting to do is check each line in the tab-delimeted input, which has ~20 lines in it, for a keyword SVTYPE=Fusion. If the keyword is found I am splitting $3 using the . (dot) and reading the portion before and after the dot in an array a. If it does have that... (12 Replies)
Discussion started by: cmccabe
12 Replies

3. Shell Programming and Scripting

How to combine 2 files and output the unique & difference?

Hi Guys, I have two input files and I want to combine them and get the unique values and differences and put them into one file. See below desired output file. Inputfile1: 1111111 2222222 3333333 7860068 7860069 7860071 7860072 Inputfile2: 4444444 (4 Replies)
Discussion started by: pinpe
4 Replies

4. Shell Programming and Scripting

How to combine lines?

Hi, I have a file like this: "sdfc@abc.com","arovls","some addr ", "more stuff" "ssss@email.com","arovls","some addr", "sss" "edx@email.com","arovls","some addr", "sssdfvv" "ssss@a55.com","arovls","some addr", "lsdsdgf" "ssss@0234.com","aro vls","123 Main", "lSdfv" I want to... (4 Replies)
Discussion started by: erniel
4 Replies

5. Shell Programming and Scripting

Perl: combine Backtick & system() I/O operation?

Hi - Within perl I want to execute a system command. I want to re-direct all the output from the command to a file (@result = `$cmd`;), but I ALSO want the results to be displayed on the screen (system("$cmd"); The reason is this - if the command completes, I want to process the output. If the... (6 Replies)
Discussion started by: jeffw_00
6 Replies

6. Shell Programming and Scripting

Append && echo "success" to all commands

I am learning to build from SVN and other tools, with a lot of copying and pasting from forums. I like to append && echo "success" to all commands so that I can see at a glance if things went all right. Is there a way that I can have the bash shell append this to all commands? Thanks! (5 Replies)
Discussion started by: dotancohen
5 Replies

7. Shell Programming and Scripting

combine two perl lines into a single perl command

Hi Everyone, i have a string 00:44:40 so: $tmp=~ s/://gi; $tmp=~s/({2})({2})({2})/$1*3600+$2*60+$3/e; the output is 2680. Any way to combine this two lines into a single line? Thanks (4 Replies)
Discussion started by: jimmy_y
4 Replies

8. Shell Programming and Scripting

combine 2 lines

Moderator, kindly delete this thread because I already found what I needed... thanks. (0 Replies)
Discussion started by: Deanne
0 Replies

9. What is on Your Mind?

[[ $(date +%Y) == 2007 ]] && echo "Happy New Year"

Same as the Title! :) (2 Replies)
Discussion started by: ripat
2 Replies

10. UNIX for Dummies Questions & Answers

Combine two lines

Hi I have a file with the records 1 A B C D 2 E F G H 3 I J K L 4 M N O P In the ouput I want 1 A B C D 2 # F G H 3 I J K L 4 M N O P How to achieve this? (10 Replies)
Discussion started by: superprg
10 Replies

Featured Tech Videos