Compare Output of Command and Match to CSV List or File
The following script provides a method for scanning the output of a command, matching it in another list, and performing an action. The example script, install.sh, shown is using the lsusb command to scan USB devices inserted against the known-devices.csv file and perform an action. Here’s how it looks in motion:
./install.sh * This script will automatically determine the wireless * adapter and install the appropriate drivers. Detected: Asus WL-167g Running Script in 3rd Field of CSV... OKAY!
Scripting language is pretty much self-documenting so I won’t bother explaining too much. If you have questions or suggestions, please let me know. The following script is flexible and can be used in many different situations so I encourage you to customize it to fit your needs. Enjoy!
install.sh: The main script that is ran to try and match the output of the lsusb command with another files list and act accordingly.
#!/bin/sh
# Create tmp files for verification along the way
touch tmp
touch tmp2
echo
echo "* This script will automatically determine the wireless"
echo "* adapter and install the appropriate drivers."
echo
# Run lsusb and grab only the prod/vend id field
lsusb | cut -d' ' -f 6 | while read line
do
# Use grep to search for $line of lsusb output in known-devices.csv file and save to tmp
grep "$line" known-devices.csv > tmp
if [ $? = 0 ]; then
echo -n "Detected: "
# Use awk to print only field 2 of the tmp file (also field 2 of known-devices.csv)
awk 'BEGIN{FS=",";}
{
{print $2}
}' < tmp
# Prepare and execute the third field of the known-devices.csv file
echo -n "Running Script in 3rd Field of CSV... "
cut -d',' -f 3 tmp > tmp2
chmod +x tmp2
./tmp2
fi
done
# Check the tmp2 file and see if it is empty. If so, display error.
if [ `ls -l tmp2 | awk '{print $5}'` -eq 0 ]
then
echo "No known devices found."
fi
known-devices.csv: The comma separated file in which the install.sh uses to check against. In this particular example, the prod/vend usb ID is the first field, the friendly name is in the second field, and the installation command is in the third field.
USB ID | USB NAME | DRIVER INSTALL COMMAND(S) | -------------------------------------------------------------------------------- 0ace:1215, IOGear GWU523, lib/zd1211/zd1211rw_install.sh 0b05:1723, Asus WL-167g , lib/rt73/rt73_install.sh
rt73_install.sh: This is the script that is called by the known-devices.csv file above. If there was a simple one-line command, you could specify it in the third field of the known-devices.csv file.
#!/bin/sh
insmod rt73.ko > /dev/null 2> /dev/null
if [ $? -eq 0 ] ; then
echo "OKAY!"
(
# These are optional permanent install commands that will be ran upon
# successful completion of previous command.
mkdir -p lib/modules/`uname -r`/kernel/drivers/net/wireless/rt73/
cp rt73.ko lib/modules/`uname -r`/kernel/drivers/net/wireless/rt73/rt73.ko
) > /dev/null 2> /dev/null
else
echo "FAILED!"
echo -n "Error: Driver already installed, wasn't found, or failed to insert."
echo "Check 'lsmod' and 'dmesg' for debugging information."
exit
fi
Feel free to donate if this post prevented any headaches! Another way to show your appreciation is to take a gander at these relative ads that you may be interested in:
Here are some similar posts that you may be interested in:
There's 0 Comment So Far
Share your thoughts, leave a comment!